Spin JS/TS Router Showdown: Hono vs. Itty vs. Roteamento Manual

Por Mizael Xavier
Spin JS/TS Router Showdown: Hono vs. Itty vs. Roteamento Manual

Desempenho de Roteamento em Aplicações Spin JS/TS: Uma Análise Comparativa

Ao construir APIs HTTP com Fermyon Spin, o desempenho é um fator crucial. Isso não se refere apenas ao tempo de resposta bruto, mas também à latência de inicialização e ao consumo de memória, especialmente para módulos WebAssembly (Wasm) executados em ambientes com recursos limitados. Nesta análise, detalharemos as características de desempenho de três abordagens de roteamento em aplicações Spin escritas em JavaScript ou TypeScript: o uso do Hono Router, do Itty Router e a lógica de roteamento manual direta no manipulador do Spin.

Aplicações Spin são projetadas para velocidade, inicialização rápida, binários compactos e execução de baixa latência. No entanto, quando cada milissegundo conta, até mesmo a escolha do roteador pode se tornar um gargalo. Adicionar abstração desnecessária pode impactar o desempenho geral da aplicação. Portanto, é fundamental entender as compensações entre bibliotecas de roteamento e a lógica de roteamento manual.

Configuração do Teste de Desempenho de Roteadores

Para esta análise comparativa, foi criada uma API HTTP mínima com os seguintes requisitos de resposta:

  • GET /items: Retornar uma lista de itens em formato JSON.
  • GET /items/:id: Retornar um item específico em formato JSON, pesquisado por seu identificador.

Foram desenvolvidas três aplicações distintas utilizando Spin v3.2.0 e os templates http-js mais recentes. Para o benchmarking com a ferramenta hey, essas aplicações foram hospedadas localmente usando o comando spin up.

A Implementação com Hono Router

O Hono é conhecido por ser um framework web pequeno, simples e ultrarrápido, construído sobre Web Standards. Ele funciona em diversos tempos de execução JavaScript, incluindo Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda e Node.js. O Hono se destaca por sua velocidade, leveza (o preset `hono/tiny` tem menos de 14kB) e por não possuir dependências, utilizando apenas a API Web Standard. Além disso, oferece uma excelente experiência de desenvolvimento (DX) com APIs limpas e suporte de primeira classe para TypeScript. Recentemente, a Fermyon aprimorou a experiência de desenvolvimento JavaScript e TypeScript para o Spin, optando por permitir que os usuários escolham seu roteador preferido em vez de exportar um através do SDK do Spin. O Hono Router, com sua API intuitiva inspirada no Express.js, é uma excelente escolha para construir APIs HTTP com Spin e TypeScript.

No teste, a implementação com Hono demonstrou um bom desempenho, ficando em segundo lugar em termos de requisições por segundo (RPS).

A Implementação com Itty Router

O Itty Router é um microrroteador de API ultraleve, ideal para cenários onde o tamanho importa, como em Cloudflare Workers. Suas principais características incluem seu tamanho reduzido (entre 450 bytes e 970 bytes), suporte a TypeScript, parseamento de rotas e queries, e a capacidade de usar middlewares próprios ou customizados. Ele foi projetado especificamente para ambientes serverless, mas funciona em qualquer lugar. O Itty Router é uma biblioteca muito fina que permite definir rotas e manipuladores baseados na Fetch API.

Na comparação de desempenho, o Itty Router ficou em terceiro lugar em termos de RPS. Embora seja extremamente leve, sua performance no contexto do Spin JS/TS foi inferior à do Hono e à da abordagem manual.

A Implementação com Roteamento Manual

A abordagem de roteamento manual envolve escrever a lógica de decisão diretamente no manipulador de entrada do Spin, sem o uso de bibliotecas de roteamento externas. Esta é a opção mais básica e, teoricamente, a que introduz menos sobrecarga.

Como esperado, a implementação com roteamento manual direto no manipulador do Spin apresentou o melhor desempenho em termos de RPS, superando tanto o Hono quanto o Itty Router. Isso demonstra que, para cenários onde o desempenho máximo é crítico e a complexidade de roteamento é baixa, evitar abstrações adicionais pode ser vantajoso.

Análise dos Resultados de Desempenho

Os resultados do benchmarking revelaram uma hierarquia clara de desempenho entre as três abordagens no ambiente Spin JS/TS:

  1. Roteamento Manual: Maior número de requisições por segundo (RPS).
  2. Hono Router: Desempenho intermediário, mas ainda assim eficiente.
  3. Itty Router: Menor número de RPS entre os três.

É importante notar que, embora o roteamento manual tenha sido o mais rápido, a diferença de desempenho pode não ser significativa para todas as aplicações. A escolha de um roteador como Hono ou Itty pode trazer benefícios em termos de organização do código, legibilidade e funcionalidades adicionais (como middlewares) que compensam uma pequena perda de performance bruta.

A Vantagem do Rust para Desempenho Máximo no Spin

O artigo original que inspirou esta análise também menciona um ponto crucial: para obter o desempenho máximo absoluto em aplicações Spin, o Rust continua sendo a linguagem de escolha. Embora as otimizações nas chamadas entre JavaScript e WebAssembly tenham melhorado significativamente, a natureza do Rust e sua compilação direta para Wasm geralmente resultam em menor latência e maior taxa de transferência em comparação com JavaScript/TypeScript executando sobre um motor JS dentro do Wasm. A performance do WebAssembly em relação ao código nativo pode variar, mas o Wasm é projetado para ter um desempenho previsível.

Conclusão sobre a Escolha de Roteadores em Spin JS/TS

A escolha do método de roteamento para suas aplicações Fermyon Spin em JavaScript ou TypeScript depende das prioridades do seu projeto. Se o objetivo principal é o máximo de requisições por segundo e a lógica de roteamento é simples, a implementação manual pode ser a melhor opção. Para projetos que se beneficiam de uma estrutura de roteamento mais robusta, funcionalidades de middleware e uma sintaxe expressiva, o Hono oferece um excelente equilíbrio entre desempenho e experiência de desenvolvimento. O Itty Router, apesar de sua extrema leveza, demonstrou ser menos performático neste contexto específico, mas ainda pode ser uma opção viável para casos de uso onde o tamanho do pacote é a principal preocupação. É fundamental que os desenvolvedores avaliem esses trade-offs e, se o desempenho for o fator mais crítico, considerem o uso de Rust para seus componentes Spin.

A Fermyon continua a investir na melhoria da experiência do desenvolvedor para múltiplas linguagens dentro do ecossistema Spin, incluindo JavaScript, TypeScript, Python, Go e .NET, e na integração com padrões emergentes como o modelo de componentes WebAssembly.

Mizael Xavier

Mizael Xavier

Desenvolvedor e escritor técnico

Ver todos os posts

Compartilhar: