如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...
目录
设计重点
流程图
伪代码
2.1. PublishEvent
2.2. SubscribeEvent
2.3. Publisher
2.4. Subscriber微服务 强一致性
3.1 Publisher
3.2 Subscriber事件总线 - 跨服务 最终一致性
4.1 Publisher & Subscriber 都开启了本地事务,保证了强一致性
4.2 问题场景一:当 ③ 发布失败怎么办?
4.3 问题场景二:当 ③ 发布成功,但 ④ 更新事件状态失败怎么办?
4.4 问题场景三:Publisher 端Ok,Subscriber 消费出错
0. 设计重点
Publisher 本地化 PublishEvent 保证事件发布可靠性
Subscriber 本地化 SubscribeEvent 保证事件订阅可靠性
SubscribeEvent 通过 EventId & HandlerType 组合约束 保证不重复消费事件
事件中央控制台 处理 Publisher & Subscriber 事件重试
1. 执行流程图
2. 伪代码
2.1 PublishEvent
2.2 SubscribeEvent
2.3 Publisher
2.4 Subscriber
3. 微服务 强一致性
3.1 Publisher
开启本地事务达到强一致性
执行本地业务代码
本地事务内部保存事件 预发布 状态 ②
发布事件到事件总线 ③
修改事件发布状态为已发布 ④
3.2 Subscriber
开启本地事务达到强一致性
执行本地业务代码
保存订阅事件到本地仓库
4 事件总线 - 跨服务 最终一致性
4.1 Publisher & Subscriber 都开启了本地事务,保证了强一致性
4.2 问题场景一:当 ③ 发布失败怎么办?
③ 发布失败,意味着抛出异常,则 ④ 不执行,那么事件状态依然保持 预发布状态
后续 事件重试 重新发布该事件,并更新事件状态为 已发布
4.3 问题场景二:当 ③ 发布成功,但 ④ 更新事件状态失败怎么办?
4.3.1 场景二·一 Subscriber 订阅成功
③ 发布成功,但 ④ 更新事件状态失败,事件状态依然是 预发布状态
Subscriber 订阅到该事件后成功执行完业务代码
Subscriber 将订阅事件保存到本地订阅事件仓库 ⑤
该场景存在的问题: Publisher 会通过 事件重试 再次发布 预发布 状态的事件,那么此时Subscriber 将重复消费该事件
方案:该问题我们可以通过将 SubscribeEvent EventId & HandlerType 组合唯一约束,来避免重复消费
4.3.2 场景二·二 Subscriber 订阅失败
③ 发布成功,但 ④ 更新事件状态失败,事件状态依然是 预发布状态
Subscriber 执行消费失败
Subscriber 回滚本地事务
该场景不存在任何问题,因为 Publisher 会通过 事件重试 再次发布 预发布 状态的事件 。
4.4 问题场景三:Publisher 端Ok,Subscriber 消费出错
Publisher 端处理顺利
Subscriber 消费失败,回滚本地事务,此时 SubscribeEvent 未存储到本地仓库
该场景存在的问题:
Publisher 发送成功,并且本地 PublishEvent 事件为已发布,那么意味着从Publisher端是无法知道Subscriber消费失败需要重新消费
解决方案:通过检测 PublishEvent & SubscribeEvent 获得需要 事件重试 的 PublishEvent
将 PublishEvent 重新发布 到 Subscriber
5. 通过Nuget安装组件支持以上编程模型
Install-Package SmartEventBus.RabbitMQImpl
Install-Package SmartEventBus.Repository
6. ORM:SmartSql 广而告之
SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......
作者:Ahoo Wang (阿虎)
Github: https://github.com/Ahoo-Wang/
SmartSql(高性能、高生产力,超轻量级的ORM!): https://github.com/Ahoo-Wang/SmartSql
SmartCode(不只是代码生成器!): https://github.com/Ahoo-Wang/SmartCode
原文地址:https://www.cnblogs.com/Ahoo-Wang/p/micoservice-eventbus.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...相关推荐
- 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul
<深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发现 Consul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发 ...
- .NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...
32 | 集成事件:解决跨微服务的最终一致性 首先看一下集成事件的工作原理 它的目的时为了实现系统的集成,它主要是用于系统里面多个微服务之间相互传递事件 集成事件的实现方式有两种,一种是图上显示的发布 ...
- 【微服务解耦之事件启动】Spring Boot 解耦之事件驱动
一.前言 简介: 在项目实际开发过程中,我们有很多这样的业务场景:一个事务中处理完一个业务逻辑后需要跟着处理另外一个业务逻辑,伪码大致如下: @Service public class Product ...
- 微服务架构师的职责——《微服务设计读书笔记》
如何定义架构师 架构师从英文单词Architect翻译而来,在英文中,Architect原来的意思是"建筑师".作者吐槽英文中架构师与传统的建筑师单词相同,但实际的工作性质并不相同 ...
- blog微服务架构代码_DDD+微服务大型案例:Uber如何从复杂的RPC微服务转向面向业务领域的微服务架构DOMA? -优步工程博客...
最近,围绕面向服务的体系结构,尤其是微服务体系结构的弊端进行了大量讨论.仅仅几年前,由于许多人宣传微服务架构的好处,例如独立部署形式的灵活性,明确的所有权,系统稳定性的改进以及更好的关注点分离,很多人 ...
- 业界微服务楷模Netflix是这样构建微服务技术架构的
原文: https://mp.weixin.qq.com/s/C8Rdz9wFtrBKfxPRzf0OBQ 作者|杨波编辑|小智Netflix 是美国在线影片租赁商,曾利用超过 100 亿次的用户观 ...
- 如何跨微服务共享DTO
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1. 概述 近些年来,微服务变得越来越流行.微服务基本特征 ...
- 微服务等于Spring Cloud?了解微服务架构和框架
作者:TIM XU 来源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 微服务初探 什么 ...
- Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理
前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...
最新文章
- gz解压java,java 解压gz
- jquery中offset和position的区别
- 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
- linux如何使用vim显示行号语法高亮,(.vimrc简单使用)
- 【win32】vs2010的窗体程序Helloworld
- splite和map的结合使用
- vmware的vmdk格式虚拟机转换为kvm的qcow2格式
- Python 回归 普通最小二乘法(Ordinary Least Squares)
- SCOM2012功能测试(18)—对象发现(替代)
- oracle更新前触发器,Oracle之前更新触发器
- 全面接触PDF:最好用的PDF软件汇总
- Remote Desktop Connection 7.0
- Shiro框架的搭建与使用
- 机器学习大牛李飞飞的电脑配置
- 【gcc】warning信息梳理
- sql注入 mysql 猜数据库名字_sql注入 - osc_dfi5j6xi的个人空间 - OSCHINA - 中文开源技术交流社区...
- 如若,我是这样的女子
- 求助:Appium 如何实现登录手机淘宝时拖动苹果到购物车的验证
- HDU 6148 Valley Numer(数位DP)
- es多个字段排序_如何解决 ES 复杂聚合排序问题(嵌套桶排序)?