Skip to content

MySQL 数据模型

教学版用四张表表达 Durable Execution 和业务落地的关系。其中前三张属于运行时,最后一张属于订单业务域。

invocations

Invocation 是一次 durable handler 执行。

sql
CREATE TABLE invocations (
  id VARCHAR(36) PRIMARY KEY,
  workflow_type VARCHAR(100) NOT NULL,
  idempotency_key VARCHAR(255) UNIQUE,
  status VARCHAR(32) NOT NULL,
  input JSON NOT NULL,
  result JSON NULL,
  error TEXT NULL,
  attempt_count INT NOT NULL DEFAULT 0,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL
);

状态说明:

状态含义
QUEUED已创建,等待 worker 执行
RUNNINGworker 正在执行
RETRYABLE发生可重试错误
WAITING_TIMER等待 durable timer 到期
COMPLETED已完成
FAILED预留给不可重试错误

journal_entries

Journal 记录每个 durable step 的事实。

sql
CREATE TABLE journal_entries (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  invocation_id VARCHAR(36) NOT NULL,
  step_index INT NOT NULL,
  step_name VARCHAR(255) NOT NULL,
  status VARCHAR(32) NOT NULL,
  result JSON NULL,
  error TEXT NULL,
  created_at DATETIME NOT NULL,
  UNIQUE KEY uq_invocation_step (invocation_id, step_index)
);

唯一键 (invocation_id, step_index) 保证每个步骤只提交一次。

runtime_events

这张表不是 Durable Execution 必需品,但对教学很有帮助。它记录 worker 的调度、重试、暂停、恢复等事件,前端可以展示运行时发生了什么。

sql
CREATE TABLE runtime_events (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  invocation_id VARCHAR(36) NOT NULL,
  message VARCHAR(500) NOT NULL,
  created_at DATETIME NOT NULL
);

business_orders

这张表是业务系统真正关心的订单表。Durable Execution 不替代业务表,它负责让业务表的多步骤更新在故障后继续推进。

sql
CREATE TABLE business_orders (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  order_id VARCHAR(64) UNIQUE NOT NULL,
  invocation_id VARCHAR(36) UNIQUE NOT NULL,
  sku VARCHAR(100) NOT NULL,
  quantity INT NOT NULL,
  amount DOUBLE NOT NULL,
  status VARCHAR(32) NOT NULL,
  payment_id VARCHAR(64) NULL,
  reservation_id VARCHAR(64) NULL,
  receipt_id VARCHAR(64) NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  KEY ix_business_orders_invocation (invocation_id),
  KEY ix_business_orders_status (status)
);

订单状态流转:

为什么不直接用一张任务表

一张任务表只能表达“任务整体现在是什么状态”。Durable Execution 需要表达“任务内部哪些步骤已经成为事实”。

数据粒度能回答的问题
invocations.status这个 workflow 是否完成、是否需要重试
journal_entries第几个 durable step 是否已经提交、结果是什么
runtime_eventsworker 最近做过哪些调度动作
business_orders订单对业务系统暴露的状态是什么

没有 Journal,你只能从头重试;有 Journal,才能跳过已经完成的副作用。

没有业务表,workflow 只能证明“运行时做过什么”,却不能回答“订单现在是什么状态”。真实业务系统通常两者都需要。

Teaching project inspired by Restate's public architecture and documentation.