当前位置: 首页 > 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…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...