Hoje existem várias soluções de código aberto que ajudam a reduzir a complexidade do desenvolvimento de sistemas distribuídos e a gerenciar fluxos de trabalho resilientes. Este relatório oferece uma análise comparativa aprofundada de quatro projetos principais de código aberto: Temporal, Restate, Hatchet e Inngest.
Visão Geral e Conceitos Principais #
Temporal #
Temporal é uma plataforma de Execução Durável, uma solução de código aberto que abstrai a complexidade da construção de sistemas distribuídos. Mesmo diante de falhas de hardware ou software, ela preserva o estado completo da aplicação e permite a migração suave da execução para outras máquinas1. Temporal suporta a aceleração do desenvolvimento eliminando a necessidade de escrever código personalizado para timers, armazenamento de eventos, checkpoints de estado, tentativas e timeouts2.
Temporal é utilizada por milhares de empresas, incluindo Stripe, Netflix, Datadog, HashiCorp, Alaska Airlines e Box, em cargas de trabalho críticas para a missão, bem como em cargas de trabalho básicas. É relatado que todas as mensagens da Twilio, todas as transações da Coinbase e todas as histórias do Snap usam Temporal1.
Restate #
Restate é um motor de Execução Durável, um projeto de código aberto para construir aplicações serverless que possuem estado. Ao escrever código em um estilo semelhante a um serviço RPC convencional, o motor armazena o progresso da execução e, após uma falha, restaura o estado anterior para retomar a execução a partir do ponto em que parou3.
Além disso, o Restate automaticamente pausa a execução em situações de alta latência ou atrasos nas respostas de outros serviços, evitando o desperdício de recursos computacionais. Isso significa que durante o “tempo de espera” o serviço Knative pode ser escalado para zero3.
Hatchet #
Hatchet é uma fila de tarefas distribuída e tolerante a falhas, projetada para abordar questões de escalabilidade, como concorrência, equidade e limitação de velocidade4. Ele permite o desenvolvimento de cargas de trabalho resilientes que podem se recuperar de falhas, substituindo filas legadas difíceis de gerenciar ou sistemas pub/sub5.
Hatchet proporciona baixa latência (com um tempo médio de início de 25ms) e agendamento de alta taxa de transferência, incorporando estratégias como FIFO, LIFO, Round Robin e Priority Queue, para contornar problemas comuns de escalabilidade com mínima configuração6.
Inngest #
Inngest é uma plataforma de fluxo de trabalho durável de código aberto que opera em qualquer nuvem. Permite a escrita de funções de etapas de longa duração que mantêm estado e que são automaticamente reexecutadas em caso de falha7. Ele abstrai tudo relacionado a filas, fluxos de eventos e estado, permitindo que os desenvolvedores se concentrem no código.
Inngest foi fundado em 2021 por Dan Farrelly, ex-CTO do Buffer, e Tony Holdstock-Brown, ex-enginer do Docker, e recebeu um investimento inicial de 3 milhões de dólares liderado pela GGV em 20238.
Comparação de Recursos Técnicos #
Arquitetura e Pilha Tecnológica #
Temporal utiliza uma biblioteca grpc escrita em Go e fornece uma abstração de desenvolvimento que preserva o estado completo da aplicação9. Ele funciona com um padrão de Worker, onde o cliente executa funções de workflow, mas na realidade, realiza a execução do workflow do worker9.
Restate expõe serviços através de um servidor HTTP/2 e pode ser usado com Knative para implantar aplicações serverless3. É fornecido como um único binário, simplificando a execução e operação, e foi desenvolvido em Rust, tornando-o eficiente em recursos e altamente resiliente10.
Hatchet suporta enfileiramento de transações baseado em Postgres e execução em estilo DAG. Ele afirma ser capaz de escalar horizontalmente através de múltiplas regiões utilizando SKIP LOCKED e funcionalidades de releases recentes do PG, como replicação ativa-ativa, permitindo escalar verticalmente acima de 10k TPS11.
Inngest projetou e construiu um sistema de enfileiramento que suporta múltiplos inquilinos, processamento em lotes e debouncing, e está em processo de migração para o FoundationDB. Seu backend foi principalmente desenvolvido em Go, utilizando caching, Clickhouse, e streams de eventos e coordenação7.
Linguagens Suportadas #
As linguagens de programação suportadas por cada projeto são:
- Temporal: Embora não esteja claramente especificado nos resultados de pesquisa, Go parece ser a principal linguagem.
- Restate: Suporta Golang, Java, Kotlin, Typescript, Rust e Python3.
- Hatchet: Oferece SDKs de código aberto para Python, Typescript e Go5.
- Inngest: Fornece SDKs para Typescript (47%), Go (48%), Java e Python, com suporte para chamadas de funções entre linguagens712.
Comparação de Funcionalidades #
Temporal:
- Preservação do estado completo da aplicação e migração para outras máquinas1
- Tratamento automático de timers, armazenamento de eventos, checkpoints de estado, tentativas e timeouts2
- Eliminação da necessidade de filas, sistemas pub/sub e agendadores1
Restate:
- Proporciona durabilidade em código com estilo de serviço RPC3
- Restauração do estado anterior após falhas e retomar a execução a partir de pontos de interrupção3
- Pausa automática da execução em caso de altas latências, economizando recursos3
- Implementação de máquinas de estado, processamento de eventos, sagas, tarefas assíncronas, etc.13
Hatchet:
- Agendamento de baixa latência (com um tempo médio de início de 25ms) e alta taxa de transferência6
- Estratégias embutidas como FIFO, LIFO, Round Robin e Priority Queue4
- Políticas personalizadas de sincronização e tratamento integrado de erros4
- Suporte para Cron, agendamentos de única vez, proteção contra picos, e streaming progressivo4
Inngest:
- Controle de fluxo ciente de múltiplos inquilinos (concorrência, throttle, debounce, prioridade)14
- Suporte para chamadas de funções entre várias linguagens7
- Processamento em lote, agrupando muitos eventos em uma única chamada de função7
- Painéis aprimorados, rastreamento e métricas embutidas7
- Ferramentas avançadas de recuperação como reprodução de funções, pausa e cancelamento em massa7
Casos de Uso e Áreas de Aplicação #
Temporal #
Temporal é adequado para casos de uso como orquestração de serviços, processamento de transações, gerenciamento de infraestrutura, tarefas assíncronas e agendamento de trabalhos1. É especialmente utilizado em cargas de trabalho críticas por grandes empresas como Stripe, Netflix, Datadog, HashiCorp, Alaska Airlines e Box1.
Restate #
Restate é ideal para fluxos de trabalho, aplicações baseadas em eventos, implementação de padrões de sagas e processamento de eventos com estado3. Ao ser utilizado com Knative, permite a construção de aplicações serverless resilientes mesmo em condições de baixa disponibilidade. Ele pode ser utilizado para diversos tipos de aplicações como fluxos de trabalho, sagas e processamento de eventos com estado (em combinação com Knative Eventing)3.
Hatchet #
Hatchet é adequado para casos de uso como equidade para IA generativa (garantindo a distribuição equitativa de requisições para não sobrecarregar o sistema), processamento em lote para indexação de documentos e imagens, orquestração de fluxos de trabalho para sistemas multimodais e precisão em processamento de eventos4.
Inngest #
Inngest é aplicável em fluxos de trabalho para agentes de IA, equidade para IA generativa, processamento em lote para indexação de documentos, orquestração de fluxos de trabalho para sistemas multimodais e mais14. También soporta casos como funções de cadeia relacionadas a IA, índices de busca/RAG e pipelines de dados, além de integração e webhooks, pagamentos e fluxos de cobrança7.
Análise de Prós e Contras #
Temporal #
Prós:
- Plataforma confiável, validada por milhares de empresas1
- Alta confiabilidade devido à preservação do estado completo da aplicação1
- Solução 100% de código aberto sob a licença MIT1
Contras:
- A análise pode ser dificultada pela necessidade de alternar entre Go, Rust e TypeScript9
- Estrutura interna complexa pode dificultar a análise com base nas informações de transmissão e recepção de dados no nível do protocolo9
Restate #
Prós:
- Fornecido como um único binário, simplificando a execução e operação10
- Eficiente em recursos e altamente resiliente (uso de Rust)10
- Pode ser implantado como servidor HTTP serverless/stateless3
Contras:
- Como projeto relativamente novo, pode ter um ecossistema menor em comparação com o Temporal
- Estratégia de implantação pode ser complexa (implantações stateful em clusters k8s ou uso do serviço gerenciado Restate Cloud)3
Hatchet #
Prós:
- Baseado em Postgres, reduzindo o risco de perda de dados em comparação com soluções baseadas em Redis11
- Baixa latência (25ms de tempo médio de início) e agendamento de alta taxa de transferência6
- Funcionalidade de observação incorporada para desenvolvedores de aplicativos11
Contras:
- Atualmente utiliza RabbitMQ para pub/sub, requerendo dependências adicionais11
- Considerando o uso de NATS para a conexão entre engines e workers, ainda em desenvolvimento11
Inngest #
Prós:
- SDK amigável para desenvolvedores com design API conciso7
- Fornece um servidor de desenvolvimento local, facilitando testes e depurações14
- Oferece controle de fluxo ciente de múltiplos inquilinos14
Contras:
- Licença SSPL pode dificultar o uso por algumas empresas15
- Go (48%) e TypeScript (47%) são as principais linguagens, podendo haver suporte limitado para outras12
Licença e Comunidade #
Temporal é fornecido sob a licença MIT, desenvolvendo-se como um projeto de código aberto com uma comunidade ativa1. A licença do Restate não está claramente especificada nos resultados de pesquisa. Hatchet é também fornecido sob a licença MIT5. O Inngest é disponibilizado sob a Server Side Public License (SSPL) e inclui a licença Apache 2.0 sob publicação reduzida de código aberto (DOSP)7.
Conclusão #
Os quatro projetos de código aberto oferecem soluções para execução durável e gerenciamento de fluxos de trabalho, cada um com uma abordagem única e pontos fortes distintos.
Temporal é a solução mais madura e amplamente adotada, adequada para cargas de trabalho críticas. O Restate se concentra na construção de aplicações serverless que mantêm estado, demonstrando eficiência de recursos. O Hatchet é um sistema de fila de tarefas baseado em Postgres, minimizando o risco de perda de dados e oferecendo recursos de observabilidade amigáveis para desenvolvedores. O Inngest enfatiza a experiência do desenvolvedor e oferece uma plataforma de fluxo de trabalho que opera em qualquer nuvem, com controle de fluxo ciente de múltiplos inquilinos.
A escolha do projeto pode variar de acordo com requisitos específicos, pilha de tecnologia existente e expertise da equipe. Entretanto, todos esses quatro soluções compartilham um objetivo comum: abstrair a complexidade dos sistemas distribuídos, permitindo que os desenvolvedores se concentrem na lógica de negócios.
Referências #
O conteúdo acima foi elaborado com base em informações públicas sobre Temporal116217189, Restate31310192021, Hatchet452262311, Inngest87151214242526.
Análise Comparativa Profunda dos Projetos Open Source Restate e Hatchet #
Restate e Hatchet são ambas soluções de código aberto para o tratamento de cargas de trabalho resilientes em sistemas distribuídos, mas cada uma tem sua abordagem e áreas de foco distintas. Este relatório compara os conceitos principais, arquitetura, funcionalidades, casos de uso, etc., de ambos os projetos, analisando os prós e contras de cada solução.
Conceitos Principais e Objetivo #
A Abordagem do Restate #
Restate é um engine de Execução Durável, enfocando a construção de aplicações resilientes que possuem estado. O código escrito em um estilo que se assemelha ao de um serviço RPC comum possibilita que o Restate armazene o progresso da execução e, após qualquer falha, restaure o estado anterior para que a execução possa ser retomada no ponto em que foi interrompida27.
A filosofia do Restate é “proporcionar durabilidade sem mudar a maneira que escrevemos o código”, permitindo que os desenvolvedores escrevam código da mesma forma que escreveriam funções e serviços comuns27. Isso reduz significativamente a carga de desenvolvimento de sistemas distribuídos complexos.
A Abordagem do Hatchet #
Por outro lado, Hatchet é uma fila de tarefas distribuída e tolerante a falhas, com o objetivo de substituir filas legadas difíceis de gerenciar ou sistemas pub/sub, projetando cargas de trabalho que podem se recuperar de falhas28. Ele é particularmente destinado a resolver problemas de escalabilidade como concorrência, equidade e limitação de velocidade28.
Hatchet tem como meta distribuir tarefas entre vários workers com a configuração mínima possível e alcançar uma recuperação confiável em caso de falhas. Além disso, coloca um forte foco na visibilidade e observabilidade para desenvolvedores de aplicativos29.
Características Técnicas e Arquitetura #
Características Técnicas do Restate #
Restate possui as seguintes características técnicas principais:
Ele expõe serviços através de um servidor HTTP/2 e é fornecido como um único binário, facilitando a execução e a operação27. Desenvolvido em Rust, é eficiente em recursos e altamente resiliente, podendo ser executado em uma diversidade de ambientes como FaaS, Kubernetes, servidores e containers27.
Além disso, o Restate pausa automaticamente a execução em situações de alta latência, evitando desperdício de recursos computacionais, permitindo a utilização eficiente dos recursos durante o “tempo de espera”27.
Características Técnicas do Hatchet #
Hatchet apresenta as seguintes características técnicas principais:
Suporta enfileiramento de transações baseado em Postgres e execução em estilo DAG (Directed Acyclic Graph)28. Ele afirma ser capaz de escalar horizontalmente através de múltiplas regiões e verticalmente acima de 10k TPS, utilizando SKIP LOCKED e funcionalidades das releases mais recentes do PostgreSQL28.
Oferece baixa latência (tempo médio de início de 25ms) e agendamento de alta taxa de transferência, incorporando estratégias como FIFO (First In First Out), LIFO (Last In First Out), Round Robin e Priority Queue para resolver problemas de escalabilidade comuns com mínima configuração29.
Comparação de Funcionalidades Principais #
Funcionalidades Principais do Restate #
Restate oferece as seguintes funcionalidades principais:
- Código de Fluxo de Trabalho: A execução durável permite que o código continue a ser executado de maneira confiável mesmo após uma falha27.
- Chamadas de API e Webhooks: Conecta eventos assíncronos de maneira confiável a códigos síncronos e webhooks27.
- Tarefas Assíncronas: Todas as funções chamadas por Restate são executadas de forma assíncrona e durável27.
- Processamento de Eventos com Estado: Processa eventos de fontes como Kafka e oferece refinamento em tentativas e semântica de fluxos de trabalho27.
- Sinalização Durável: Cria fluxos de trabalho e manipuladores de eventos que processam sinais externos, eventos ou entradas de usuário de maneira confiável27.
- Idempotência: Adiciona idempotência a qualquer manipulador RPC ou de eventos27.
- Sagas: Implementa padrões de longa execução que cancelam trabalhos anteriores quando necessário27.
- Máquina de Estado: Gera máquinas de estado consistentes e escaláveis, sem depender de bancos de dados ou transações27.
Funcionalidades Principais do Hatchet #
Hatchet oferece as seguintes funcionalidades principais:
- Observabilidade: Todos os executáveis podem ser completamente pesquisados, permitindo streaming de logs e rastreamento de métricas customizadas como tempo de resposta e taxa de erro29.
- Execução Prática e Durável: Permite a reprodução de eventos e reinício manual da execução em etapas específicas de um fluxo de trabalho29.
- Cron: Estabelece cronogramas de execução repetidos para funções29.
- Agendamentos Únicos: Permite agendamentos de funções para horários e datas específicas29.
- Proteção contra Picos: Suaviza o tratamento de picos de tráfego, realizando apenas o número de execuções que o sistema consegue processar29.
- Streaming Progressivo: Assina atualizações à medida que funções são executadas nos workers em segundo plano29.
- Políticas de Tentativa Customizadas e Tratamento Integrado de Erros: Facilita uma recuperação rápida de falhas temporárias28.
Casos de Uso e Aplicações #
Casos de Uso do Restate #
Restate é particularmente adequado para os seguintes casos de uso:
- Fluxos de Trabalho e Processos de Longa Execução: A execução durável permite gerenciar fluxos de trabalho complexos e processos de longa execução de maneira confiável27.
- Aplicações Baseadas em Eventos: Processa eventos de fontes como Kafka, mantendo o estado durante o processamento27.
- Implementação de Padrões de Sagas: Possibilita a implementação de transações de longa execução e padrões de compensação, cancelando trabalhos anteriores quando necessário27.
- Máquina de Estado: Gera máquinas de estado consistentes e escaláveis sem depender de bancos de dados ou transações27.
Casos de Uso do Hatchet #
Hatchet é especialmente adequado para:
- Equidade para IA Generativa: Garante que usuários ocupados não sobrecarreguem o sistema, fazendo uma distribuição justa de requisições28.
- Processamento em Lote para Indexação de Documentos e Imagens: Executa processamento em grande escala e pode retomar trabalhos interrompidos28.
- Orquestração de Fluxos de Trabalho para Sistemas Multimodais: Apresenta apoio à execução em estilo DAG e a orquestração de múltiplas entradas e saídas28.
- Precisão em Processamento de Eventos: Responde a eventos externos ou internos, permitindo a reprodução automática de eventos28.
Escalabilidade e Desempenho #
Escalabilidade e Desempenho do Restate #
Restate é fornecido como um binário único, facilitando a execução e operação, sendo desenvolvido em Rust, que é eficiente em recursos e resiliente27. A partir da versão 1.2, foi adicionada funcionalidade para alta disponibilidade e distribuição, fortalecendo ainda mais sua escalabilidade27.
Restate usa recursos de maneira eficaz, pausando automaticamente a execução em situações de latência alta, além de ser capaz de rodar de maneira flexível em diversos ambientes, como FaaS, Kubernetes, servidores e containers27.
Escalabilidade e Desempenho do Hatchet #
Hatchet oferece baixa latência (25ms de tempo médio de início) e agendamento de alta taxa de transferência, equilibrando perfeitamente funções de interação em tempo real e a estabilidade requerida para tarefas críticas29.
Utilizando um sistema de enfileiramento de transações baseado em Postgres, Hatchet afirma ser capaz de escalar horizontalmente e verticalmente acima de 10k TPS, aproveitando SKIP LOCKED e as funcionalidades mais recentes do PostgreSQL28.
Experiência do Desenvolvedor e Ambiente de Suporte #
Experiência do Desenvolvedor no Restate #
Restate possibilita que desenvolvedores escrevam código de maneira similar a funções e serviços comuns, removendo a preocupação com a complexidade dos sistemas distribuídos27. Ele suporta uma variedade de linguagens, como Golang, Java, Kotlin, Typescript, Rust e Python27.
A partir da versão 1.2, Restate passou a oferecer uma interface gráfica que simplifica o processo de depuração de aplicações distribuídas, e um servidor de desenvolvimento local que aprimora o ambiente de desenvolvimento e teste27.
Experiência do Desenvolvedor no Hatchet #
Hatchet fornece SDKs de código aberto para Python, Typescript e Go, permitindo que os desenvolvedores utilizem as ferramentas adequadas para seu desenvolvimento28. Também incorpora funcionalidades de observação para desenvolvedores de aplicativos, melhorando a experiência de desenvolvimento e depuração28.
A capacidade de pesquisar todas as execuções permite que rapidamente se identifiquem problemas, realizando streaming de logs e monitorando métricas como tempo de resposta e taxa de erro29.
Comparação Geral e Critérios de Escolha #
Restate e Hatchet têm diferentes forças e casos de uso otimizados.
Quando escolher Restate #
Se houver a necessidade de uma execução durável com alterações mínimas no código, se for necessário implementar padrões complexos de sistemas distribuídos, como sagas ou máquinas de estado, e se a eficiência de recursos e resiliência forem cruciais, Restate pode ser a melhor escolha.
Quando escolher Hatchet #
Se houver necessidade de uma fila de tarefas com distribuição de trabalho equitativa, se a observação e monitoramento forem importantes, se uma solução otimizada para casos de uso como IA gerativa for necessária, e se você deseja um sistema de enfileiramento de transações confiável baseado em Postgres, Hatchet pode ser a escolha mais adequada.
Conclusão #
Restate e Hatchet são ambas soluções poderosas de código aberto para o tratamento de cargas de trabalho resilientes em sistemas distribuídos. Restate foca na execução durável e na implementação de padrões de sistemas distribuídos variados, enquanto Hatchet enfatiza filas de tarefas, distribuição equitativa de trabalho e observabilidade.
Cada projeto possui forças únicas e casos de uso otimizados, portanto, é importante escolher a solução adequada em função dos requisitos do projeto, da infraestrutura existente e da expertise da equipe de desenvolvimento. Ambos os solutions compartilham um objetivo comum de abstrair a complexidade do desenvolvimento de sistemas distribuídos, permitindo que os desenvolvedores se concentrem na lógica de negócios essencial.
-
https://github.com/temporalio ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://knative.dev/blog/articles/Building-Stateful-applications-with-Knative-and-Restate/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://news.ycombinator.com/item?id=41604042 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://appmaster.io/ko/news/inggestneun-300man-jageum-jiweon-baegendeu-weokeupeulrou-gaebaleul-mogeumhabnida ↩︎ ↩︎
-
https://swcho.github.io/blogs/2023-12-25-temporal-2 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://news.ycombinator.com/item?id=39643136 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://www.inngest.com/blog/open-source-event-driven-queue ↩︎
-
https://restate.dev ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://github.com/hatchet-dev/hatchet ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎