Lingue disponibili:

Fiber: Prestazioni al di sopra della “purezza idiomatica”

Questo post è stato originariamente scritto in inglese. La traduzione potrebbe non riflettere il 100% delle idee originali dell'autore.

Già sento i puristi di Go affilare i loro forconi. “Usa la libreria standard,” intonano. “I framework sono un anti-pattern,” urlano.

Non mi interessa.

Non sto usando Fiber perché sono pigro. Non lo sto usando perché assomiglia a Express.js. Lo sto usando perché ho una dipendenza patologica dalla velocità, e net/http, benedetto il suo cuore sicuro e compatibile, è semplicemente troppo educato per la violenza che voglio infliggere alla mia CPU.

Il collo di bottiglia “Standard”

La libreria standard di Go è fantastica. È robusta. È compatibile con HTTP/2. Ma è anche progettata per essere “sicura” e generica. Alloca memoria come se fosse gratis. Ogni richiesta crea nuovi oggetti, nuovi buffer, generando lavoro per il Garbage Collector.

Nel mio mondo, il Garbage Collector è il nemico. Ogni millisecondo che la CPU spende a ripulire il tuo disordine è un millisecondo in cui non sta servendo una richiesta.

Entra in scena Fasthttp

Fiber non è solo un wrapper, è un’implementazione di fasthttp.

Per chi non lo sapesse, fasthttp è il cugino ribelle di net/http. Barare. Usa pool di worker. Riutilizza oggetti in modo aggressivo. Esegue zero allocazioni di memoria nei percorsi critici.

Essenzialmente dice al Garbage Collector di prendersi una pausa caffè perché non c’è niente da pulire.

Infrange alcune conformità per casi limite di HTTP? Sì. Usa puntatori unsafe? Assolutamente. Gestisce 10 volte più richieste al secondo della libreria standard? Scommetti di sì.

Zero Allocazione è Re

Guardate questo. Non si tratta di zucchero sintattico, si tratta di efficienza grezza.

app.Get("/", func(c *fiber.Ctx) error {
    return c.SendString("Hello, World!")
})

Quando questo handler viene eseguito, Fiber non alloca una nuova stringa sull’heap se non è necessario. Riutilizza il contesto. Affetta array di byte esistenti. Tratta la memoria come una risorsa scarsa, non come un buffet infinito.

Quindi…

…sono un uomo semplice. Vedo la barra di un grafico di benchmark salire e il mio cervello rilascia dopamina.

Se state costruendo un’API bancaria che deve supportare ogni oscuro header HTTP definito nel 1999, usate net/http. Ma se volete saturare la vostra scheda di rete prima che la vostra CPU si svegli, smettete di preoccuparvi di essere “idiomatici” e iniziate a preoccuparvi del throughput.

I bit consumano energia. Usare più cicli di CPU del necessario è moralmente offensivo. Fiber rispetta l’hardware.

Ci vediamo nel prossimo post.