• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
江徽1993
烟花散尽,不问繁华
博客园    首页    新随笔    联系   管理    订阅  订阅

关于在事务中保证消息一致性的解决方案

1,结合数据库事务和消息表保证一致性
将订单持久化在同一个事务里,共享订单操作的数据库连接,在这个连接里将消息持久化到同一个实例里的消息库里,
然后在事务提交之后将消息发送到消息的 server。如果事务回滚了,消息就不会发送出去了。

消息如果发送成功了,会将消息表里的消息删除,而此时如果消息发送失败了,后台有一个任务会把消息表里面发送失败的消息重新进行发送,这样最终达到一致性,保证业务操作成功了,消息一定能发出去。

2,Producer向Broker两次确认消息状态
每次发送新的消息,直接发给Broker,这个消息发给Broker并不立即将消息投递出去。

然后做本地的业务操作,再调Broker的接口,这一步真正把消息发送出去。

如果这个时候,即使第二步操作成功,第三步发送失败了,第一步发送给Broker的消息就是一个未决状态。

Broker反过来询问 Producer,那条消息是发还是不发出去呢?

这种模型就不需要一个将一个消息库放在业务库实例了,比较灵活,成本也更低些。
但是业务使用的复杂度可能要高一些,需要提供一个接口供 Broker 反查。

。。。持续更新。。。

posted @ 2020-07-22 16:26  江徽1993  阅读(535)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3