TwKit
正在载入
TwKit

订单落库成功,消息却没发出去,下游就蒙在鼓里。反过来,消息先发了,数据库又回滚,也得乱套。 Transactional Outbox 把这两步拆开处理: •… · @BaiBtw · TwKit

@BaiBtw

订单落库成功,消息却没发出去,下游就蒙在鼓里。反过来,消息先发了,数据库又回滚,也得乱套。 Transactional Outbox 把这两步拆开处理: • 同一个数据库事务里,更新订单,同时把待发事件写进 outbox。一起提交,一起回滚。 • 独立的消息中继再读 outbox,把事件发给消息队列。 关系型数据库通常用一张 outbox 表;NoSQL 可以把待发消息放在记录属性里。中继可以轮询,也可以跟踪事务日志,不必把数据库和消息队列绑进两阶段提交。 但别把它理解成“绝不重复”。中继发完消息、还没记下成功就崩了,重启后可能再发一次。消费者仍要做幂等,比如记录已处理的消息 ID。 顺序也不能丢:同一业务对象先发生 T1、再发生 T2,对应 E1 就得先于 E2 发出,即使更新来自不同服务实例。 它兜住的是业务变更与待发事件一起落库。重复消费和消息顺序,仍然各有各的账。

曝光 27 · 评论 2 · 点赞 1 · 书签 0

查看原帖