Fastify — Não é mais um framework para node.js

Israel E. Filgueira
5 min readMay 17, 2018

Falaaaa galera! tudo bom com vocês? hoje, iremos falar um pouco sobre o fastify, que é um framework para node.js, com princípios bastante interessantes, o fastify, vem se destacando pelo fato de não ser apenas mais "um" em meio a tantos outros, iremos agora ver características que considero importantes. Let's go now!

Origens

Patrocinado pela nearform e LetzDoIt empresas que hoje utilizam o fastify em larga escala em produção, e com o Matteo e o Thomas sendo os lead maintainers do projeto, o fastify esta em boas mãos, o Matteo faz parte do comitê diretor técnico do nodejs, o Thomas, faz parte do core-team do nodejs, ou seja, pessoas que estão intimamente ligadas ao universo node.js, são os responsáveis por construir e manter o fastify. isso é ótimo!

Características

O fastify possui algumas características que considero forte, como rapidez, modularidade e um ótimo sistema de plugins, segue algumas características.

Consistente

Given one of the core goals of the project is performance, we do not land any feature if the implementation isn’t well optimized and the cost that we pay is as low as possible. Tomas Della Vedova — Lead maintainer of Fastify.

O fastify é extremante rápido, em seus testes de benchmarks ele chega a receber mais de 31 mil request/segundo, confira o vídeo aqui, e o repositório para tratar sobre essas questões de performance você encontra aqui, e essa performance se extende as core-features, uma feature que acho interessante é a Schema based, ele possui um esquema de padronização de saída de dados em suas rotas, o fastify recomenda fortemente, que você padronize seus responses, usando algum JSON Schema, que irá garantir que seus dados serão entregues da forma correta e ainda você obterá de 10 a 20% de rendimento, isso é ligado ao fato que internamente o fastify compila o esquema em uma função de alto desempenho, mais informações consulte a documentação, agora, show the code.

Usando a propriedade response, que faz parte do objeto schema, é possível tratar as respostas http por código, ex.: 200, 201, 202… ou apenas de forma genérica, ex.: 2xx, mais informações consulte a documentação, show the code.

Da forma acima, você consegue padronizar exatamente, suas respostas, claro que, essa padronização, não elimina os testes em sua aplicação de forma nenhuma. Mas servem de apoio e base, para garantir ainda mais a integridade das informações devolvidas em suas respostas. Inclusive o fastify possuí um esquema de injeção de requests, justamente, para facilitar os testes em sua aplicação, mais informações você encontra aqui.

Modularidade

O Fastify possui um sistema de plugins robusto, que garante o carregamento(e fechamento) dos plugins e cria um encapsulamento de custo zero para ajudar os usuários a manter um código limpo e ordenado. Ele também ajudará o usuário a escrever código desacoplado e usar uma versão diferente do mesmo plugin (ou talvez com configurações diferentes) em um subsistema diferente do aplicativo. Uma abordagem semelhante com o Express faria com que o desempenho caísse significativamente para cada nível de aninhamento.

Sistema de Plugins

Além disso, o modelo de plug-in é baseado em bloqueios reentrant e, são graph-based(baseado em grafos), o fastify manipula o código assíncrono corretamente, garantindo a ordem de carregamento e fechamento dos plug-ins.

O sistema de plugins cria um grafo acíclico direto(mais informações aqui) e, dessa forma, é impossível criar cross dependencies(dependências cruzadas), permitindo você poder usar uma versão diferente do mesmo plugin em partes diferentes do seu software.

Gráfico acíclico dirigido

Graças a essa arquitetura, é fácil dividir um aplicativo em vários microsserviços, o fastify ajuda você na criação de um sistema no qual a separação de interesses e coesão são duas chaves essenciais de sua aplicação.

Serviços de gráfico acíclico dirigido

segue abaixo um pequeno exemplo de arquitetura, referenciada pelo grafo acima.

└── plugins (from the Fastify ecosystem)
└── your plugins (your custom plugins)
└── decorators
└── hooks and middlewares
└── your services

└── service A
│ └── plugins (from the Fastify ecosystem)
│ └── your plugins (your custom plugins)
│ └── decorators
│ └── hooks and middlewares
│ └── your services

└── service B
└── plugins (from the Fastify ecosystem)
└── your plugins (your custom plugins)
└── decorators
└── hooks and middlewares
└── your services

Ecossistema

O fastify possui um ecossistema bastante completo e robusto, plugins mantidos pelo core-team são esses e os plugins mantido pela comunidade são esses, recentemente eu lancei um plugin para auto recarregamento de rotas usando regex, usando algumas técnicas que foram extraídas de artigos de autoria do Vinicius Reis e do Suissa, que são respectivamente auto carregamento de rotas(vinicius), injeção de serviços(vinicius) e refatorando suas rotas(suissa), baseado nesses artigos foi criado um plugin chamado fastify-register-routes(confira aqui, aproveita e dá aquele star), que é utilizado tanto para carregamento de rotas quanto para injetar dependências em seus middlewares, o projeto que estou trabalhando atualmente, contempla uso do fastify, confira aqui

Awesome Fastify

Recentemente foi criado um awesome-fastify, com um compilado de informações sobre talks, entrevistas, plugins, artigos e entre outros sobre o fastify. Entra aqui e dá aquele star para a comunidade crescer aqui no brazil. Obrigado.

Conclusão

O fastify é uma verdadeira abordagem diferenciada, ele fornece um núcleo leve e pequeno que seja fácil de estender com plugins e amadurecer seu aplicativo baseando-se em serviços, concentrando-se no desempenho e baixa sobrecarga. O padrão de arquitetura que é usado para criá-lo permite aplicativos prontos, leves e robustos para microsserviços.

Referências

Thanks folks! :)

Acompanhe nossa comunidade no telegram NodeBR e Node.js Brasil e youtube.

--

--

Israel E. Filgueira

Develop at MGA Gestão Pública — Journey to success is not a sprint; it’s a marathon!