[TOC]
在電商領域等互聯網場景下,傳統的事務在數據庫性能和處理能力上都暴露出了瓶頸。柔性事務有兩個特性:基本可用和柔性狀態。所謂基本可用是指分布式系統出現故障的時候允許損失一部分的可用性。柔性狀態是指允許系統存在中間狀態,這個中間狀態不會影響系統整體的可用性,比如數據庫讀寫分離的主從同步延遲等。柔性事務的一致性指的是最終一致性。
消息中間件在分布式系統中的核心作用就是異步通訊、應用解耦和并發緩沖(也叫作流量削峰)。在分布式環境下,需要通過網絡進行通訊,就引入了數據傳輸的不確定性,也就是CAP理論中的分區容錯性。
消息發送一致性是指產生消息的業務動作與消息發送一致,也就是說如果業務操作成功,那么由這個業務操作所產生的消息一定要發送出去,否則就丟失。
處理方式一
public void completeOrderService() {
// 處理訂單
order.process();
// 發送會計原始憑證消息
pipe.sendAccountingVouchetMessage();
}
在上面的情況中,如果業務操作成功,執行的消息發送之前應用發生故障,消息發送不出去,導致消息丟失,將會產生訂單系統與會計系統的數據不一致。如果消息系統或者網絡異常,也會導致消息發送不出去,也會造成數據不一致。
處理方式二
public void completeOrderService() {
// 發送會計原始憑證消息
pipe.sendAccountingVouchetMessage();
// 處理訂單
order.process();
}
如果將上面的兩個操作調換一下順序,這種情況就會更加不可控了,消息發出去了業務訂單可能會失敗,會造成訂單系統與業務系統的數據不一致。那么JMS標準中的XA協議是否可以保障發送的一致性?
JMS協議標準的API中,有很多以XA開頭的接口,其實就是前面講到的支持XA協議(基于兩階段提交協議)的全局事務型接口。
XAConnection.class
XAConnectionFactory.class
XAQueueConnection.class
XAQueueConnectionFactory.class
XASession.class
XATopicConnection.class
XATopicConnectionFactory.class
XATopicSession.class
但是在上面的處理流程中,任何一個環節都有可能出現問題。
對于未確認的消息,采用按規則重新投遞的方式進行處理。對于以上流程,消息重復發送會導致業務處理接口出現重復調用的問題。消息消費過程中消息重復發送的主要原因就是消費者成功接收處理完消息后,消息中間件沒有及時更新投遞狀態導致的。如果允許消息重復發送,那么消費方應該實現業務接口的冪等性設計。
示例消息數據表:
名稱 | 數據類型 | 允許空 | 默認值 | 屬性 | 釋義 |
---|---|---|---|---|---|
uuid | varchar(50) | No | — | unique | UUID |
version | int(11) | No | 0 | — | 版本號 |
editer | varchar(100) | Yes | NULL | — | 修改者 |
creater | varchar(100) | Yes | NULL | — | 創建者 |
edit_time | datetime | Yes | 0000-00-00 00:00:00 | — | 最后修改時間 |
create_time | datetime | No | 0000-00-00 00:00:00 | — | 創建時間 |
msg_id | varchar(50) | No | — | — | 消息ID |
msg_body | longtext | No | — | — | 消息內容 |
msg_date_type | varchar(50) | Yes | — | — | 消息數據類型 |
consumer_queue | varchar(100) | No | — | — | 消費隊列 |
send_times | int(6) | No | 0 | — | 消息重發次數 |
is_dead | varchar(20) | No | — | — | 是否死亡 |
status | varchar(20) | No | — | — | 狀態 |
remark | varchar(200) | Yes | — | — | 備注 |
field0 | varchar(200) | Yes | — | — | 擴展字段0 |
field1 | varchar(200) | Yes | — | — | 擴展字段1 |
field2 | varchar(200) | Yes | — | — | 擴展字段2 |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。