【分布式技术专题】「数据一致性体系」带你一同建立采用消息队列实现的数据一致性框架技术体系方案

带你一同建立采用消息队列实现的数据一致性框架技术体系方案

  • 分布式服务数据一致性问题
    • 采用分布式事务
      • 3PC模式
        • 3PC模式阶段分析
    • 采用分布式锁
    • 采用数据同步机制
    • 采用数据分片机制
    • 针对常规方案所具有的问题
      • 预发送消息阶段
      • 切换为可发送状态
      • 定时补偿更新为可发送状态
      • 定时补偿发送数据到下游业务服务
  • 分布式数据一致性框架总结

分布式服务数据一致性问题

分布式服务的数据一致性问题是指在分布式系统中,由于数据的复制和分布在不同的节点上,可能会出现数据不一致的情况。这种情况可能会导致系统的错误行为,甚至会影响到系统的可用性和可靠性。

为了解决分布式服务的数据一致性问题,可以采用以下几种方法:

采用分布式事务

分布式事务是一种保证分布式系统中数据一致性的方法。
在这里插入图片描述
在分布式事务中,所有的操作要么全部成功,要么全部失败,从而保证了数据的一致性,例如我们的2PC协议模式下的处理方式。
在这里插入图片描述

3PC模式

三阶段提交协议(3PC):3PC是在2PC的基础上进行改进的一种分布式事务协议,它通过引入超时机制来避免2PC中的阻塞问题。3PC协议分为三个阶段:CanCommit阶段、PreCommit阶段和DoCommit阶段。
在这里插入图片描述

3PC模式阶段分析

  • CanCommit阶段,协调器会向各个节点发送CanCommit请求,各个节点需要回复CanCommit就绪或者CanCommit失败。
  • PreCommit阶段,协调器会向各个节点发送PreCommit请求,各个节点需要回复PreCommit就绪或者PreCommit失败。
  • DoCommit阶段,协调器会向各个节点发送DoCommit请求,各个节点需要回复Commit成功或者Commit失败。
    在这里插入图片描述

采用分布式锁

分布式锁可以保证在分布式系统中只有一个节点可以对数据进行修改,从而避免了数据的冲突和不一致。
在这里插入图片描述

采用数据同步机制

数据同步机制可以将数据在不同节点之间进行同步,从而保证数据的一致性。
在这里插入图片描述

采用数据分片机制

数据分片机制可以将数据分成多个片段,每个节点只负责处理其中的一部分数据,从而减少了数据的复制和分布,降低了数据不一致的风险。
在这里插入图片描述

总之,分布式服务的数据一致性问题是一个复杂的问题,需要综合考虑多种因素,采用多种方法来解决。

针对常规方案所具有的问题

针对上述方案其实还是很有很多的弊端和问题所在,比如说存在着可用性的问题,因为很多的弊端和问题所在,比如说存在着可用性的问题,因为上述所能够成立的原因是由于mq的可用性没有问题。

那么如果一旦消息队列出现了宕机或者是我们的业务服务出现了宕机的时候,再处理过程中那么数据的一致性就很难能够保证了。

因此我们就推出了我们自己设计一套分布式事务结合消息队列所形成的一致性框架,整体流程图如下所示。
在这里插入图片描述
总体分为以下几个阶段:

预发送消息阶段

在这里插入图片描述

  1. 执行业预先发送消息操作,发送到消息服务中心,当只有发送成功之后才会执行业务方法。
  2. 执行业务方法操作。
  3. 当消息中心收到了预发送消息之后,进行存储消息数据到数据库中。

切换为可发送状态

在这里插入图片描述

  1. 当业务执行结束之后,进入可发送状态阶段,通知发送消息通知消息服务中心。
  2. 当发送成功之后切换为可发送状态,默认为待发送状态。

定时补偿更新为可发送状态

在这里插入图片描述

  1. 定时任务01,定时扫描的捞取待发送数据信息,从数据库中。
  2. 根据捞取的消息数据信息,通过业务id,请求到业务中心,进行判断是否该业务信息数据是否已经完成。
  3. 如果是未完成,直接忽略,如果是已完成则进行请求到消息中心,要求其修改状态为可发送状态。
  4. 更新消息中心的数据库为可发送状态。

定时补偿发送数据到下游业务服务

在这里插入图片描述

  1. 定时任务02,定时扫描的捞取可发送数据信息,从数据库中。
  2. 发送消息到下游服务,通过消息队列服务。
  3. 下游业务服务,幂等性消费到下游业务服务。
  4. 更新业务中心的数据库为业务数据状态跃迁。

分布式数据一致性框架总结

通过消息队列实现数据的一致性问题,可以考虑以下几种要点:

  1. 采用事务消息:事务消息是一种保证消息队列中消息的原子性、一致性和持久性的方法。在事务消息中,消息的发送和确认是在同一个事务中完成的,从而保证了消息的一致性。

  2. 采用幂等性处理:幂等性处理是指对于同一个消息的多次处理结果是相同的。通过在消息队列中对消息进行幂等性处理,可以避免重复处理消息,从而保证数据的一致性。

  3. 采用消息确认机制:消息确认机制是指在消息队列中,消费者在消费消息后需要向消息队列发送确认消息,从而保证消息已经被正确处理。通过消息确认机制,可以保证消息的可靠性和一致性。

  4. 采用消息重试机制:消息重试机制是指在消息队列中,当消息处理失败时,可以将消息重新发送到消息队列中,从而保证消息的可靠性和一致性。

总之,通过消息队列实现数据的一致性问题,需要综合考虑多种因素,采用多种方法来解决。在实际应用中,需要根据具体的场景和需求来选择合适的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础篇--基本数据类型

目录 前言: 内置数据类型 类型默认值 示例: 内置数据类型转换 自动类型转换(隐式类型转换): 强制类型转换(显式类型转换): 隐含强制类型转换: 引用类型 前言: …

浅谈JVM中的即时编译器(Just-In-Time compiler, JIT)

Java虚拟机(JVM)中的即时编译器(Just-In-Time compiler, JIT)是一个非常重要的组件,它负责将字节码转换为本地机器代码。在不使用JIT的情况下,JVM通过解释字节码来执行程序,这意味着它会为每个字…

Vue2嵌入HTML页面空白、互相传参、延迟加载等问题解决方案

一、需求分析 最近做的一个用H5加原生开发的html项目,现需要集成到Vue2.0项目里面来。遇到的相关问题做个记录和总结,以便能帮到大家避免踩坑。 二、问题记录 1、页面空白问题 将html页面通过iframe的方式嵌入进来之后,发现页面是空白的&am…

2023牛客暑期多校训练营7(C/I/M)

目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。 首先,由题…

商品推荐系统浅析 | 京东云技术团队

一、综述 本文主要做推荐系统浅析,主要介绍推荐系统的定义,推荐系统的基础框架,简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学,本人水平有限,欢迎大家指正。 二、商品…

独立站如何进行Facebook广告投放?关于广告投放策略的真相

谷歌广告是独立站卖家推广引流的首选渠道,那么谷歌广告该如何投放?在这个过程中有哪些需要特别注意的吗? 创建Facebook广告账户: 访问Facebook广告管理平台(Ads Manager)并创建一个广告账户。您需要提供一…

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…

【ArcGIS Pro二次开发】(56):界址点导出Excel

界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 一、要实现的功能 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。…

linux文件I/O之 open() 函数用法

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> typedef unsigned int mode_t ; int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 函数功能 打开或创建一个文件 返回值 成功…

21、springboot的宽松绑定及属性处理类的构造注入

springboot的宽松绑定及属性处理类的构造注入 ★ 如何使用属性处理类所读取的属性 属性处理类最终变成了Spring容器中的一个Bean组件&#xff0c;因此接下来Spring即可将该Bean组件注入任意其他组件。 这种做法的好处是&#xff1a;可以将大量的配置信息封装一个对象——所以…

JavaScript的三大组成部分是什么?JavaScript的核心组成部分解析:语法、BOM和DOM

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【uniapp】封装一个全局自定义的模态框

【需求描述】 在接口401处&#xff0c;需要实现全局提示并弹出自定义模态框的功能。考虑到uni-app内置的模态框和app原生提示框的自定义能力有限&#xff0c;我决定自行封装全局自定义的模态框&#xff0c;以此为应用程序提供更加统一且个性化的界面。 【效果图】 【封装】 主…

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…

MySQL面试1

Mysql的面试突击1 Mysql的体系结构是什么样子的&#xff08;查询语句怎么进行执行的&#xff09; mysql的架构&#xff1a;单进程多线程的架构模式 CLient -----> Server架构 Mysql的链接方式有没有性能优化的点 2个点 查询缓存(Query Cache) MySQL 内部自带了一个缓存模…

Direct path read LOB

Table full scan &#xff1a; wait event Direct path read because of LOB "Direct path read" Wait Event During LOB Access (Doc ID 2287482.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Database …

数据结构--栈和队列

文章目录 栈的概念和结构栈的实现栈的数据结构栈的初始化和销毁出栈和入栈获取栈顶、大小&#xff0c;判空 队列的概念和结构队列的实现队列的数据结构队列的初始化和销毁队列的插入 队列的删除获取队头和队尾的数据获取队列长度和判空 栈和队列的一些题目1.有效的括号2.用队列…

教你连接本地树莓派

如何连接本地树莓派 文章目录 如何连接本地树莓派前言1. 操作流程2. 打开树莓派SSH功能3. 确认树莓派信息后 安装相应SSH客户端 前言 树莓派作为一款以教育为目的推出的硬件系统&#xff0c;也是超低功耗的微型“准系统”&#xff0c;能够提供基础的电脑应用体验。而得益于其极…

微信开发之获取标签详情的技术实现

简要描述&#xff1a; 获取标签列表 请求URL&#xff1a; http://域名地址/getContactLabelList 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

服务限流治理

一、基础概念 1.什么是服务限流&#xff1f; 限流在日常生活中也很常见&#xff0c;比如节假日你去一个旅游景点&#xff0c;为了不把景点撑爆&#xff0c;管理部门通常会在外面设置拦截&#xff0c;限制景点的进入人数&#xff08;等有人出来之后&#xff0c;再放新的人进去…

为什么还有很多人不喜欢使用微信电话?让人感到困扰

尽管微信电话在技术上非常便利和实用&#xff0c;但仍然有很多人不太喜欢使用它。这引发了一个问题&#xff1a;为什么还有这么多人对微信电话感到困扰呢&#xff1f; 一、容易造成隐私泄露 在很多情况下&#xff0c;我们经常会收到好友的微信电话。然而&#xff0c;如果在这个…