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

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


1 )概述

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

2 )场景

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

最大努力通知方案

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

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

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

相关文章

网络安全快速入门(十五)(下)手动创建用户及su,sudo命令

15.8 序言 前面我们已经大概了解了创建用户一些相关文件,接下来我们来手动创建用户,话不多说,我们直接开搞!!! 15.9 手动创建用户: 一般来讲,我们创建用户通过useradd和passwd命令来…

Java进阶_多态特性

生活中的多态 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 现实中,比如我们按下 F1 键这个动作,同一个事件发生在不同的对象上会产生不同的结果。…

谷歌上架防关联,打包环境到底是不是关联因素之一?

在Google play上架应用,防关联是开发者们最关注的问题之一,只要开发者账号被谷歌审核系统与其它违规的开发者账号或应用存在关联,就很有可能被封号。 如果账号被封了,通常谷歌的封号通知邮件里只是写了因为关联或高风险、多次违规…

FM148R,FM147A和利时卡件

FM148R,FM147A和利时卡件。软件组成及各部分功能软件组成---各组件功能注意事项:仿真功能:仿真系统可以用于在单机上对组态完成的工程内容进行模拟运行。FM148R,FM147A和利时卡件。便于对这些组态内容的正确性和合理性进行初步调试。二、FM148R,FM147A和…

2024年跨平台应用解决方法

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 很久没有写这类high-level的文章了,本身这类框架就一直层出不穷,但是其中历久弥坚,坚韧不拔的框架又有多少呢? 首先考虑到学习成本以及掌握一些编程语言在工作、学习生态上的价值,给这些东西适用生态划分一下. Reac…

基于JSP技术的文物管理系统

你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户前台…

免费条形码生成工具,批量生成条形码

易条形是一款完全免费的条形码生成工具,可以帮助你快速生成条形码,支持生成18种条形码生成。 目前支持生成包括CODE128、CODE128A、CODE128B、CODE128C、EAN、EAN-13、UPC、EAN-8、EAN-5、EAN-2、CODE39、ITF14、MSI、MSI10、MSI11、MSI1010、MSI1110、…

ssm学生考勤签到小程序-计算机毕业设计源码43160

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受学生的喜爱,学生考勤签到小程序被学生普遍使用,为方便学生…

硕思闪客精灵(shankejingling)软件最新版下载及详细安装教程

闪客精灵(Sothink SWF Decompiler)是一款先进的SWF反编译软件,它不但能捕捉、反编译、查看和提取Shock Wave Flash影片(.swf和.exe格式文件),而且可以将SWF格式文件转化为FLA格式文件。它能反编译Flash的所…

人工智能、机器学习、深度学习:技术革命的深度解析

目录 人工智能、机器学习、深度学习:技术革命的深度解析 引言 第一部分:人工智能的起源与演进 1.1 人工智能的定义 1.2 人工智能的历史 1.3 人工智能的关键概念 1.4 人工智能的应用领域 1.5 人工智能的未来发展 1.6 人工智能的代码案例 第二部…

【乐吾乐3D可视化组态编辑器】用开关控制巡检车和路灯

一、运动设备开关控制 3D组态编辑器地址:3D可视化组态 - 乐吾乐Le5le 1.在场景中新建模拟运动设备及控制面板:启动/停止 2.单击巡检车设备新建模拟动画 3.设置模拟动画属性 4.单击启动面板,新建交互事件 5.设置交互触发类型,新建…

【vue2+css】实现球内波浪百分比效果

halo&#xff0c;小伙伴们&#xff0c;今天笔者分享一个关于css实现球内&#xff08;圆形&#xff09;波浪进度百分比效果&#xff0c;如下图所示&#xff1a; 话不多说上代码&#xff0c;首先是html代码&#xff1a; <div class"card1-left-bottom"><div …

SQL自动发送邮件的方法有哪些?如何配置?

SQL自动发送邮件设置时的注意事项&#xff1f;邮件群发如何操作&#xff1f; 在现代企业中&#xff0c;自动化流程越来越普遍&#xff0c;SQL自动发送邮件作为其中一项重要功能&#xff0c;能够大大提高工作效率并简化数据管理流程。AokSend将介绍几种实现SQL自动发送邮件的方…

SpringBoot整合SpringSecurit(二)通过token进行访问

在文章&#xff1a;SpringBoot整合SpringSecurit&#xff08;一&#xff09;实现ajax的登录、退出、权限校验-CSDN博客 里面&#xff0c;使用的session的方式进行保存用户信息的&#xff0c;这一篇文章就是使用token的方式。 在其上进行的改造&#xff0c;可以先看SpringBoot…

STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN 想移植Easylogger到上面试试easylogger的效果&#xff0c;先实现pritnf的重定向功能来打印输出 只需要添加以下代码即可实现 代码 #include <stdarg.h> uint8_t FDCAN_UserTxBuffer[512]; void FDCAN_p…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

前端工程化工具系列(十)—— Browserslist:浏览器兼容性配置工具

Browserslist 是一个能够在不同的前端工具间共享目标浏览器的配置&#xff0c;各工具根据该配置进行代码转译等操作。 具体的这些前端工具为&#xff1a;Autoprefixer、Babel、postcss-preset-env、eslint-plugin-compat、stylelint-no-unsupported-browser-features、postcss-…

Java开发-面试题-0004-HashMap 和 Hashtable的区别

Java开发-面试题-0004-HashMap 和 Hashtable的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09; 生活…

批量高效调整图片像素:自定义缩小bmp图片,画质优先,一键实现高效优化

图片已经成为我们生活中不可或缺的一部分。无论是社交媒体分享&#xff0c;还是工作文件传输&#xff0c;图片总是扮演着重要的角色。然而&#xff0c;有时候&#xff0c;我们可能会面临一个问题&#xff1a;图片像素过大&#xff0c;不仅占用过多的存储空间&#xff0c;还可能…

【JavaSE】面向对象---多态

前言 本篇以Java初学者视角写下&#xff0c;难免有不足&#xff0c;或者术语不严谨之处。如有错误&#xff0c;欢迎评论区指正。本篇说明多态相关的知识。若本文无法解决您的问题&#xff0c;可以去最下方的参考文献出&#xff0c;找出想要的答案。 多态概念 多态&#xff08…