Zpět na domů

Zig pro síťové démony: zkušenosti s MTProto a AI

Článek rozebírá použití Zig ve vysoce zatíženém MTProto-proxy a edge AI infrastruktuře. Popsána architektura s epoll sloty, comptime pro TLS, vtable dispatch. Srovnání s C a Rust podle paměti, chyb, sestavení.

Zig proti Rust: proxy a edge AI bez alokací
Advertisement 728x90

Zig ve vysoce zatížených síťových službách: zkušenosti z reálných projektů

Ve vysoce výkonných síťových službách a edge aplikacích Zig ukazuje výhody explicitní kontroly paměti a minimalistické architektury. Dva projekty — MTProxy a infrastruktura AI agentů — ukazují, jak jazyk zvládá zero-allocation parsování, bitové operace a přísné limity RAM bez kompromisů v bezpečnosti C nebo rigiditě Rustu.

MTProto.zig maskuje provoz jako HTTPS pro obcházení DPI. Nullclaw balí AI zásobník do binárky pro zařízení s 32 MB RAM, podporující horkou výměnu poskytovatelů.

Porovnání jazyků podle klíčových aspektů

| Kritérium | C | Rust | Zig |

Google AdInline article slot

|-------------------|----------------------------|-----------------------------------|----------------------------------|

| Paměť | Neimplicitní, malloc uvnitř knihoven | Neimplicitní, globální alokátor | Explicitní, alokátor jako argument |

| Vícevláknovost | Pthreads, ruční synchronizace | Send/Sync, Borrow Checker | Atomické operace, odpovědnost na kódu |

Google AdInline article slot

| Chyby | Návratové kódy, errno | Result<T, E>, ? | !T, catch, errdefer |

| Metakód | Makra preprocesoru | Procedurální makra | comptime |

| Sestavení | CMake, Makefiles | Cargo | build.zig, LLVM z krabice |

Google AdInline article slot

Explicitní správa paměti v Zig vylučuje skryté alokace, což je kritické pro event loop na epoll.

Architektura MTProto.zig: zero-allocation a sloty

Server používá jednovláknový event loop bez vláken na připojení. Místo alokací na každého klienta — předem alokovaný pool slotů:

  • Start: alokujeme pole slotů ve statické paměti.
  • Nový klient: vezmeme volný slot O(1).
  • Čtení: asynchronně přes epoll.
  • Odpojení: resetujeme stav slotu.

Toto zabraňuje fragmentaci haldy a OOM při dlouhožijících idle soketech. V Rustu by vlákna s 256 KB zásobníkem rychle vyčerpala RAM.

Klasický přístup s vlákny a malloc vede k alokacím v horké cestě. Zig stavové stroje zajišťují předvídatelnost.

Problémy s logováním a optimalizace

Výchozí logger Zig blokuje event loop systémovými voláními write při zátěži. Stovky log.debug od připojení způsobily kaskádové selhání.

Řešení: Profil ReleaseFast ignoruje debug logy ve fázi kompilace. Logování je přesunuto z horké cesty.

Dynamická dispečerizace v Nullclaw

Pro výměnu AI poskytovatelů za běhu se používá vtable, podobná Linux kernelu:

const AiProvider = struct {
    ptr: *anyopaque, // Surový ukazatel na stav
    vtable: const VTable,

    pub const VTable = struct {
        generate_response: *const fn(ptr: *anyopaque, prompt: []const u8) anyerror![]const u8,
        deinit: *const fn(ptr: *anyopaque) void,
    };

    pub fn ask(self: AiProvider, prompt: []const u8) ![]const u8 {
        return self.vtable.generate_response(self.ptr, prompt);
    }
};

To poskytuje volání bez fat-pointer, cold start za 2 ms. V Rustu by dyn Trait + Arc<Mutex<Box<dyn Provider>>> + Tokio nafouklo binárku.

Comptime pro falešný TLS

Generování falešného TLS 1.3 ServerHello probíhá ve fázi kompilace:

const NGINX_HELLO_BYTES = comptime blk: {
    var template: [128]u8 = undefined;
    fillFakeTlsExtensions(&template);
    std.debug.assert(template.len == EXPECTED_TLS_SIZE);
    break :blk template;
};

Pole bajtů je vloženo do .rodata. Runtime opravuje pouze sezení data bez alokací. V Rustu by byly potřeba proceduralní makra.

Co je důležité

  • Explicitní paměť: Žádné skryté alokace, ideální pro zero-copy parsování a edge zařízení.
  • Comptime: Metaprogramování jako běžný kód, generuje platné struktury paketů při sestavení.
  • Minimalismus: Binárky bez runtime, cold start <3 ms, RAM limity jsou dodrženy.
  • Vtable-dispečer: Pluginová architektura bez overhead Rust traitů.
  • Epoll + sloty: Škálovatelnost bez vláken, O(1) na připojení.

Závěrečná doporučení

Zig nahrazuje C v nízkourovňových daemonech s přísnými požadavky na paměť a výkon. Pro složité backendy s týmy zůstává Rust volbou díky compile-time kontrolám. Ekosystém Zig se vyvíjí, ale vyžaduje opatrnost se závislostmi.

— Editorial Team

Advertisement 728x90

Číst dál