版權聲明:本文為半吊子子全棧工匠(wireless_com,同公衆号)原創文章,未經允許不得轉載。 https://blog.csdn.net/wireless_com/article/details/44236217
消息系統中,常用的一緻性解決方案如下:
1) 發送消息給消息系統
2) 消息系統入庫消息
3) 消息系統傳回結果
4) 業務操作
5) 發送業務操作結果給消息系統
6) 更改存儲中的消息狀态
如果消息丢失,從業務資料補發消息是最徹底的容災手段。一般地,把叢集和叢集之間對消息的消費作為topic模型處理,而叢集内部的各個應用執行個體對消息的消費當做Queue模型處理。引入clusterID來辨別不同的叢集,叢集内的各個應用執行個體的連接配接使用同樣的ClusterID。分兩級處理,進而達到多個不同的叢集進行消息訂閱的目的。需要注意的是從topic中分發消息分發到不同的queue中時,需要由獨立的中轉消息訂閱者來完成,并且對同一個queue的中轉隻能由一個連接配接完成,為了實作高可用性,還需要備份節點。
為了保證消息發送的可靠性,首先要保證消息發送端的可靠性。保證消息存儲的可靠性有多種方法:有基于檔案的消息存儲例如ActiveMQ,采用資料庫的消息存儲一般考慮采用寬表、備援資料的方式實作,還有基于雙機記憶體的消息存儲。通過伺服器主動排程安排投遞的方式可以實作資料庫存儲的便利擴容。由于消息系統需要顯示地收到接受者确認消息處理完畢的信号才能删除消息,是以保證消息投遞的可靠性一定從應用層的響應入手。在進行投遞時一定要采用多線程的方式處理,單機多訂閱者共享連接配接,消息隻發送一次,然後傳到單機的多訂閱者生成多個執行個體處理。消息重複接收主要是因為消息接受者成功處理消息後,消息系統不能及時更新投遞狀态造成的。應對消息重複的辦法是使消息接收端的處理是一個幂等操作。
對應有序的消息隊列而言,單機多隊列的隔離完成了對消息的有序支援,進一步,把發送到這台機器的消息資料進行順序寫入,然後根據隊列做一個索引,每個隊列的索引是獨立的,其中儲存的隻是相對于存儲資料的實體隊列的索引。另外,采用消息同步複制的方式解決本地存儲的可靠性。