分布式事务之最终一致性实现方案

简介: 分布式事务之最终一致性实现方案

文章目录:

  • 前言
  • 什么是最终一致性?
  • 实现方案
  • 代码实现
  • 小结
  • 推荐阅读

前言

这篇文章是《关于分布式事务的理解》的后续篇:分布式事务之最终一致性实现方案。

还是那个电商需求,一个订单支付完成后的业务场景,有如下操作:

  1. 更改订单的状态为 “已支付”
  2. 扣减商品库存
  3. 给会员增加积分
  4. 创建出库单通知仓库发货

咱们使用 最终一致性方案 去实现它。

什么是最终一致性?

从字面上看就是 保证数据最后的一致性 就可以了。

为了减少系统代价,如果中间节点处理失败,其他节点一般不会自动回滚,而是通过重试机制和人工参与的方式对失败数据进行处理,从而来保证数据最后的一致性。

实现方案

使用 本地消息表 + 后台任务 + 消息队列 + 接口幂等性。

本地消息表:在对应业务数据库中增加的本地消息表,这张表存储业务产生的消息,通过 本地事务 保证业务数据和消息数据的一致性,比如:msg_publishedmsg_received 表示发布消息表和接收消息表,在消息表中会有一个状态来标识业务是否执行成功。

后台任务:当消息表中有执行失败的业务信息时,后台任务就会按照配置的重试策略进行重试,例如重试策略为当发送和消费消息的过程中失败会立即重试 3 次,在 3 次以后将进入重试轮询;重试将在发送和消费消息失败的 4分钟后 开始,这是为了避免设置消息状态延迟导致可能出现的问题;后续就会每隔 1 分钟之后重试一次,默认的最高重试次数为 50 次,当达到 50 次时,就不会重试了,通过发邮件/微信/钉钉/短信的方式通知人工去处理,通知时需要考虑消息降噪。

消息队列:跨服务之间的调用使用消息队列,来实现服务解耦。

接口幂等性:接口需要保证同一操作发起的一次请求或者多次请求的结果必须是一致的。

代码实现

推荐一个 C# 开源项目 CAP[1],大家可以参考一下。

f7e64f97d76b72f566962c2e65c6b812.png

这个项目只支持 C# 代码去集成,如果是其他语言可以参考其设计思路,然后进行一个简单的实现。

小结

本文纯属抛砖引玉,有问题,欢迎批评指正。

你有更好的实现方案吗?欢迎留言~

推荐阅读

参考资料

[1]

CAP: https://github.com/dotnetcore/CAP

目录
相关文章
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
1月前
|
消息中间件 缓存 算法
分布式系列第一弹:分布式一致性!
分布式系列第一弹:分布式一致性!
|
1月前
|
算法 Java 关系型数据库
漫谈分布式数据复制和一致性!
漫谈分布式数据复制和一致性!
|
3月前
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
112 11
|
3月前
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
113 8
|
3月前
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
|
3月前
|
存储 NoSQL MongoDB
(四)成为分布式高手必经之路:理解那些工作在分布式系统底层的一致性模型
在分布式领域里,一致性成为了炙手可热的名词,缓存、数据库、消息中间件、文件系统、业务系统……,各类分布式场景中都有它的身影,因此,想要更好的理解分布式系统,必须要理解“一致性”这个概念。本文就展开聊聊 分布式系统里的一致性模型。
|
3月前
|
Oracle 关系型数据库
分布式锁设计问题之Oracle RAC保证多个节点写入内存Page的一致性如何解决
分布式锁设计问题之Oracle RAC保证多个节点写入内存Page的一致性如何解决
|
3月前
|
消息中间件 存储 监控
消息队列在分布式系统中如何保证数据的一致性和顺序?
消息队列在分布式系统中如何保证数据的一致性和顺序?
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?

热门文章

最新文章