拒绝双写:巧用Lindorm数据订阅
简介: 本文介绍了双写场景的一致性问题,详细介绍了三种解决方案,并针对DB->Binlog->Kafka方案给出了Lindorm数据订阅的最佳实践
双写问题介绍
双写问题(Dual Write Problem)是指:需要同时修改两个独立系统的场景,比如Database和Kafka,再比如Database和缓存,那么如何保障两个系统的数据一致性?
以Database和Kafka这种常见的场景为例,我们可以有这么几种方式:
- 并发写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数据订阅功能支持任何一个表的每一条数据变更,可以在客户端实时有序的查看数据变更记录。当开通某一张表的数据订阅功能后,其变更数据的操作就会被存储。为了确保数据消费的顺序和数据写入的顺序一致,数据订阅功能提供了主键级别保序,对于同一个主键的更新操作,会按照其更新的顺序存储和消费。每次对Lindorm表格的数据执行增删改操作时,数据订阅都会生成一个Stream Record键值对,键值对的键是这一行数据的主键,值是此次操作的详细信息(操作前的值,操作后的值,时间戳,操作类型)。
总结Lindorm数据订阅的特点:
- 实时订阅
- 100%兼容Kafka客户端
- Key级别保序
原文链接
本文为阿里云原创内容,未经允许不得转载。
拒绝双写:巧用Lindorm数据订阅的更多相关文章
- Redis面试题记录--缓存双写情况下导致数据不一致问题
转载自:https://blog.csdn.net/lzhcoder/article/details/79469123 https://blog.csdn.net/u013374645/article ...
- Redis中如何保证数据库和缓存双写时的数据的一致性?
简单的场景: 直接使用 1. 使用Cache Aside pattern 读取的时候,先读取缓存中是否有数据,缓存中没有数据,再去数据库中进行查询,查询出来以后,然后再存入到缓存中 更新的时候,先删除 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题
今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis ...
- nodeEE双写与分布式事务要点一二
数据库与缓存双写问题 计算机领域任何一个问题都可以通过增加一个抽象"层"来解决. 业务中为了减少热点数据不必要的db查询,往往会增加一层缓存来解决I/O性能.可是I/O多了一层也就 ...
- 借读:分布式锁和双写Redis
本帖最后由 howtodown 于 2016-10-3 16:01 编辑问题导读1.为什么会产生分布式锁?2.使用分布式锁的方法有哪些?3.本文创造的分布式锁的双写Redis框架都包含哪些内容? ...
- 谈谈对Canal(增量数据订阅与消费)的理解
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...
- 对 Canal (增量数据订阅与消费)的理解
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...
- PHP经典面试题:如何保证缓存与数据库的双写一致性?
只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说 ...
- PHP中高级面试题 一个高频面试题:怎么保证缓存与数据库的双写一致性?
分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside ...
随机推荐
- 移植openssh-7.5p1(包括openssl-1.0.2l、zlib-1.2.11)到HISI3520d(编译篇)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 【Leetcode】64. 最小路径和
题目(链接) 给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例 1: 输入:grid = [[1 ...
- 安全测试系列:《web安全深度剖析》读书笔记
一 基础 1.http请求流程: 请求.响应报文格式: 8种请求方式,get(长度有限制).head(用于测试资源是否存在,服务器不返回消息主体).post(传输大量数据).put(给服务器上传资源) ...
- verilog之简单时钟信号的编写
verilog之简单时钟信号的编写 1.数字时钟信号 在数字电路中,时钟信号是重要的一类信号,一般作为激励源驱动时序电路.掌握时钟信号的编写,对于时序电路的仿真具有重要意义.所有的时序电路都需要设置时 ...
- druid开启sql监控平台
1.maven导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid< ...
- Java面试题【4】
28)Java 栈和堆的区别 1 栈:为编译器自动分配和释放,如函数参数.局部变量.临时变量等等 2 堆:为成员分配和释放,由程序员自己申请.自己释放.否则发生内存泄露.典型为使用new申请的堆内容. ...
- CTFshow pwn31 wp
PWN31 使用checksec查看保护 发现除了canary剩下保护全开,那么就没有前面几个题目那么简单了,ida打开看见他给了我们main函数地址 虽然开了pie但是在他们之间的偏移是一定的,那么 ...
- #拉格朗日插值,线性筛#洛谷 5442 【XR-2】约定 (加强版)
题目 一个\(n\)个点的完全图, 第\(i\)个点到第\(j\)个点的边权是\((i+j)^k\), 现在把这个完全图变成一棵树, 求这棵树边权和的期望值 \((n\leq 10^{10000},k ...
- #搜索#CF525D Arthur and Walls
题目 给出一个\(n*m\)的矩阵,里面有""和"."两种符号,要求把最少的""变成".", 使得".&quo ...
- #约数#洛谷 4296 [AHOI2007]密码箱
题目 给定\(n(n\leq 2*10^9)\),求 \[\sum_{x=1}^n[x^2\bmod n==1] \] 分析 首先当\(n=1\)的时候需要特判, 否则1和\(n-1\)一定是答案, ...