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

 

目录

  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

    public abstract class Event     {         public Event()         {             Id = Guid.NewGuid();             CreationTime = DateTime.UtcNow;         }          public Guid Id { get; set; }         public DateTime CreationTime { get; set; }     }      public class PublishEvent : Event     {         public PublishEvent(Event @event)         {             Id = @event.Id;             CreationTime = @event.CreationTime;             Type = @event.GetType().FullName;             Data = JsonConvert.SerializeObject(@event);             Status = PublishEventStatus.NotPublished;         }          public String Type { get; set; }         public String Data { get; set; }         public PublishEventStatus Status { get; set; }     }      public enum PublishEventStatus     {         NotPublished = 0,         Published = 1,         PublishedFailed = 2     }

2.2 SubscribeEvent

    public class SubscribeEvent     {         public SubscribeEvent(Event @event, IEventHandler handler)         {             EventId = @event.Id;             EventCreationTime = @event.CreationTime;             EventType = @event.GetType().FullName;             EventData = JsonConvert.SerializeObject(@event);             HandlerType = handler.GetType().FullName;             HandlingStatus = HandlingStatus.HandleSucceeded;             HandlingTime = DateTime.Now;         }         public Guid EventId { get; set; }         public String EventType { get; set; }         public String EventData { get; set; }         public DateTime EventCreationTime { get; set; }         public String HandlerType { get; set; }         public DateTime HandlingTime { get; set; }         public HandlingStatus HandlingStatus { get; set; }     }     public enum HandlingStatus     {         HandleSucceeded = 0,         HandleFailed = 1     }

2.3 Publisher


                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信