Transactional Outbox
事务发件箱
事务发件箱会在同一个本地数据库事务中,保存数据改动和消息记录。事务提交后,再由中继程序发送已经保存的消息。
local transaction(business row + outbox row) -> relay/CDC -> broker -> idempotent consumerorders✓order_2048outbox✓evt_784local transaction(business row + outbox row) -> relay/CDC -> broker -> idempotent consumerJOB另一个例子
结账会在同一个事务中保存订单 `984` 和发件箱事件 `OrderCreated:984`,再由中继程序稍后发布。中继程序如果在发送后、标记记录前停止,可能会再次发送。消费者要用事件 ID 去除重复。
主要部分
- 01业务数据改动
- 02发件箱事件记录
- 03同一个本地事务
- 04中继程序或变更流
- 05消息代理发布
- 06可安全处理重复的消费者
什么时候用
数据库改动提交后,必须可靠地产生消息或事件时,可以使用事务发件箱。发件箱记录要和数据放在同一个事务,中继程序也要独立可靠地运行。
什么时候不要用
不要把它说成只会发送一次,也不要说成跨服务的一次事务。仍要处理重复事件、事件顺序、中继延迟、记录清理和安全防重复。
代码里的名称
local transaction(business row + outbox row) -> relay/CDC -> broker -> idempotent consumer 上线前要检查
检查接口约定、任何情况下都不能破坏的规则、授权与输入限制。测试重试、重复执行只生效一次、超时与部分失败。验证数据完整性、兼容性、监控、恢复与回到上一版。
预期结果:为这套系统设计或检查 事务发件箱 (Transactional Outbox),并让数据保持正确、安全且容易维护。 用户场景:结账会在同一个事务中保存订单 `984` 和发件箱事件 `OrderCreated:984`,再由中继程序稍后发布。中继程序如果在发送后、标记记录前停止,可能会再次发送。消费者要用事件 ID 去除重复。 技术概念或控制措施:事务发件箱 (Transactional Outbox)。 适用理由:数据库改动提交后,必须可靠地产生消息或事件时,可以使用事务发件箱。发件箱记录要和数据放在同一个事务,中继程序也要独立可靠地运行。 不应使用的情况:不要把它说成只会发送一次,也不要说成跨服务的一次事务。仍要处理重复事件、事件顺序、中继延迟、记录清理和安全防重复。 工程要求:定义输入、输出、接口约定,以及任何情况下都不能破坏的规则。说明授权与输入检查范围。定义失败、超时、重试和重复执行只生效一次的规则。也要定义数据迁移与兼容限制。 运营要求:加入监控信号与隐藏敏感数据的日志。设置容量上限并写好操作手册。测试恢复与回到上一版的流程。 验收标准:接口约定与失败路径测试通过。重试或部分失败时,数据与授权规则仍正确。性能上限、监控、恢复与回到上一版的方法都已验证。 证据与限制(证据边界):没有一份官方标准能涵盖全部内容。不同团队、平台或框架的用法可能不同。 待确认:程序运行环境、数据位置、流量形态、数据一致需求和安全边界。也要确认兼容周期、服务目标(SLO)与恢复上一版的限制。
检查这份需求
请 AI 编程助手检查当前如何使用 事务发件箱 (Transactional Outbox)。 定义:事务发件箱会在同一个本地数据库事务中,保存数据改动和消息记录。事务提交后,再由中继程序发送已经保存的消息。 生产环境检查:检查接口约定、任何情况下都不能破坏的规则、授权与输入限制。测试重试、重复执行只生效一次、超时与部分失败。验证数据完整性、兼容性、监控、恢复与回到上一版。 修改程序前,先列出看到的证据、缺口、严重程度,以及最小且安全的修正。