Dual-Write Problem 双写问题(微服务)

原文链接https://www.confluent.io/blog/dual-write-problem/

双写问题发生于当两个外部系统必须以原子的方式更新时。

问题

说有人到银行存了一笔钱,触发 DepositFunds 命令,DepositFunds 命令被发送到Account microservice。

Account microservice需要做两件事,修改过数据库 和 发送消息到kafka。

                                Figure 1: A microservice writes to two separate systems.

如果在修改数据成功之后, 系统崩溃,发送kafka 消息失败,这样就造成了相关kafka事件丢失。

                                        Figure 2: A failure results in a missing event.

同样的问题也会发生于任何系统,包括 monolithic和microservice 系统, 只要是尝试写两入两个独立的系统,却只有其中一个操作成功。

解决办法

事务发件箱模式 (transactional outbox pattern )

同时利用了数据库事务和重试机制。

这种模式其实就是在 Account microservice 写数据库表的同时,把要发到kafka的消息先写入一张outbox表。这里写入的两张表在同一个事务(transaction)里完成。

至于outbox 表中的数据,可以由专门的程序负责读取和发送到kafka,也可以利用CDC(change data capture)完成。对于发送失败可以加入retry。在确定发送成功之后,可以删除outbox表中的数据。

                                        Figure 9: The transactional outbox pattern.

Event sourcing

事务发件箱模式不合适于不支持事务的数据库,而不依赖于数据库事务的就是 event sourcing。

这种模式不另外写一张表来保存要发送的数据,而是在原来表上(这里原来的表是存放的event,而不是事物发件箱模式中的数据)加一个flag,来过滤那些已经发送过了。

(😂是不是觉得很。。。 反正我看到这里,哎!😂)

The listen-to-yourself pattern

和 event sourcing很像,只不过event sourcing是先写表,在发送至kafka。

而 listen-to-yourself pattern 是直接写入kafka。在从kafka接收消息来修改数据库,同时写表需要retry跟上。

只不过就是这个先后顺序问题,写表虽会最终一致,但若在未写表之时,访问数据库则问题出现。

若系统可接纳,则无所谓。

其它解决办法

        还有其他解决双写问题的方法,我们在这里没有介绍。其目的不是暗示这些是解决问题的唯一方法,而是强调在事件驱动系统中特别有用的具体解决方案。

        在某些情况下,可以使用两阶段提交( two-phase commit  aka 2PC)、扩展架构(extended architecture aka XA)事务和传奇模式(saga pattern)等技术来规避(circumvent)这个问题。然而,它们具有复杂性,可能不适用于所有技术,因此在实施它们之前,请确保您了解权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490333.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactPress最佳实践—搭建导航网站实战

Github项目地址:https://github.com/fecommunity/easy-blog 欢迎Star。 近期,阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress,ReactPress一个基于 Next.js 的博客和 CMS 系统,可查看 demo站点。(…

什么叫ip地址一样?网络ip地址一样说明什么

在探索网络世界的奥秘中,IP地址作为网络设备的唯一身份标识,其重要性不言而喻。然而,当我们遇到“IP地址一样”的情况时,不禁会产生诸多疑问:这究竟意味着什么?是否会对网络产生影响?虎观代理小…

C# 探险之旅:第三十二节 - 类型class之(方法重载Overloading):魔法技能的大变身!

嘿,各位勇敢的探险家们!欢迎再次踏上C#的奇幻旅程。今天,我们要一起探索一个超级有趣的魔法技巧——方法重载(Overloading)!想象一下,你有一个超级技能,但是这个技能可以根据不同的情…

kubervirt使用与运行策略

三、KubeVirt基本命令 3.1查看virtctl版本&#xff0c;说明安装成功 [rootk8s-master ~]# virtctl version 3.2创建和管理虚拟机 列出所有可用的虚拟机实例 [rootmaster ~]# kubectl get vmi -n <namespace> 参数-n用于指定命名空间 查看特定虚拟机实例的详细信息 […

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

【python因果库实战2】使用银行营销数据集研究营销决策的效果2

目录 联系方式的效应 逆概率加权&#xff1a;首次尝试 联系方式的效应 我们已经完成了大部分艰苦的工作&#xff0c;即理解数据并识别处理变量和混杂因素。现在我们可以开始使用 Causal Inference 360 的工具了。 我们将首先研究联系方式 contact 的因果效应。具体来说&…

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构&#xff0c;由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树&#xff0c;根朝上&#xff0c;分支向下。 根结点没有前驱结点&#xff0c;可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…

运维 mysql、redis 、RocketMQ性能排查

MySQL查看数据库连接数 1. SHOW STATUS命令-查询当前的连接数 MySQL 提供了一个 SHOW STATUS 命令&#xff0c;可以用来查看服务器的状态信息&#xff0c;包括当前的连接数。 SHOW STATUS LIKE Threads_connected;这个命令会返回当前连接到服务器的线程数&#xff0c;即当前…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …

STM32仿真——01创建工程

目录 1.需要用到的软件工具​编辑 2.第一步Proteus软件新建工程​编辑 3.第二步——stm32cubumx 4、MDK代码编写 #注意安装的过程或者使用过程使用英文&#xff0c;以防报错&#xff1b; 1.需要用到的软件工具 2.第一步Proteus软件新建工程 选中&#xff0c;默认 先布局&…

相位小数偏差(UPD)估计基本原理

PPP中的一个关键性难题在于非差模糊度固定&#xff0c;成功固定非差模糊度可以使 PPP 的收敛速度和定位精度得到显著提升 。 相位小数偏差 (UPD) 是致使相位模糊度失去整数特性的主要因素&#xff0c;精确估计并校正 UPD 是实现非差模糊度固定的重要前提&#xff0c;也是实现…

我们来编程 -- win11多jdk版本切换

题记 售前的酒喝到位了调研需求及文档整理出来了开发要入场了&#xff0c;真惨啊&#xff01;年底了&#xff0c;手里活干的好好的&#xff0c;因为flyback在项目地&#xff0c;硬是被安排进来了拥抱变化&#xff0c;我呸…不得不切换系统&#xff0c;构建代码&#xff0c;一股…

飞腾派4g版本笔记一

飞腾派4g版本开箱体验 开箱包裹内容 打开包装&#xff0c;你可以看到以下物品 一个绿联的usb3.0读卡器、sandisk的32g内存卡(太好了)飞腾派4g版本开发板带散热风扇&#xff08;通过DDR存储的丝印看到是长鑫存储&#xff0c;即为4g内存版本&#xff09;输出为12v 3A的电源适配…

从零用java实现 小红书 springboot vue uniapp (2)主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了主页的布局 今天我们具体的去进行实现 并且分享我开发时遇到的问题 首先先看效果 java仿小红书主页 实现效果为 1.顶端全屏切换 2.上划加载更多 3.下拉当前页整体刷新 顶端全屏切换我们选择 gui-switch…

3D 生成重建031-One-2-3-45多视图+Neus生成3D

3D 生成重建031-One-2-3-45多视图Neus生成3D* 文章目录 0 论文工作论文方法2 实验结果 0 论文工作 单图像三维重建是一项重要但极具挑战性的任务&#xff0c;需要对现实世界有深入的了解。许多现有的方法通过在二维扩散模型的引导下优化神经辐射场来解决这个问题&#xff0c;但…

JAVA:访问者模式(Visitor Pattern)的技术指南

1、简述 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你将操作分离到不同的对象中,而无需修改对象本身的结构。这种模式特别适合复杂对象结构中对其元素进行操作的场景。 本文将介绍访问者模式的核心概念、优缺点,并通过详细代码示例展示如何在实际应用中实现…

【C++】数的性质问题分析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目解析与分析题目描述题目分析 &#x1f4af;我的解法与详细解读初始代码实现解法分析 &#x1f4af;老师解法与其改进思路老师代码实现改进与优势 &#x1f4af;对比分析…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能&#xff0c;这是一项用途广泛的创新工具&#xff0c;专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者&#xff0c;这项功能都能帮助快速生成、优化和编辑文案&#xff0c;提升效率的同时提高内容质量…

分布式事物XA、BASE、TCC、SAGA、AT

分布式事务——Seata 一、Seata的架构&#xff1a; 1、什么是Seata&#xff1a; 它是一款分布式事务解决方案。官网查看&#xff1a;Seata 2.执行过程 在分布式事务中&#xff0c;会有一个入口方法去调用各个微服务&#xff0c;每一个微服务都有一个分支事务&#xff0c;因…

深度学习——激活函数、损失函数、优化器

深度学习——激活函数、损失函数、优化器 1、激活函数1.1、一些常见的激活函数1.1.1、sigmoid1.1.2、softmax1.1.3、tanh1.1.4、ReLU1.1.5、Leaky ReLU1.1.6、PReLU1.1.7、GeLU1.1.8、ELU 1.2、激活函数的特点1.2.1、非线性1.2.2、几乎处处可微1.2.3、计算简单1.2.4、非饱和性1…