目录
- 设计重点
- 流程图
- 伪代码
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
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
关键字: