当前位置: 首页 > news >正文

Go微服务: 分布式之通过本地消息实现最终一致性和最大努力通知方案

通过本地消息实现最终一致性


1 )概述

  • 我们的业务场景是可以允许我们一段时间有不一致的消息的状态的,并没有说必须特别高的这个消息的一致性
  • 比如说在TCC这个架构中,如果采用了消息的最终一致性,整体架构设计要轻松好多
  • 即便我们库存服务挂了,或者我们积分服务挂了也没有关系,只要我们有中间的这个消息,那就是没有问题的
  • 因为你在消息消费中,如果你你没有消费成功,那么消息就会一直存在在这个消息队列里

2 )场景

  • 看看这个我们的这个具体的案例的场景是什么样的?还是以这个订单服务和库存服务,还有积分服务为例
  • 比如说,现在要下个订单,直接就在订单服务里,把它搞定了,我们就正常下订单
  • 建立我们的订单表和我们的订单产品表,然后,这时候发送一条消息到这个消息队列里
  • 那么我们说这个如果我们发送失败了,我们本地这个订单服务也能感知到,它就进行回滚就可以了
  • 但是我们说突然的这个停电,这个我们就没办法感知到了
  • 另一种情况,说你发送这个成功了,比如说我们建这个订单单服务,然后订单生成了订单产品表,也生成了, 消息发送也成功了
  • 但是消息队列给我回消息的时候,由于网络的拥塞或者是抖动,这都很正常
  • 然后,我们这个订单服务,肯定是要有超时机制的,它就超时了,订单就要回滚
  • 但是这个这个消息队列是消息,可是真的到消息队列里存在了
  • 那我下游的就库存,还有积分服务就拿着这个消息去做自己的业务了,该扣减库存就扣减库存,该增加积分就增加积分
  • 但是,这个时候订单已经回滚了,那老板或者业务就会问了,这订单都没有了,你这个库存的积分增加是个什么意思
  • 那我们要怎么解决这个问题呢?
  • 那我们就是在我们这个订单服务增加订单的时候,我们不先去给他发这个消息
  • 我们是先在本地表里头建立一个消息发送这个各种情况的一张表
  • 比如说, 我这个订单服务,我建立了一条消息,但是这个消息没有返回来
  • 有没有返回来也没有关系,这个表里已经记录了,说可以定一种状态,说就是未发送成功
  • 我们这里这个本地消息表,就以发送成功的这个状态为准
  • 只要是你能记录到这个表里的,没有发送成功的,我们就把它这个状态记录上
  • 我们下次启动的时候,在这个订单服务里增加一个循环的这种定时任务
  • 我们一般是做成异步的,因为你要是同步的话,相当于本地的这个数据库也是也有造成一定的压力的
  • 我们就扫描这个之前没有发送成功的这个消息,那就是说直到我们这个定时任务,一直发送这个消息队列发送成功为止
  • 所以他一定是能达到最终一致性的,我们这个里面就有一个问题,说你没发送成功,我记录一条可以没问题
  • 那我下次一发送这个消息队列就成功了, 我回写消息本地这个表就记录了这条消息成功
  • 如果,遇到我们的这个库存服务了,或者积分服务挂了都没有问题
  • 因为你不消费消息队列里的这个消息,你就不会确认,你不会确认的这个消息就永远在消息队列里,这个就没有问题
  • 但是还有一种情况,比如我这个消息,可能发很多次都有问题,可能是消息队列问题或者网络等问题
  • 这样,重复发送就带来一个风险,比如下游如果重复消费怎么办?这个就是我们下游服务要解决的问题
  • 本地消息的最终一致性,比TCC要简单很多,但是在某些高并发的场景,它也是有自己的问题的
  • 如果一切正常,就发送,让消息队列让消费者去消费就可以了
  • 如果有问题,就建立一张本地的这个消息发送表,记录各种情况,它最后能保证我们消息的最终一致性,但是要解决重复消费消息的这种情况

最大努力通知方案

  • 我们想投递一个消息的时候,一定要想方设法投递给对方,就是最大努力通知方案
  • 在生活中,你买了这个货物,商家是一定要给你发货的,但是你今天不在家,明天也不在家
  • 这个快递小哥是不是一直给你投递,直到你在家为止,收到快递或指定存放地点或触发退回机制
  • 在计算机当中,就是说这个消息一定要投递给你
  • 在商场购物的支付系统中,无论是,银联或微信,支付宝选一个
  • 小明在点击付款之后,他就会跳转到这个相应的这个第三方支付的页面
  • 支付成功之后,支付系统就要发送一个通知给我们的商户,比如小A
  • 对于这个小商户来说,它的网络是否稳定?对于支付机构来说是不确定的
  • 目前支付系统已经入账,但是小A仍未收到通知,支付系统就会一直通知你
  • 直到你告诉我,你确认了这个消息收到了,但是频繁调用对支付系统是一种无用的负担
  • 如果商户一直掉线,无疑会造成巨大的资源浪费,支付系统的策略可能是
  • 第一次是1s间隔,第二次是五s间隔, 第三次是15s间隔, …
  • 随着时间的拉长,通知的频率越来越低,这样缓解了支付系统的压力
  • 商家是有多个的,如果一直这么调用也不是办法,我们可以设置一个上限比如,调50次
  • 那么50次之后,还不通,那我就不调了,那商家的钱就放在了这个支付系统里
  • 如果商家的系统修复了,但是支付系统已通知到了上限,即超额了50次,这种场景下
  • 支付系统提供一个接口,让商家自己来查询,这就是最大努力通知方案
  • 它应用在,需要反复和对方确认的系统上

相关文章:

Go微服务: 分布式之通过本地消息实现最终一致性和最大努力通知方案

通过本地消息实现最终一致性 1 )概述 我们的业务场景是可以允许我们一段时间有不一致的消息的状态的,并没有说必须特别高的这个消息的一致性比如说在TCC这个架构中,如果采用了消息的最终一致性,整体架构设计要轻松好多即便我们库…...

BC C language

题目汇总 No.1 打印有规律的字符(牛牛的字符菱形) 代码展示 #include<stdio.h> int main() {char ch0;scanf("%c",&ch);for(int i0;i<5;i){for(int j0;j<5;j){if((i0||i4)&&j2)printf("%c", ch);else if ((i 1||i3) &&…...

算法训练营第四十九天 | LeetCode 139单词拆分

LeetCode 139 单词拆分 基本还是完全背包的思路&#xff0c;不过用了三重循环&#xff0c;第三重循环是用于判断当前字符串尾部指定长度字符是否和列表中某一字符串相同&#xff0c;是的话可以将当前dp[j]或上当前下标减去该单词长度后的下标值。 代码如下&#xff1a; clas…...

阿里云一键登录号码认证服务

阿里云文档&#xff1a;号码认证SDK_号码认证服务(PNVS)-阿里云帮助中心 对于后端大概流程 前端App会传一个token过来 后端通过下面方法解析 如果解析可以获得号码,说明号码认证成功,如果无法正确解析则认证失败 /*** actoken来换取电话号码* param token app端用户授权actok…...

【UML用户指南】-05-对基本结构建模-类

目录 1、名称&#xff08;name&#xff09; 2、属性 &#xff08;attribute&#xff09; 3、操作&#xff08;operation&#xff09; 4、对属性和操作的组织 4.1、衍型 4.2、职责 &#xff08;responsibility&#xff09; 4.3、其他特征 4.4、对简单类型建模 5、结构良…...

【C++ 初阶】引用 () 实际的一些用法、常引用问题 详解!

文章目录 1. 常引用的背景2. 字符 a 与 整形 97 是相同的&#xff0c;但是具体是怎么比较的呢 &#xff1f; 1. 常引用的背景 注意&#xff1a; &#x1f427;① 权限可以平移、可以缩小&#xff0c;但是权限 不可以放大。 &#x1f427; 类型转换中间会产生临时变量 2. 字…...

adb dump当前可见的窗口

1、窗口信息 adb shell dumpsys window windows > w.txt2、dump当前可见的窗口activity windows系统 adb shell dumpsys activity | findStr mFocusmac系统 adb shell dumpsys activity | grep mFocus3、dump当前处于栈顶的activity windows系统 adb shell dumpsys activi…...

Java Web学习笔记27——对话框、表单组件

常见组件对话框&#xff1a; Dialog对话框&#xff1a;在保留当前页面状态下&#xff0c;告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思&#xff0c;点击按钮的时候&#xff0c;才会true&#xff0c;对话框才会显示。 …...

使用vue3+ts封装一个Slider滑块组件

创建一个名为 Slider.vue 的文件 <template><div class"slider-container"><inputtype"range":value"value"input"handleInput"change"handleChange"/><div class"slider-value">{{ val…...

关于科技的总结与思考

文章目录 互联网时代有趣的数字数据驱动大数据的两个特性数据保护互联网免费模式的再探讨平台互联网的意义人工智能伦理的思考语言理性人梅特卡夫定律冲浪的神奇之处AR的恐怖之处叙词表、受控词表和大众分类法六度/十九度的解读知识图谱是真正的仿生智能幂次法则和优先连接现代…...

2024年几款优秀的SQL IDE优缺点分析

SQL 工具在数据库管理、查询优化和数据分析中扮演着重要角色。 以下是常见的 SQL 工具及其优缺点。 1. SQLynx 优点&#xff1a; 智能代码补全和建议&#xff1a;采用AI技术提供高级代码补全、智能建议和自动错误检测&#xff0c;大幅提高编写和调试SQL查询的效率。跨平台和…...

vue前端实现页面禁止缩放 前端适配问题处理 前端项目多端适配解决方案

在前端项目中,如果一个系统页面可以缩放可能会导致多种异常情况,这些异常情况涉及到页面布局、元素尺寸、事件触发、响应式设计和用户体验等方面。 1.布局错乱:页面元素在缩放后可能会出现错位、重叠或部分隐藏的情况,导致页面布局混乱,影响用户对页面内容的理解和操作。这…...

反射型xss靶场练习

反射型xss危害小&#xff0c;这里使用的xss靶场是常用的xss靶场&#xff1a;xss-labs。 当我们完成弹窗后就通过该关卡&#xff0c;说该关卡存在xss的一个漏洞并且可以解析js代码。 第一关&#xff1a; 这里没有过滤我们输入的代码&#xff1a;直接将js代码放在js代码中&a…...

vue3 【实战】封装 “心跳“ 组件

需求描述 在控制台每秒打印一个“hello” 代码实现 <script setup> import { onMounted, onBeforeUnmount, ref } from "vue";const timer ref(0);onMounted(() > {function fn() {console.log("hello");timer.value setTimeout(fn, 1000);}tim…...

k8s网络问题以及容器跨宿主机通信原理

【0】资源配置文件 [rootmcwk8s03 mcwtest]# ls mcwdeploy.yaml [rootmcwk8s03 mcwtest]# cat mcwdeploy.yaml apiVersion: apps/v1 kind: Deployment metadata:labels:app: mcwpythonname: mcwtest-deploy spec:replicas: 1selector:matchLabels:app: mcwpythontemplate:met…...

BM25算法以及变种算法简介

深入理解TF-IDF、BM25算法与BM25变种&#xff1a;揭秘信息检索的核心原理与应用 原文链接&#xff1a; https://xie.infoq.cn/article/8b7232877d0d4327a6943e8ac BM25算法以及变种算法简介 Okapi BM25&#xff0c;一般简称 BM25 算法&#xff0c;在 20 世纪 70 年代到 80 年代…...

D455相机RGB与深度图像对齐,缓解相机无效区域的问题

前言 上一次我们介绍了深度相机D455的使用&#xff1a;intel深度相机D455的使用-CSDN博客&#xff0c;我们也看到了相机检测到的无效区域。 在使用Intel深度相机D455时&#xff0c;我们经常会遇到深度图中的无效区域。这些无效区域可能由于黑色物体、光滑表面、透明物体以及视…...

2024 cicsn ezbuf

文章目录 参考protobuf逆向学习复原结构思路exp 参考 https://www.y4ng.cn/posts/pwn/protobuf/#ciscn-2024-ezbuf protobuf 当时压根不知道用了protobuf这个玩意&#xff0c;提取工具也没提取出来&#xff0c;还是做题做太少了&#xff0c;很多关键性的结构都没看出来是pro…...

地面站Mission planner

官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址&#xff1a; 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准&#xff0c;没有组…...

常见的api: BigInteger

一.获取一个大的随机整数 1.代码: BigInteger bd1 new BigInteger(4, new Random());System.out.println(bd1); 2.打印的结果:2 3.注释获取的是0-16之间的随机整数 二.获取一个指定的大的数 1.代码&#xff1a; BigInteger bd2 new BigInteger("100");System.o…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...