拒绝双写:巧用Lindorm数据订阅
简介: 本文介绍了双写场景的一致性问题,详细介绍了三种解决方案,并针对DB->Binlog->Kafka方案给出了Lindorm数据订阅的最佳实践
双写问题介绍
双写问题(Dual Write Problem)是指:需要同时修改两个独立系统的场景,比如Database和Kafka,再比如Database和缓存,那么如何保障两个系统的数据一致性?
- 并发写Database和Kafka
- 先写Kafka,再写Database
- 先写Database,再写Kafka
并发写Database和Kafka
这种情况下需要分布式事务来支持强一致,否则不一致的情况就会比较复杂,Database和Kafka可能没有一个有完整的数据。
先写Kafka,再写Database
先写Kafka,成功后即可返回客户端成功,然后订阅Kafka消息入库Database,实现最终一致性。但这种异步化导致DB的数据更新延迟,会影响一些要求强一致读的场景。比如账单写入成功,但客户不能立即查看;再比如实时归因场景,Flink实时消费Kafka,在遇到交易事件后反查DB归因,但可能此时关键数据还没入库。
先写Database,再写Kafka
串行写Database、Kafka,成功后返回客户成功。这种方式问题也不小,第一写入延迟增加,第二Database成功、Kafka失败怎么处理?
此时我们会想到Binlog(或者WAL),新的方案是DB->Binlog->Kafka:写入Database,成功后即可返回客户端成功,然后订阅binlog写入Kafka,下游订阅Kafka消费。实现最终一致性,同时保证了Database上的强一致读。
基于业务场景决策
上面我们介绍了双写问题的三种解决方案,他们各自适应不同场景。
- 如果业务要求全盘的强一致体验,那么我们应当选择分布式事务。
- 如果业务倾向全盘的最终一致性体验,那么我们选择以MQ为第一入口实现最终一致性。
- 如果业务存在不同的一致性体验需求,那么我们选择强一致读写DB,以DB binlog实现最终一致性的下游业务。
Lindorm 数据订阅介绍
Lindorm数据订阅是 "DB->Binlog->Kakfa"方案的升级版。
总结Lindorm数据订阅的特点:
- 实时订阅
- 100%兼容Kafka客户端
- Key级别保序
原文链接
本文为阿里云原创内容,未经允许不得转载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-09-18 从零入门 Serverless | 函数计算的可观测性
2019-09-18 Apache Flink 1.9.0版本新功能介绍