如今,针对减少分布式系统开发复杂性和实现持久化工作流管理,已有多种开源解决方案。本报告将深入比较分析四个主要的开源项目:Temporal、Restate、Hatchet和Inngest。
概述及核心概念 #
Temporal #
Temporal是一个持久化执行平台,作为开源解决方案抽象了分布式系统构建的复杂性。即使在主机或软件故障发生时,它也能保留完整的应用程序状态,并顺利迁移到其他机器上执行1。Temporal通过消除为定时器、事件溯源、状态检查点、重试和超时编写自定义代码的必要,支持加速开发2。
目前,Temporal在数千家公司中应用于关键任务和基础工作负载。这包括Twilio的所有消息、Coinbase的所有交易、Snap的所有故事都使用了Temporal1。
Restate #
Restate是一个持久化执行引擎,旨在构建具有状态的无服务器应用程序的开源项目。通过编写看起来像普通RPC服务的代码,Restate会保存执行进度,并在崩溃后恢复到先前状态,从中断点继续执行3。
此外,Restate还会在面对较长的等待时间或其他服务响应延迟时,自动暂停执行,以避免浪费计算资源。这意味着在“等待期”内,Knative服务可以实现零扩展3。
Hatchet #
Hatchet是一个分布式、容错的任务队列,旨在解决并发、公平性、速率限制等扩展问题4。它替代了难以管理的遗留队列或发布/订阅系统,能够设计出能够从故障中恢复、解决各种扩展问题的持久性工作负载5。
Hatchet提供超低延迟(平均启动时间25毫秒)和高吞吐量调度,内置FIFO、LIFO、轮询和优先级队列等策略,以最小的配置绕过一般的扩展问题6。
Inngest #
Inngest是一个跨所有云平台运行的开源持久工作流平台,支持在失败时自动重试的状态维持以及编写长时间执行阶段的功能代码7。它抽象了与队列、事件流、状态相关的一切,让开发者可以专注于代码。
Inngest由曾任Buffer CTO的Dan Farrelly和Docker前工程师Tony Holdstock-Brown于2021年创立,2023年获得以GGV为首的300万美元种子投资8。
技术特性比较 #
架构及技术栈 #
Temporal使用用Go语言编写的grpc库,提供保持完整应用状态的开发抽象9。它利用Worker模式执行,客户端执行工作流函数,实际上是在执行worker的workflows9。
Restate通过HTTP/2服务器公开服务,能够与Knative结合使用以部署无服务器应用3。Restate以单个二进制文件提供,简化了执行和操作,且用Rust开发,资源高效且具备优良的恢复能力10。
Hatchet支持基于Postgres的事务队列和DAG(有向无环图)样式执行。它声称可以利用“SKIP LOCKED”以及最近PG版本的里程碑(例如,主动-主动复制)横向扩展Postgres到多个地区,并进行超过10k TPS的纵向扩展11。
Inngest设计和构建了支持多租户、批量处理和防抖的自身队列系统,目前正在转向FoundationDB。其后端主要是用Go编写,使用缓存、Clickhouse、事件流及调度等技术7。
支持的语言 #
每个项目支持的编程语言如下:
- Temporal:搜索结果中未明确指出,但Go似乎是主要语言。
- Restate:支持Golang、Java、Kotlin、Typescript、Rust、Python3。
- Hatchet:提供Python、Typescript和Go的开源SDK5。
- Inngest:提供Typescript(47%)、Go(48%)、Java、Python的SDK,并支持跨语言函数调用712。
功能比较 #
Temporal:
Restate:
Hatchet:
Inngest:
- 支持多租户识别的流控(并发、限制、去抖、优先级)14
- 支持跨多种语言的函数调用7
- 批量处理,将多个事件组为单次函数调用7
- 内置所有监控、防追踪和指标的改进仪表盘7
- 提供函数重放、暂停、大量取消等高级恢复工具7
使用案例与应用领域 #
Temporal #
Temporal适用于服务编排、事务处理、基础设施管理、异步操作、任务调度等案例1。特别是在Stripe、Netflix、Datadog、HashiCorp、Alaska Airlines、Box等大型企业中,用于关键任务工作负载1。
Restate #
Restate适用于工作流、事件驱动应用、实施补偿模式、状态维持事件处理等3。与Knative结合使用时,即使在可用性不足的情况下,也可以构建状态保存的无服务器应用。此外,还能够构建工作流、补偿以及状态维持事件处理(结合Knative Eventing)等多种应用3。
Hatchet #
Hatchet适合用于生成型AI的公平性(防止繁忙用户压倒系统的请求公平分配)、文档和图像索引的批处理、多模态系统的工作流编排、事件驱动处理的准确性等案例4。
Inngest #
Inngest适用于AI代理的工作流、生成性AI的公平性、文档索引的批处理、多模态系统的工作流编排等案例14。同时还支持AI相关链条阶段函数、搜索/RAG索引与数据管道的集成及Webhook、支付与账单流等场景7。
优缺点分析 #
Temporal #
优点:
缺点:
Restate #
优点:
缺点:
- 作为相对新颖的项目,生态系统可能较Temporal小
- 部署策略较复杂(需在k8s集群中进行状态部署或使用Restate Cloud托管服务)3
Hatchet #
优点:
缺点:
Inngest #
优点:
缺点:
许可证与社区 #
Temporal以MIT许可证提供,并与活跃的社区一起进行开源开发1。Restate的许可证在搜索结果中未明确指出。Hatchet以MIT许可证提供5。Inngest则以服务器方公共许可证(SSPL)形式提供,并在延迟开源出版(DOSP)下包括Apache 2.0许可证7。
结论 #
四个开源项目均提供了持久执行和工作流管理的解决方案,但每一个都有其独特的方法和优势。
Temporal是最成熟、最广泛采用的解决方案,适合关键任务的工作负载。Restate则专注于状态保持的无服务器应用,并在资源效率方面表现出色。Hatchet作为基于Postgres的任务队列,降低了数据丢失风险,并提供了友好的观察性。Inngest则注重开发者体验,提供了多租户识别的流控和跨云平台运行的工作流平台。
项目选择取决于具体需求、现有技术栈以及团队的专业性。然而,这四个解决方案都有着抽象分布式系统复杂性、让开发者能够聚焦于业务逻辑的共同目标。
参考资料 #
上述内容基于关于Temporal116217189、Restate31310192021、Hatchet452262311和Inngest87151214242526的公开信息撰写。
Restate与Hatchet开源项目深入比较分析 #
Restate和Hatchet都是旨在处理分布式系统中持久化工作负载的开源解决方案,但它们各自的方法和重点领域有所不同。本报告将比较这两个项目的核心概念、架构、功能、使用案例等,分析各解决方案的优缺点。
核心概念及目的 #
Restate的 접근 방법 #
Restate是一个持久化执行引擎,专注于构建具有状态的弹性应用程序。通过编写看似普通RPC服务的代码,Restate保存执行进度并在发生故障后恢复到先前的状态,从中断点继续执行27。
Restate秉持“在不改变编写代码方式的前提下提供持久性”的理念,使开发者能够像编写普通函数和服务一样编写代码27。这在很大程度上减少了复杂的分布式系统开发负担。
Hatchet的 접근 方法 #
而Hatchet则是一个分布式、容错的任务队列,旨在替代难以管理的遗留队列或pub/sub系统,以设计出能够从故障中恢复的工作负载28。特别是,它专为解决并发、公平性和速率限制等扩展问题而设计28。
Hatchet以最低限度的配置将任务分布到多个工作节点,并致力于在失败时稳定恢复。此外,它也非常重视为应用开发者提供可见性和观察性29。
技术特性及架构 #
Restate的技术特性 #
Restate具有以下主要技术特性:
通过HTTP/2服务器公开服务,并且以单个可执行文件提供,简化了执行和运营27。使用Rust开发,使其资源高效且具备良好恢复能力,能够在FaaS、Kubernetes、服务器和容器等多种环境下运行27。
此外,Restate在面对较长的等待时间时,自动暂停执行,以避免浪费计算资源。这使得在“等待时间”期间能够有效利用资源27。
Hatchet的技术特性 #
Hatchet具有以下主要技术特性:
支持基于Postgres的事务队列和DAG(有向无环图)样式执行28。它声称通过利用“SKIP LOCKED”和最近PostgreSQL版本的一些关键特性,可以实现横向扩展并超过10k TPS的纵向扩展28。
提供超低延迟(平均启动时间25毫秒)和高吞吐量调度,同时内置FIFO、LIFO、轮询以及优先级队列等策略,以最少的配置解决一般的扩展问题29。
主要功能比较 #
Restate的主要功能 #
Restate提供以下主要功能:
- 工作流代码:通过持久化执行确保即使发生故障,代码也能可靠地完成27。
- API调用与Webhook:可靠连接同步代码和Webhook等异步事件27。
- 异步操作:所有被Restate调用的函数都能以持久化的方式异步执行27。
- 状态保持事件处理:处理来自Kafka等事件源的事件,并提供细粒度的重试与工作流语义27。
- 持久化信号:生成能够可靠处理外部信号、事件和用户输入的工作流与事件处理程序27。
- 幂等性:为所有RPC或事件处理程序添加幂等性27。
- 补偿事务:实现补偿模式,支持长时间执行的事务中断和回滚27。
- 状态机:在无需数据库或事务的情况下生成一致且可扩展的状态机27。
Hatchet的主要功能 #
Hatchet提供以下主要功能:
- 可观察性:可以完全查看所有执行情况,流式记录并跟踪延迟、错误率或自定义指标29。
- 实用持久化执行:可在工作流的特定阶段播放事件并手动恢复执行29。
- Cron:为函数的执行设定重复计划29。
- 一次性调度:计划在特定时间和日期执行函数29。
- 流量尖峰保护:平滑处理流量尖峰,仅执行系统所能处理的工作29。
- 渐进式流式处理:随着后台工作者中的函数进展,订阅更新29。
- 自定义重试政策与集成错误处理:确保在暂时失败后迅速恢复28。
使用案例与应用领域 #
Restate的使用案例 #
Restate在以下使用案例中特别合适:
- 工作流与长期执行过程:得益于持久化执行,能稳定管理复杂的工作流和长时间执行过程27。
- 事件驱动应用:能够处理来自Kafka等事件源的事件,并维持状态27。
- 补偿模式实现:支持长时间执行的事务、补偿模式,允许在需要回滚时取消之前的工作27。
- 状态机:即便在没有数据库或事务的情况下,也可生成一致且可扩展的状态机27。
Hatchet的使用案例 #
Hatchet在以下使用案例中特别合适:
- 生成型AI的公平性:确保繁忙用户的请求公平分配,而不至于压倒系统28。
- 文档与图像索引的批处理:能够执行大规模的批处理,且在失败时可从中断点恢复28。
- 多模态系统的工作流编排:支持多模态输入与输出的工作流编排,支持DAG样式执行28。
- 事件驱动处理的准确性:响应外部事件或系统内事件,自动播放事件28。
扩展性与性能 #
Restate的扩展性和性能 #
Restate以单一二进制形式提供,简化了执行与运行,利用Rust开发实现资源高效且具备良好恢复性能27。从Restate 1.2版本起,增加了高可用性与分布式部署功能,进一步增强了扩展性27。
Restate在面对较长的等待时间时自动暂停执行,确保计算资源得到有效使用,能够在FaaS、Kubernetes、服务器及容器等多种环境中灵活运作27。
Hatchet的扩展性和性能 #
Hatchet提供超低延迟(平均启动时间25毫秒)与高吞吐量调度,从而完美平衡实时交互能力与关键任务工作所需的稳定性29。
使用基于Postgres的事务队列系统,声称能够利用“SKIP LOCKED”及最近PostgreSQL版本的一些关键特性,实现横向扩展及超过10k TPS的纵向扩展28。
开发者体验与支持环境 #
Restate的开发者体验 #
Restate允许开发者像编写普通函数和服务一样进行编程,让他们不必担心分布式系统的复杂性27。同时Restate支持多种语言,涵盖Golang、Java、Kotlin、Typescript、Rust、Python等27。
从Restate 1.2版本起,提供图形化UI,以支持对分布式应用程序的调试,通过本地开发服务器增强开发和测试环境27。
Hatchet的开发者体验 #
Hatchet提供Python、Typescript和Go的开源SDK,支持开发者使用适当的工具进行开发28。此外,它还内置可观察性特性,以增强开发与调试体验28。
Hatchet能够让所有执行过程完全可见,从而快速识别问题,支持流式日志记录以及延迟、错误率或自定义指标的跟踪29。
综合比较与选择标准 #
Restate和Hatchet各有独特的优势与优化过的使用案例。
Restate更适合的情况 #
在需在最小变动下实现持久化执行时,需要实现补偿模式或状态机等复杂的分布式系统模式,同时资源效率与恢复能力也很重要的情况下,Restate可能更合适。
Hatchet更适合的情况 #
在需要任务队列与公平作业分配、重视可观察性与监控、针对生成型AI等前沿使用案例优化的解决方案时,以及希望使用基于Postgres的稳定事务队列系统的情况下,Hatchet可能更合适。
结论 #
Restate和Hatchet都是为处理分布式系统中的持久化工作负载而设计的强大开源解决方案。Restate专注于持久化执行与多种分布式系统模式的实现,而Hatchet则专注于任务队列、公平作业分配和可观察性。
每个项目都拥有独特的优势与优化过的使用案例。因此,考虑项目需求、现有基础设施、开发团队的专业性等因素,选择合适的解决方案至关重要。这两个解决方案都致力于将分布式系统开发的复杂性抽象化,让开发者能够专注于核心业务逻辑。
-
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 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎