본문으로 건너뛰기

Temporal, Restate, Hatchet, Inngest 오픈소스 프로젝트 비교 분

·3128 단어수·15 분

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.



  1. https://github.com/temporalio ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. https://temporal.io ↩︎ ↩︎ ↩︎

  3. https://knative.dev/blog/articles/Building-Stateful-applications-with-Knative-and-Restate/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  4. https://news.hada.io/topic?id=13722 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  5. https://github.com/hatchet-dev/hatchet ↩︎ ↩︎ ↩︎ ↩︎

  6. https://hatchet.run ↩︎ ↩︎ ↩︎ ↩︎

  7. https://news.ycombinator.com/item?id=41604042 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  8. https://appmaster.io/ko/news/inggestneun-300man-jageum-jiweon-baegendeu-weokeupeulrou-gaebaleul-mogeumhabnida ↩︎ ↩︎

  9. https://swcho.github.io/blogs/2023-12-25-temporal-2 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  10. https://restate.dev ↩︎ ↩︎ ↩︎ ↩︎

  11. https://news.ycombinator.com/item?id=39643136 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  12. https://openalternative.co/inngest ↩︎ ↩︎ ↩︎

  13. https://github.com/restatedev/restate ↩︎ ↩︎

  14. https://www.inngest.com ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  15. https://news.ycombinator.com/item?id=31910762 ↩︎ ↩︎

  16. https://www.opensourcealternative.to/project/temporal ↩︎

  17. https://web.temporal.io ↩︎

  18. https://aws.amazon.com/startups/offers/temporal?lang=pt ↩︎

  19. https://docs.restate.dev ↩︎

  20. https://www.contributor.fyi/restate ↩︎

  21. https://github.com/restatedev ↩︎

  22. https://docs.hatchet.run/home ↩︎

  23. https://openalternative.co/hatchet ↩︎

  24. https://www.inngest.com/blog/open-source-event-driven-queue ↩︎

  25. https://github.com/inngest ↩︎

  26. https://github.com/inngest/inngest ↩︎

  27. https://restate.dev ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  28. https://github.com/hatchet-dev/hatchet ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  29. https://hatchet.run ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎