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

前言

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

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

分布式事务.png

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

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

什么是最终一致性?

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

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

实现方案

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

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

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

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

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

代码实现

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

cap2.png

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

小结

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

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

推荐阅读


新亮笔记
技术的深度和广度只能靠自己努力去发掘,谁也不能替你学习,在这里希望你能有所收获。

日拱一卒

2.9k 声望
1.2k 粉丝
0 条评论
推荐阅读
关于项目中 Repository 层的思考
维护这一层的开发者,可以称为 仓库管理员 ,当使用者需要查询数据的时候,需要告诉仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。

新亮2阅读 1.8k评论 1

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.2k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.7k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go34阅读 2.6k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5.1k评论 9

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.2k评论 9

日拱一卒

2.9k 声望
1.2k 粉丝
宣传栏