简介: 本文介绍了双写场景的一致性问题,详细介绍了三种解决方案,并针对DB->Binlog->Kafka方案给出了Lindorm数据订阅的最佳实践

双写问题介绍

双写问题(Dual Write Problem)是指:需要同时修改两个独立系统的场景,比如Database和Kafka,再比如Database和缓存,那么如何保障两个系统的数据一致性?

以Database和Kafka这种常见的场景为例,我们可以有这么几种方式:

  1. 并发写Database和Kafka
  2. 先写Kafka,再写Database
  3. 先写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上的强一致读。

基于业务场景决策

上面我们介绍了双写问题的三种解决方案,他们各自适应不同场景。

  1. 如果业务要求全盘的强一致体验,那么我们应当选择分布式事务。
  2. 如果业务倾向全盘的最终一致性体验,那么我们选择以MQ为第一入口实现最终一致性。
  3. 如果业务存在不同的一致性体验需求,那么我们选择强一致读写DB,以DB binlog实现最终一致性的下游业务。

Lindorm 数据订阅介绍

Lindorm数据订阅是 "DB->Binlog->Kakfa"方案的升级版。

云原生多模数据库Lindorm数据订阅功能支持任何一个表的每一条数据变更,可以在客户端实时有序的查看数据变更记录。当开通某一张表的数据订阅功能后,其变更数据的操作就会被存储。为了确保数据消费的顺序和数据写入的顺序一致,数据订阅功能提供了主键级别保序,对于同一个主键的更新操作,会按照其更新的顺序存储和消费。每次对Lindorm表格的数据执行增删改操作时,数据订阅都会生成一个Stream Record键值对,键值对的键是这一行数据的主键,值是此次操作的详细信息(操作前的值,操作后的值,时间戳,操作类型)。

总结Lindorm数据订阅的特点:

  1. 实时订阅
  2. 100%兼容Kafka客户端
  3. Key级别保序

原文链接
本文为阿里云原创内容,未经允许不得转载。

拒绝双写:巧用Lindorm数据订阅相关推荐

  1. Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写

    一.简介 Elasticsearch 集群的高可用,跨机房做异地灾备,确保在某个机房不可用时,还能持续对外提供业务,对比了多个双活Elasticsearch 集群同步之后,最后选择了借助消息队列实现双 ...

  2. Ceph BlueStore 和双写问题

    论开源分布式存储,Ceph大名鼎鼎.用同一个存储池融合提供块存储.对象存储.集群文件系统.在国内有近年使用量迅速攀升,Ceph Day峰会也搬到北京来开了. 大型公司内部研发云虚拟化平台,常使用开源方 ...

  3. 缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

    缓存淘汰 为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得.为了利益最大化肯定要保留最重要的10个G. Redis本身提供了 ...

  4. 用日志构建坚固的数据基础设施/为什么双写不好

    1. 备注 本文译自https://www.confluent.io/blog/using-logs-to-build-a-solid-data-infrastructure-or-why-dual- ...

  5. mysql sync es 异步双写_mysql数据同步es方案思考

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 大体计划 1.双写 矫捷长处:简略. 错误谬误: a.停业代码耦合严重. b.如何保证双写成功 c.同步双写会增加响 ...

  6. 如何做数据平滑迁移:双写方案

    1.什么是数据迁移 数据迁移指的是将一批数据从同构存储系统(如MySQLA到MySQLB)或异构存储系统(如MySQL-MongoDB)间搬运迁移. 最简单的数据迁移方式是通过脚本或定时任务将数据进行 ...

  7. 教你从0到1搭建秒杀系统-缓存与数据库双写一致

    本文是秒杀系统的第四篇,我们来讨论秒杀系统中缓存热点数据的问题,进一步延伸到数据库和缓存的双写一致性问题. 在秒杀实际的业务中,一定有很多需要做缓存的场景,比如售卖的商品,包括名称,详情等.访问量很大 ...

  8. session.merge 缓存不更新_如何保证缓存与数据库双写时的数据一致性?

    在做系统优化时,想到了将数据进行分级存储的思路.因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息.基本上配置了很久才会变一次.而有一些数据实时性要求非常高,比如订单和流水的数据. ...

  9. 数据库和缓存双写一致性方案解析

    https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/81008933 https://zhuanlan.zhihu.com/p/4833 ...

最新文章

  1. 负载均衡算法及其Java代码实现
  2. 【数据结构与算法】之深入解析“买卖股票的最好时机含手续费”的求解思路与算法示例
  3. k8s中流量分离以及资源隔离实战
  4. 高通8X25Q wifi BT 调试文档
  5. mysql query 原理_[转]MySQL的Query Cache原理
  6. 95-130-348-源码-source-kafka相关-Handover
  7. 《小米网抢购系统开发实践》读后感
  8. 【SAS BASE】SAS函数
  9. 实战Node:幼教平台幼教资源部分实现
  10. SpingMVC 注解@RequestMapping、@SuppressWarnings、@Scheduled 定时器
  11. 网页上的文本不让你复制下载?老司机教你几招,轻松免费复制
  12. faster rcnn 计算mAP
  13. cubase手机版android,Cubase中文应用
  14. 超级好用的电脑截图翻译软件你值得拥有!
  15. Dos命令 --复制文件(夹)
  16. 【3D建模制作技巧分享】3dmax如何设置视图布局
  17. 如何给网页设置logo
  18. 软文成功案例,给企业带来的价值不可限量
  19. P7369 [COCI2018-2019#4] Elder 题解
  20. 2022年长沙市成人高考疫情防控政策

热门文章

  1. php 计划任务管理,使用php管理crontab计划任务
  2. 中国大学moocpython笔记_中国大学MOOC_高级语言程序设计(Python)笔记
  3. html信号动画,HTML5 Canvas火箭着陆和雷达信号动画
  4. daoi php_聊聊这些年用过的AOI
  5. 鼠标图标怎么自定义_酷鱼魔鼠——给鼠标添加酷炫的特效
  6. python调用系统_python 执行系统命令
  7. linux部署tomcat项目404_Tomcat部署项目的几种常见方式
  8. jdbc java连接oracle_java连接oracle jdbc连接
  9. vue打包上线部分css效果错乱,vue-cli2打包后css部分样式错乱
  10. perl python json_Perl解析JSON数据精解