目录

  1. 设计重点

  2. 流程图

  3. 伪代码
    2.1. PublishEvent
    2.2. SubscribeEvent
    2.3. Publisher
    2.4. Subscriber

  4. 微服务 强一致性
    3.1 Publisher
    3.2 Subscriber

  5. 事件总线 - 跨服务 最终一致性
    4.1 Publisher & Subscriber 都开启了本地事务,保证了强一致性
    4.2 问题场景一:当 ③ 发布失败怎么办?
    4.3 问题场景二:当 ③ 发布成功,但 ④ 更新事件状态失败怎么办?
    4.4 问题场景三:Publisher 端Ok,Subscriber 消费出错

0. 设计重点

  1. Publisher 本地化 PublishEvent 保证事件发布可靠性

  2. Subscriber 本地化 SubscribeEvent 保证事件订阅可靠性

  3. SubscribeEvent 通过 EventId & HandlerType 组合约束 保证不重复消费事件

  4. 事件中央控制台 处理 Publisher & Subscriber 事件重试


1. 执行流程图


2. 伪代码

2.1 PublishEvent

2.2 SubscribeEvent

2.3 Publisher

2.4 Subscriber

3. 微服务 强一致性

3.1 Publisher

  1. 开启本地事务达到强一致性

  2. 执行本地业务代码

  3. 本地事务内部保存事件 预发布 状态 

  4. 发布事件到事件总线 

  5. 修改事件发布状态为已发布 

3.2 Subscriber

  1. 开启本地事务达到强一致性

  2. 执行本地业务代码

  3. 保存订阅事件到本地仓库


4 事件总线 - 跨服务 最终一致性

4.1 Publisher & Subscriber 都开启了本地事务,保证了强一致性


4.2 问题场景一:当 ③ 发布失败怎么办?

  1.  发布失败,意味着抛出异常,则  不执行,那么事件状态依然保持 预发布状态

  2. 后续 事件重试 重新发布该事件,并更新事件状态为 已发布


4.3 问题场景二:当 ③ 发布成功,但 ④ 更新事件状态失败怎么办?

4.3.1 场景二·一 Subscriber 订阅成功

  1.  发布成功,但  更新事件状态失败,事件状态依然是 预发布状态

  2. Subscriber 订阅到该事件后成功执行完业务代码

  3. Subscriber 将订阅事件保存到本地订阅事件仓库 
    该场景存在的问题: Publisher 会通过 事件重试 再次发布 预发布 状态的事件,那么此时Subscriber 将重复消费该事件
    方案:该问题我们可以通过将 SubscribeEvent EventId & HandlerType 组合唯一约束,来避免重复消费

4.3.2 场景二·二 Subscriber 订阅失败

  1.  发布成功,但  更新事件状态失败,事件状态依然是 预发布状态

  2. Subscriber 执行消费失败

  3. Subscriber 回滚本地事务
    该场景不存在任何问题,因为 Publisher 会通过 事件重试 再次发布 预发布 状态的事件 。


4.4 问题场景三:Publisher 端Ok,Subscriber 消费出错

  1. Publisher 端处理顺利

  2. Subscriber 消费失败,回滚本地事务,此时 SubscribeEvent 未存储到本地仓库
    该场景存在的问题:
    Publisher 发送成功,并且本地 PublishEvent 事件为已发布,那么意味着从Publisher端是无法知道Subscriber消费失败需要重新消费
    解决方案:

  3. 通过检测 PublishEvent & SubscribeEvent 获得需要 事件重试 的 PublishEvent

  4. 将 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

如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...相关推荐

  1. 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul

    <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发现 Consul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发 ...

  2. .NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...

    32 | 集成事件:解决跨微服务的最终一致性 首先看一下集成事件的工作原理 它的目的时为了实现系统的集成,它主要是用于系统里面多个微服务之间相互传递事件 集成事件的实现方式有两种,一种是图上显示的发布 ...

  3. 【微服务解耦之事件启动】Spring Boot 解耦之事件驱动

    一.前言 简介: 在项目实际开发过程中,我们有很多这样的业务场景:一个事务中处理完一个业务逻辑后需要跟着处理另外一个业务逻辑,伪码大致如下: @Service public class Product ...

  4. 微服务架构师的职责——《微服务设计读书笔记》

    如何定义架构师 架构师从英文单词Architect翻译而来,在英文中,Architect原来的意思是"建筑师".作者吐槽英文中架构师与传统的建筑师单词相同,但实际的工作性质并不相同 ...

  5. blog微服务架构代码_DDD+微服务大型案例:Uber如何从复杂的RPC微服务转向面向业务领域的微服务架构DOMA? -优步工程博客...

    最近,围绕面向服务的体系结构,尤其是微服务体系结构的弊端进行了大量讨论.仅仅几年前,由于许多人宣传微服务架构的好处,例如独立部署形式的灵活性,明确的所有权,系统稳定性的改进以及更好的关注点分离,很多人 ...

  6. 业界微服务楷模Netflix是这样构建微服务技术架构的

    原文:  https://mp.weixin.qq.com/s/C8Rdz9wFtrBKfxPRzf0OBQ 作者|杨波编辑|小智Netflix 是美国在线影片租赁商,曾利用超过 100 亿次的用户观 ...

  7. 如何跨微服务共享DTO

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1. 概述 近些年来,微服务变得越来越流行.微服务基本特征 ...

  8. 微服务等于Spring Cloud?了解微服务架构和框架

    作者:TIM XU 来源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 微服务初探 什么 ...

  9. Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理

    前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...

最新文章

  1. gz解压java,java 解压gz
  2. jquery中offset和position的区别
  3. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
  4. linux如何使用vim显示行号语法高亮,(.vimrc简单使用)
  5. 【win32】vs2010的窗体程序Helloworld
  6. splite和map的结合使用
  7. vmware的vmdk格式虚拟机转换为kvm的qcow2格式
  8. Python 回归 普通最小二乘法(Ordinary Least Squares)
  9. SCOM2012功能测试(18)—对象发现(替代)
  10. oracle更新前触发器,Oracle之前更新触发器
  11. 全面接触PDF:最好用的PDF软件汇总
  12. Remote Desktop Connection 7.0
  13. Shiro框架的搭建与使用
  14. 机器学习大牛李飞飞的电脑配置
  15. 【gcc】warning信息梳理
  16. sql注入 mysql 猜数据库名字_sql注入 - osc_dfi5j6xi的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. 如若,我是这样的女子
  18. 求助:Appium 如何实现登录手机淘宝时拖动苹果到购物车的验证
  19. HDU 6148 Valley Numer(数位DP)
  20. es多个字段排序_如何解决 ES 复杂聚合排序问题(嵌套桶排序)?

热门文章

  1. linux系统启动流程及常见问题的解决
  2. 「每天一道面试题」如何理解方法的重载与覆盖?
  3. 探索java世界中的日志奥秘
  4. Maven发布工程到私服
  5. Exchange2003-2010迁移系列之九,创建DAG组
  6. EF Core 6 简化的数据库上下文注册
  7. .NET Core授权失败如何自定义响应信息?
  8. 使用BeetleX网关对Web应用进行灰度发布
  9. Kuma 1.0 GA发布,70多项新功能和改进
  10. Winform 进度条弹窗和任务控制