分布式部署服務的情況下,由于網路狀況不可預期,訊息有可能發送成功,但是消費端消費失敗;也有可能訊息根本沒有發出去,如何保證訊息是否發送成功是經常遇到的問題,最近有時間研究了一下,具體方法如下圖:

表結構設計如下:

具體思路:
正常流程(網路都正常)
1.訊息生產方,將訊息資訊與業務資料在同一個事務中存入資料庫,
2.訊息發送發,發送訊息,訊息發送表‘狀態’為‘已發送’
3.訊息消費方,接收訊息,存入訊息接收表,并呼叫生產方介面,更新生產方訊息發送表‘狀態’為‘已完成’,
正常流程結束,
例外流程
1.訊息生產方,將訊息資訊與業務資料在同一個事務中存入資料庫,
2.訊息發送發,發送訊息,訊息發送表‘狀態’為‘已發送’
3.訊息消費方未收到訊息;或,接收到訊息,存入訊息接收表,但呼叫生產方介面失敗,
4.訊息生產方job1,查詢訊息發送表‘狀態’為‘已發送’,并當前時間超過回呼截止時間(或過期時間)的記錄,然后呼叫訊息消費方查詢狀態介面
5.訊息生產方job1若查到結果,則更新訊息發送表‘狀態’為‘已完成’,流程結束;若為查到結果,則更新訊息發送表‘狀態’為‘未發送’
6.訊息生產方job2,查詢訊息發送表‘狀態’為‘未發送’的記錄,重新生產訊息,并更新狀態為“已發送”,之后會自動跳轉到流程3,直到狀態變更為“已完成”,
注意,訊息接收表的sourcemsg_id欄位需唯一,保證冪等性,
針對這個設計,完成了net core3.1 的demo,用了rabbitmq作為訊息佇列,mysql作為資料庫,ef core orm,redis分布式鎖,
demo地址為https://github.com/cysnet/mq-trans.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/50971.html
標籤:.NET Core
