如何保證消息的順序性?
數據中台服務器A發送 創建學生信息 與 更新學生信息 兩條消息。應用服務器B需要接受服務A的消息。接收到創建學生信息的消息就在表里創建一個學生記錄。接受到更新學生的消息就更新學生基本信息。
如果B服務器部署了兩台,服務A在很短的時間內發送了兩條消息,那么服務B可能有一台做創建學生的操作,另外一台做更新學生的操作。那么就有可能發生,更新學生基本信息的操作早於創建學生基本信息的操作。這樣的話更新就會失敗。
這就牽扯到如何保證消息的順序性
解決思路:
在生產端發送消息的時候,把自己上一條消息ID 記錄到放到消息體中。 在消費端接收到消息后,首先檢查此消息中的 上一條消息ID屬性。如果不存在上一條消息ID屬性,那么就正常消費操作。如果成功消費,則將此次消費的消息ID記錄到數據庫中。 如果存在上一條消息ID屬性,那么就先去數據庫查看上一條消息是否已經成功被消費。 如果成功被消費,那么就執行正常的業務邏輯。消費並記錄本次消息ID。 如果發現上一條消息沒有被成功消費,那么可以稍等一下,在程序中執行睡眠X秒的操作。當休眠時間到了以后,再去檢查一下上一條消息是否已經被成功消費。如果此時上一條消息仍然沒有成功消費,那么就拋出異常,將當前的消息推回原隊列,並等待下次重新消費。
參考鏈接:
https://blog.csdn.net/yanluandai1985/article/details/109535600