nest係列-event事件總線
設計思想
- 以係統思維為外部提供對外異步事件通知
- 支持係統間的異步事件請求,由分布式消息中間件提供
- 支持係統內的同步事件請求,由內部觀察者模型提供(單線程)
- 通過事件總線統一發起事件及注冊事件
- 通過可配置的擴展為事件提供消息通道
- 可通過插件方式為指定的消息中間件提供消息提供者
- 異步事件通過消息標識來提供消費者冪等性
- 異步事件支持最終一致性,即當工作單元的實體提交成功後再發起異步消息的提交,如果異步提交失敗使用補償機製重發消息
設計草圖
-
-
數據流程
發起事件
應用程序通過事件總線服務發布事件,發布服務用事件名稱去事件配置管理器找到該事件需要使用的消息通道。使用消息通道找到如果沒有找到指定的消息通道,默認使用同步通道發送事件。如果找到通道,則使用通道提供的生產者執行發送消息的動作。
生產者分為同步類的生產者和異步類的生產者
同步類生產者直接使用觀察者模式將消息發送給監聽者,監聽者調用具體的事件處理器處理事件消息
異步類生產者將事件信息構建為分布式事件信息,並且把這個分布式事件信息放入工作單元待發隊列中。
當工作單元的實體提交完成將發起事件提交,事件提交將待發隊列中的分布式事件信息提出,寫入提交事件管理器中開始提交事件,事件信息的提交行為調用具體的分布式事件生產者的提交消息到消息中間件成功後更新事件提交管理器中的事件狀態。
事件提交管理器提供補償機製將事件提交狀態為失敗的事件重新發布直到成功
-
訂閱事件
通過事件產總線服務發起事件注冊,注冊時需要提交一個事件處理器,事件處理器包括事件名稱及處理方法。
總線服務收到事件注冊信息後,通過事件配置管理器找到具體的事件通道提供的消費者
如果消費者是一個同步類消費者時直接創建一個消息監聽器並添加到觀察者中。
如果消費者是一個異步類消息者時,將啟動一個單獨的線程獲取消息中間件的消息。從消息中間件中獲取到的消息根據消息標識去事件記錄管理器中查詢是否已經處理過,如果已經處理過的消息直接返回給消息中間件,如果沒有處理的消息調起事件處理器指定的處理方法。
擴展消息通道
-
繼承並實現消息通道、生產者、消費者。可參考activemq消息通道的實現插件
代碼地址:https://github.com/jovezhao/nest/tree/master/nest-ddd/src/main/java/com/jovezhao/nest/ddd/event
最後更新:2017-11-13 18:34:14