>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 安全
Rust

停止修修补补分布式系统,开始真正使用 Restate

4,112 星标

想象一下:你正在写一个支付处理的微服务。处理到一半,网络抖动、数据库超时,或者容器直接重启了。这笔交易会怎样?在传统方案中,你需要手动实现重试逻辑、追踪幂等性、配置消息队列,很可能还要引入复杂的长流程(saga)。这很痛苦、耗时,而且会把你的代码变成错误处理程序的迷宫。

我最近发现了 Restate,这是一个在基础设施层面解决这个问题的项目。开发者们称之为"持久化执行"——容错的代码执行。核心理念是让你的代码变得不朽:如果进程崩溃,Restate 会从中断的地方恢复执行,保留所有变量和状态。

Restate overview

这到底是什么

Restate 是一个 Rust 二进制文件,作为你服务的代理服务器和协调器。它承担了所有状态管理和调用的脏活累活。你用 TypeScript、Python 或 Go 写普通代码,使用 SDK,突然间你的函数就变成了可靠的工作流。

与 Temporal 这类重量级方案的主要区别在于,Restate 更容易上手。你不需要搭建庞大的数据库集群和复杂的 worker 集群。只需运行一个二进制文件或 Docker 容器就能开始工作。

Restate 在实践中如何帮助

该项目包含几个真正简化你生活的酷炫概念。

保证执行

如果你通过 Restate 调用了一个函数,它一定会执行到底。就这么简单。如果运行你代码的服务器崩溃了,Restate 会等待它恢复,然后从最后一个成功的步骤继续执行。你再也不用担心邮件是否重复发送给了用户,或者钱是否被扣了两次。

智能定时器和 Promise

通常,在分布式系统中实现延迟是一个大工程。你需要把消息放入延迟队列,或者设置定时任务。在 Restate 中,你只需写 ctx.sleep(duration)。线程不会无意义地阻塞:服务可以完全关闭,三天后 Restate 会"唤醒"它并继续执行。

代码中直接管理状态

Restate 允许你存储绑定到特定实体(例如用户 ID)的 K/V 状态。它看起来像普通的对象操作,但在底层 Restate 保证数据是一致的,并且在请求期间始终可用。这对于通常没有内存的无服务器架构特别方便。

代码中是什么样

假设我们需要实现一个带邮箱验证的用户注册流程。使用 Restate SDK 的 TypeScript 代码大概是这样的:

import * as restate from "@restatedev/restate-sdk";

const userService = restate.service({
  name: "users",
  handlers: {
    register: async (ctx: restate.Context, user: { id: string, email: string }) => {
      // Сохраняем состояние
      ctx.set("status", "pending");

      // Отправляем письмо (Restate гарантирует, что это случится 1 раз)
      await ctx.run(() => sendWelcomeEmail(user.email));

      // Ждем подтверждения или таймаута в 24 часа
      const confirmed = await ctx.awakeable<boolean>("email-confirmed");
      
      if (confirmed) {
        ctx.set("status", "active");
      }
    }
  }
});

这里的 ctx.run 保证副作用(发送邮件)会成功执行,并且结果会被缓存。如果函数在发送后崩溃了,重启时 Restate 会直接跳过这一步,因为它知道已经完成了。

技术层面

该项目使用 Rust 编写,性能出色。在架构上,Restate 充当调用器的角色。它通过 HTTP/gRPC 接收传入的请求,写入自己的日志,然后调用你的处理器。

有趣的是,Restate 可以"挂起"执行。如果你的代码在等待外部 API 的响应或定时器,Restate 会释放资源。当事件发生时,它会恢复执行上下文。这使得在普通硬件上运行数千个长时间运行的进程成为可能。

谁应该试试

Restate 非常适合以下场景:

  • 微服务之间有很多调用链。
  • 需要构建复杂的操作链(saga、工作流)。
  • 使用 AI Agent,需要长时间等待 LLM 响应并保留对话上下文。
  • 有延迟执行任务(比如 2 小时后提醒用户未结算的购物车)。

该项目正在积极开发中,GitHub 上有近 4000 颗星。SDK 支持 TypeScript/JavaScript、Java/Kotlin、Python、Go 和 Rust。

当然,你不应该急着明天就把一个新的基础设施组件引入大型银行的生产环境——首先需要在本地试试。但对于初创公司或现有项目的新功能,它可以节省数周的开发时间。

你只需要几分钟就能体验它:

brew install restatedev/tap/restate-server
restate-server

就这样,你就有了一个运行容错应用的本地环境。也许这是目前进入持久化执行世界的最低门槛了。

相关项目