微服务 - 分布式事务
- 强一致性:两阶段、三阶段提交协议
- 最终一致性:TCC、可靠消息投递模式、补偿对账模式
可靠消息投递模式(可靠事件模式)
方案特点:正反向消息机制,补偿=》重新投递
步骤原理:
1、生产者服务插入跨DB事务消息,到本地数据库消息表
2、生产者服务发送消息到消息队列
3、消费者服务从消息队列获取消息,ACK确认从消息队列移除消息
4、插入本地判重表,执行完成,再次发送返回消息给消费队列
5、生产者取消费者ACK消息消息
6、更新本地消息表消息状态已完成
7、本地定时任务取超时消息,重新发送
通用异步架构设计
两个MQ消费端作业: 消费端消费消息,生产者接受处理完成的消息
一个定时补偿作业:扫描超期消息,重新发送
1、生产者:
实时接口调用:基于不同微服务(跨DB) 记载异步本地消息,记载请求事件
消费者确认消息作业:取MQ完成消息,更新本地消息表完成
定时任务:定时取生产者消息过期任务,重新发送消息;
2、消费者:
消费者消费MQ作业:轮训MQ消息,如果本地判重表不存在,插入本地判重表和本地线程池
线程池定时任务根据不同的请求事件类型,不断调用消费者不同业务服务并行消费;
消费完发送消费完成消息给生产者
实时异步架构
问题:如何把订单数据实时、准确无误地同步到这么多异构系统中?
Canal 从 MySQL 收到 Binlog 并解析成结构化数据之后,直接写入到 MQ 的一个订单 Binlog 主题中,然后每一个需要同步订单数据的业务方,都去订阅这个 MQ 中的订单 Binlog 主题,消费解析后的 Binlog 数据。在每个消费者自己的同步程序中,它既可以直接入库,也可以做一些数据转换、过滤或者重新计算后再入库。
问题:如何保证数据同步实时性?
分析:Canal和MQ没有业务逻辑,性能非常好,容易出现瓶颈的是消费MQ的同步程序。
MySQL主从同步Binlog,是单线程同步,原因在于执行Binlog时候,必须顺序执行,才能保证数据和主库一样;保证数据一致性,Binlog顺序很重要,不能乱序
MySQ实例,整个链路必须单线程串行执行,MQ主题也必须设置成只有1个分区(队列),才能保证数据同步的Binlog严格有序
因果一致性:
首先根据下游同步程序的消费能力,计算出需要多少并发;然后设置 MQ 中主题的分区(队列)数量和并发数一致。因为 MQ 是可以保证同一分区内,消息是不会乱序的,所以我们需要把具有因果关系的 Binlog 都放到相同的分区中去,就可以保证同步数据的因果一致性。对应到订单库就是,相同订单号的 Binlog 必须发到同一个分区上
Canal 自带的分区策略就支持按照指定的 Key,把 Binlog 哈希到下游的 MQ
https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
总结:
对于海量数据,必须要按照查询方式选择数据库类型和数据的组织方式,才能达到理想的查询性能。这就需要把同一份数据,按照不同的业务需求,以不同的组织方式存放到各种异构数据库中。
因为数据的来源大多都是在线交易系统的 MySQL 数据库,所以我们可以利用 MySQL 的 Binlog 来实现异构数据库之间的实时数据同步。
为了能够支撑众多下游数据库实时同步的需求,可以通过 MQ 解耦上下游,Binlog 先发送到 MQ 中,下游各业务方可以消费 MQ 中的消息再写入各自的数据库。
如果下游处理能力不能满足要求,可以增加 MQ 中的分区数量实现并发同步,但需要结合同步的业务数据特点,把具有因果关系的数据哈希到相同分区上,才能避免因为并发乱序而出现数据同步错误的问题
问题:如果说下游的某个同步程序或数据库出了问题,需要把 Binlog 回退到某个时间点然后重新同步,这个问题该怎么解决?
如果下游只有一个同步程序,那直接按照时间重置Canal实例的位点就可以了。
如果MQ的下游有多个消费者,这个时候就不能重置Canal里的位点了,否则会影响到其它的消费者。正确的做法是,在MQ的消费订阅上按照时间重置位点,这样只影响出问题的那个订阅。所以,这种架构下,MQ中的消息,最好将保存时间设置得长一些,比如保留3天
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· DeepSeek “源神”启动!「GitHub 热点速览」