Salta al contenuto principale

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

·2864 parole·14 minuti

Oggi esistono diverse soluzioni open source per ridurre la complessità nello sviluppo di sistemi distribuiti e per una gestione dei workflow resiliente. In questo rapporto, confronteremo in modo approfondito quattro progetti open source principali: Temporal, Restate, Hatchet e Inngest.

Panoramica e concetti chiave
#

Temporal
#

Temporal è una piattaforma di esecuzione resiliente che astrae la complessità nella costruzione di sistemi distribuiti come soluzione open source. Anche in caso di guasti di hosting o software, preserva lo stato completo dell’applicazione e consente una migrazione fluida dell’esecuzione su altre macchine1. Temporal supporta l’accelerazione dello sviluppo eliminando la necessità di scrivere codice personalizzato per timer, event sourcing, checkpoint di stato, retry e timeout2.

Temporal è utilizzato da migliaia di aziende, tra cui Stripe, Netflix, Datadog, HashiCorp, Alaska Airlines e Box, per workload mission-critical e workload fondamentali. Si dice che tutti i messaggi di Twilio, tutte le transazioni di Coinbase e tutte le storie di Snap utilizzino Temporal1.

Restate
#

Restate è un motore di esecuzione resiliente progettato per costruire applicazioni serverless con stato. Scrivendo codice che appare come un comune servizio RPC, il motore memorizza i progressi dell’esecuzione e ripristina lo stato precedente dopo un crash, riprendendo l’esecuzione dal punto di interruzione3.

Inoltre, Restate interrompe automaticamente l’esecuzione in situazioni di latenza elevata o ritardi nella risposta di altri servizi, evitando sprechi di risorse computazionali. Ciò significa che durante il “tempo di attesa” il servizio Knative può scalare a zero3.

Hatchet
#

Hatchet è una coda di lavoro distribuita e tollerante ai guasti progettata per affrontare problemi di scalabilità come la concorrenza, l’equità e il rate limiting4. Sostituisce code legacy difficili da gestire o sistemi pub/sub, consentendo di progettare workload resilienti in grado di recuperare da guasti e risolvere diversi problemi di scalabilità5.

Hatchet offre scheduling a bassa latenza (tempo medio di avvio di 25 ms) e alta capacità di elaborazione, incorporando strategie come FIFO, LIFO, Round Robin e Priority Queue per affrontare problemi di scalabilità comuni con la minima configurazione6.

Inngest
#

Inngest è una piattaforma open source per workflow resilienti che opera su qualsiasi cloud. Consente di scrivere funzioni a lungo termine con stato, riprovando automaticamente in caso di errore7. Astrae tutto ciò che riguarda code, stream di eventi e stato, consentendo di concentrarsi sul codice.

Inngest è stata fondata nel 2021 da Dan Farrelly, ex CTO di Buffer, e Tony Holdstock-Brown, ex ingegnere di Docker, ed ha ricevuto un investimento seed di 3 milioni di dollari nel 2023, guidato da GGV8.

Confronto delle caratteristiche tecniche
#

Architettura e stack tecnologico
#

Temporal utilizza una libreria grpc scritta in Go e fornisce astrazione di sviluppo conservando lo stato completo dell’applicazione9. Viene eseguito utilizzando un pattern work, dove il client esegue la funzione workflow, ma struttura il lavoro effettivo su un worker9.

Restate espone i servizi tramite un server HTTP/2 e può essere utilizzato con Knative per distribuire applicazioni serverless3. Restate è fornito come singolo binario per una semplice esecuzione e operatività, sviluppato in Rust, rendendolo efficiente in termini di risorse e resiliente10.

Hatchet supporta code di transazione e esecuzione in stile DAG basate su Postgres. Utilizzando caratteristiche recenti di PostgreSQL come SKIP LOCKED, afferma di poter scalare orizzontalmente su più regioni e verticalmente a più di 10k TPS11.

Inngest ha progettato e costruito un proprio sistema di code che supporta multi-tenancy, batching e debouncing, e sta migrando verso FoundationDB. Il backend è principalmente scritto in Go, con caching, clickhouse, stream di eventi e coordinamento7.

Linguaggi supportati
#

I linguaggi di programmazione supportati da ciascun progetto sono:

  • Temporal: non specificato chiaramente nei risultati, ma Go sembra essere il linguaggio principale.
  • Restate: supporta Golang, Java, Kotlin, Typescript, Rust, Python3.
  • Hatchet: offre SDK open source per Python, Typescript, Go5.
  • Inngest: fornisce SDK per Typescript (47%), Go (48%), Java, Python e supporta chiamate di funzione cross-language712.

Confronto delle funzionalità
#

Temporal:

  • Conservazione dello stato completo dell’applicazione e migrazione su altre macchine1
  • Gestione automatica di timer, event sourcing, checkpoint di stato, retry e timeout2
  • Eliminazione della necessità di code, sistemi pub/sub e scheduler1

Restate:

  • Fornisce resilienza a codice in stile servizio RPC3
  • Ripristino dello stato precedente e ripresa dell’esecuzione dopo un crash3
  • Risparmio di risorse grazie all’interruzione automatica dell’esecuzione in caso di latenza elevata3
  • Possibilità di implementare macchine di stato, gestione eventi, saghe e lavori asincroni13

Hatchet:

  • Scheduling a bassa latenza (tempo medio di avvio di 25 ms) e alta capacità di elaborazione6
  • Strategia integrate come FIFO, LIFO, Round Robin e Priority Queue4
  • Politiche di retry personalizzate e gestione degli errori integrata4
  • Supporto per cron, scheduling one-off, spike protection e streaming graduale4

Inngest:

  • Controllo del flusso multi-tenancy consapevole (concorrenza, throttling, debounce, priorità)14
  • Supporto per chiamate di funzione tra più linguaggi7
  • Elaborazione batch, raggruppamento di eventi in una singola chiamata di funzione7
  • Dashboard migliorata, tracciamento e metriche integrate7
  • Strumenti avanzati di recupero come ripristino delle funzioni, pausa e annullamento in massa7

Casi d’uso e applicazioni
#

Temporal
#

Temporal è adatto per casi d’uso come orchestrazione di servizi, elaborazione di transazioni, gestione dell’infrastruttura, lavori asincroni e scheduling di lavori1. È utilizzato in particolare da grandi aziende come Stripe, Netflix, Datadog, HashiCorp, Alaska Airlines e Box per workload mission-critical1.

Restate
#

Restate è adatto per workflow, applicazioni centrate sugli eventi, implementazione di pattern saga e gestione degli eventi con stato3. Può essere utilizzato con Knative per costruire applicazioni serverless con stato anche in situazioni di disponibilità limitata. Supporta anche la costruzione di una varietà di applicazioni come workflow, saghe e gestione eventi con stato (combinato con Knative Eventing)3.

Hatchet
#

Hatchet è adatto per casi d’uso come l’equità per AI generativa (distribuzione equa delle richieste per non sovraccaricare il sistema), elaborazione batch per indicizzazione di documenti e immagini, orchestrazione dei workflow per sistemi multi-modali e accuratezza per l’elaborazione basata su eventi4.

Inngest
#

Inngest è adatto per casi d’uso come workflow di agenti AI, equità per AI generativa, elaborazione batch per indicizzazione di documenti e orchestrazione dei workflow per sistemi multi-modali14. Supporta anche catene di funzioni correlate all’AI, indici di ricerca/RAG e pipeline di dati, integrazioni e webhook, flussi di pagamento e fatturazione7.

Analisi dei pro e contro
#

Temporal
#

Pro:

  • Piattaforma collaudata e stabile per migliaia di aziende1
  • Elevata affidabilità grazie alla conservazione dello stato completo dell’applicazione1
  • Soluzione open source al 100% disponibile con licenza MIT1

Contro:

  • Potrebbe essere difficile analizzare il comportamento tra Go, Rust e TypeScript9
  • Struttura interna complessa che rende difficile l’analisi basata su informazioni di trasmissione/ricezione di dati a livello di protocollo9

Restate
#

Pro:

  • Fornito come singolo binario, facile da eseguire e gestire10
  • Efficiente in termini di risorse e resiliente (utilizzo di Rust)10
  • Può essere distribuito come server HTTP serverless/stateless3

Contro:

  • Essendo un progetto relativamente nuovo, potrebbe avere un ecosistema più piccolo rispetto a Temporal
  • La strategia di distribuzione potrebbe essere complessa (distribuzione stateful su cluster k8s o utilizzo del servizio di gestione Restate Cloud)3

Hatchet
#

Pro:

  • Basato su Postgres, riducendo il rischio di perdita di dati (rispetto a soluzioni basate su Redis)11
  • Fornisce scheduling a bassa latenza (tempo medio di avvio di 25 ms) e alta capacità di elaborazione6
  • Include funzionalità di osservabilità integrate per gli sviluppatori di applicazioni11

Contro:

  • Attualmente utilizza RabbitMQ per pub/sub, richiedendo dipendenze aggiuntive11
  • Considera l’uso di NATS per la connessione tra engine ed worker, parte ancora in fase di sviluppo11

Inngest
#

Pro:

  • SDK user-friendly e design API conciso7
  • Fornisce un Dev Server per lo sviluppo locale, facilitando test e debugging14
  • Controllo del flusso multi-tenancy fornito14

Contro:

  • La licenza SSPL potrebbe rendere difficile l’uso per alcune aziende15
  • Go (48%) e TypeScript (47%) sono i linguaggi principali, limitando il supporto per altri linguaggi12

Licenza e comunità
#

Temporal è disponibile con licenza MIT ed è sviluppato come open source con una comunità attiva1. La licenza di Restate non è specificata chiaramente nei risultati. Hatchet è fornito con licenza MIT5. Inngest è disponibile con la Server Side Public License (SSPL) e include anche una licenza Apache 2.0 sotto pubblicazione open source ritardata (DOSP)7.

Conclusione
#

Tutti e quattro i progetti open source offrono soluzioni per l’esecuzione resiliente e la gestione dei workflow, ma ciascuno ha un approccio e punti di forza unici.

Temporal è la soluzione più matura e ampiamente adottata, adatta per workload mission-critical. Restate si concentra su applicazioni serverless con stato, offrendo un’elevata efficienza delle risorse. Hatchet è una coda di lavoro basata su Postgres, riducendo il rischio di perdita di dati e fornendo osservabilità user-friendly. Inngest si concentra sull’esperienza degli sviluppatori, offrendo una piattaforma di workflow che opera in tutti i cloud con controllo del flusso multi-tenancy.

La scelta del progetto può variare in base ai requisiti specifici, allo stack tecnologico esistente e all’expertise del team. Tuttavia, tutti e quattro queste soluzioni condividono l’obiettivo di astrarre la complessità dei sistemi distribuiti e consentire agli sviluppatori di concentrarsi sulla logica di business.

Riferimenti
#

Il contenuto è stato redatto sulla base di informazioni pubblicamente disponibili riguardanti Temporal116217189, Restate31310192021, Hatchet452262311, Inngest87151214242526.


Analisi comparativa approfondita tra i progetti open source Restate e Hatchet
#

Restate e Hatchet sono entrambe soluzioni open source progettate per trattare workload resilienti in sistemi distribuiti, ma ciascuna ha un approccio e aree di focus diverse. Questo rapporto confronterà i concetti chiave, le architetture, le funzionalità e i casi d’uso dei due progetti analizzando i pro e i contro di ciascuna soluzione.

Concetto chiave e obiettivo
#

Approccio di Restate
#

Restate è un motore di esecuzione resiliente focalizzato sulla costruzione di applicazioni resilienti con stato. Scrivendo codice che si presenta come comune servizio RPC, Restate memorizza i progressi dell’esecuzione e ripristina lo stato precedente dopo un guasto, riprendendo l’esecuzione dal punto di interruzione27.

Restate abbraccia la filosofia di fornire resilienza “senza cambiare il modo di scrivere il codice”, permettendo agli sviluppatori di scrivere codice come se stessero creando normali funzioni e servizi27. Ciò riduce notevolmente il carico di sviluppo di un sistema distribuito complesso.

Approccio di Hatchet
#

Hatchet, invece, è una coda di lavoro distribuita e tollerante ai guasti, progettata per sostituire code legacy difficili da gestire o sistemi pub/sub, consentendo di progettare workload in grado di recuperare da fallimenti28. È progettato per affrontare problemi di scalabilità come la concorrenza, l’equità e il rate limiting28.

Hatchet mira a distribuire i lavori su più worker con la minima configurazione e punta a un ripristino affidabile in caso di guasto. L’osservabilità e la visibilità per gli sviluppatori di applicazioni sono anche aspetti molto importanti29.

Caratteristiche tecniche e architettura
#

Caratteristiche tecniche di Restate
#

Restate presenta le seguenti caratteristiche tecniche principali:

Espone i servizi tramite un server HTTP/2 ed è fornito come singolo binario, semplificando l’esecuzione e la gestione27. Sviluppato in Rust, è efficiente in termini di risorse e resiliente, operando in vari ambienti come FaaS, Kubernetes, server e container27.

Inoltre, Restate interrompe automaticamente l’esecuzione in caso di latenza elevata, evitando sprechi di risorse computazionali. Ciò consente un’esecuzione efficiente durante i “periodi di attesa”27.

Caratteristiche tecniche di Hatchet
#

Hatchet offre le seguenti caratteristiche tecniche principali:

Supporta l’accodamento delle transazioni basato su Postgres e l’esecuzione in stile DAG (Directed Acyclic Graph)28. Sfrutta funzionalità recenti di PostgreSQL come SKIP LOCKED, affermando di poter scalare orizzontalmente su più regioni e verticalmente a più di 10k TPS28.

Dispone di scheduling a bassa latenza (tempo medio di avvio di 25 ms) e alta capacità di elaborazione, incorporando strategie predefinite come FIFO (First In First Out), LIFO (Last In First Out), Round Robin e Priority Queue per affrontare problemi comuni di scalabilità29.

Confronto delle funzionalità principali
#

Funzionalità principali di Restate
#

Restate offre le seguenti funzionalità principali:

Codice workflow: Grazie all’esecuzione resiliente, il codice viene eseguito in modo affidabile, anche in caso di guasto27.

Chiamate API e webhook: Collega in modo affidabile eventi asincroni come codice sincrono e webhook27.

Operazioni asincrone: Tutte le funzioni chiamate tramite Restate vengono eseguite in modo resiliente e asincrono27.

Gestione eventi con stato: Gestisce eventi da fonti di eventi come Kafka e fornisce retry e semantica di workflow dettagliati27.

Segnali resiliente: Genera workflow e gestori di eventi affidabili che trattano segnali, eventi e input utente esterni27.

Idempotenza: Aggiunge idempotenza a tutte le chiamate RPC o gestori di eventi27.

Saga: Implementa pattern di transazioni a lungo termine, con rollback delle operazioni precedenti in caso di interruzione27.

Macchine di stato: Crea macchine di stato coerenti e scalabili senza dipendere da database o transazioni27.

Funzionalità principali di Hatchet
#

Hatchet offre le seguenti caratteristiche principali:

Osservabilità: Fornisce tracciamento completo di tutte le esecuzioni, streaming di log e monitoraggio di metriche personalizzabili come latenza ed errori29.

Esecuzione resiliente e pratica: Consente il ripristino di eventi e la ripresa manuale dell’esecuzione in particolari fasi di workflow29.

Cron: Imposta un programma di ripetizione per l’esecuzione delle funzioni29.

Scheduling one-off: Pianifica l’esecuzione di funzioni a date e orari specifici29.

Protezione da picchi: Gestisce in modo ammorbidito i picchi di traffico, eseguendo solo quanto può gestire29.

Streaming graduale: Consente aggiornamenti man mano che le funzioni avanzano su worker in background29.

Politiche di retry personalizzate e gestione degli errori integrata: Garantisce un recupero veloce da fallimenti temporanei28.

Casi d’uso e aree di applicazione
#

Casi d’uso di Restate
#

Restate è particolarmente adatto ai seguenti casi d’uso:

Workflow e processi a lungo termine: Gestisce in modo affidabile workflow complessi e processi di lunga durata grazie a un’esecuzione resiliente27.

Applicazioni basate su eventi: Elabora eventi da fonti come Kafka mantenendo lo stato27.

Implementazione di pattern saga: Consente di annullare lavori precedenti in caso di rollback delle transazioni a lungo termine27.

Macchine di stato: Crea macchine di stato coerenti e scalabili senza database o transazioni27.

Casi d’uso di Hatchet
#

Hatchet è particolarmente adatto per i seguenti casi d’uso:

Equità per AI generativa: Garantisce una distribuzione equa delle richieste per evitare il sovraccarico del sistema28.

Elaborazione batch per indicizzazione di documenti e immagini: Esegue elaborazioni batch su larga scala e consente la ripresa dei lavori interrotti28.

Orchestrazione dei workflow per sistemi multi-modali: Supporta l’orchestrazione di input e output multipli e l’esecuzione in stile DAG28.

Precisione per elaborazione basata su eventi: Risponde a eventi esterni o interni al sistema e consente la riproduzione automatica degli eventi28.

Scalabilità e prestazioni
#

Scalabilità e prestazioni di Restate
#

Restate è fornito come singolo binario, semplificando l’esecuzione e l’operatività, ed è sviluppato in Rust, rendendolo efficiente e resiliente27. A partire dalla versione 1.2, sono state aggiunte capacità di distribuzione e alta disponibilità per aumentare la scalabilità27.

Inoltre, Restate interrompe automaticamente l’esecuzione in caso di latenza elevata per utilizzare in modo efficiente le risorse computazionali, operando con flessibilità in ambienti diversificati come FaaS, Kubernetes, server e container27.

Scalabilità e prestazioni di Hatchet
#

Hatchet fornisce scheduling a bassa latenza (tempo medio di avvio di 25 ms) e alta capacità di elaborazione, bilanciando stabilità e funzionalità di interazione in tempo reale richieste per workload mission-critical29.

Utilizzando un sistema di accodamento delle transazioni basato su Postgres, Hatchet sfrutta funzionalità come SKIP LOCKED, affermando di poter scalare orizzontalmente su più regioni e verticalmente a più di 10k TPS28.

Esperienza degli sviluppatori e ambiente di supporto
#

Esperienza degli sviluppatori di Restate
#

Restate consente agli sviluppatori di scrivere codice come per normali funzioni e servizi, permettendo di non preoccuparsi per la complessità dei sistemi distribuiti27. Supporta anche vari linguaggi come Golang, Java, Kotlin, Typescript, Rust e Python27.

A partire dalla versione 1.2, Restate ha introdotto un’interfaccia grafica che offre supporto per il debug delle applicazioni distribuite e migliora l’ambiente di sviluppo e test con un server di sviluppo locale27.

Esperienza degli sviluppatori di Hatchet
#

Hatchet fornisce SDK open source per Python, Typescript e Go, consentendo agli sviluppatori di utilizzare gli strumenti appropriati per la loro programmazione28. Include anche funzionalità di osservabilità integrate per migliorare l’esperienza di sviluppo e debug28.

Hatchet consente una tracciabilità completa di tutte le esecuzioni, facilitando l’identificazione rapida dei problemi e il monitoraggio di log, latenza, tassi di errore o metriche personalizzabili29.

Confronto complessivo e criteri di scelta
#

Restate e Hatchet presentano entrambi punti di forza unici e casi d’uso ottimizzati.

Quando scegliere Restate
#

Restate è più adatto quando è necessaria un’implementazione resiliente con modifiche minime del codice, quando si devono implementare pattern complessi come saghe o macchine di stato, e quando l’efficienza delle risorse e la resilienza sono essenziali.

Quando scegliere Hatchet
#

Hatchet è più pertinente quando è richiesta una coda di lavoro con distribuzione equa delle operazioni, quando l’osservabilità e il monitoraggio sono critici, quando si necessitano soluzioni ottimizzate per nuovi casi d’uso come l’AI generativa, e quando è desiderabile un sistema di accodamento dei lavori basato su Postgres.

Conclusione
#

Restate e Hatchet offrono entrambe soluzioni open source potenti per gestire workload resilienti in sistemi distribuiti. Restate si concentra su esecuzione resiliente e implementazione di pattern distribuiti, mentre Hatchet si focalizza su code di lavoro, distribuzione equa e osservabilità.

Ogni progetto ha punti di forza unici e casi d’uso ottimizzati, pertanto è importante scegliere la soluzione appropriata in base ai requisiti del progetto, all’infrastruttura esistente e all’expertise del team di sviluppo. Entrambe le soluzioni condividono l’obiettivo di astrarre la complessità nello sviluppo di sistemi distribuiti, consentendo agli sviluppatori di concentrarsi sulla logica di business principale.



  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=ko ↩︎

  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 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎