首页/开发/系统分析与架构设计速查/发件箱模式(Transactional Outbox)

发件箱模式(Transactional Outbox)

在本地事务中同时写业务数据与发件箱记录,再由独立中继把发件箱内容发布到消息系统;避免“数据库已提交但消息未发出”的不一致。

写入业务表 + outbox 表在同一本地事务中提交
发布中继轮询或 CDC 捕获 outbox 变更并投递
消费端仍需幂等:投递语义通常是至少一次

表结构与中继(SQL 示意)

表结构与中继(SQL 示意)
CREATE TABLE outbox (
  id BIGINT PRIMARY KEY,
  aggregate_id VARCHAR(64),
  payload JSON,
  status TINYINT,     -- 0 待发 1 已发
  retry INT DEFAULT 0,
  created_at DATETIME
);
-- 中继:取待发记录 → 投递成功 → 标记已发
中继失败可重放:outbox 记录保留状态(待发/已发)与重试次数,便于观测与补偿。

易错点

  • 先写库再发消息(无 outbox),中间故障导致消息丢失
  • outbox 表无限增长,未做归档与清理

数据来源与参考

  • microservices.io 模式目录:Transactional Outbox
  • Debezium 文档:Outbox Event Router
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌