自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分布式事務(wù) — 可靠消息最終一致性方案

開(kāi)發(fā) 前端 分布式
可靠消息最終一致性方案是指當(dāng)事務(wù)發(fā)起方執(zhí)行完成本地事務(wù)后發(fā)出消息到消息中間件,事務(wù)參與方(消息消費(fèi)者)一定能夠接收到消息并處理事務(wù)成功,此方案強(qiáng)調(diào)的是只要消息發(fā)給事務(wù)參與方,則最終事務(wù)要達(dá)到一致。

[[405809]]

大家好,我是狼王,一個(gè)愛(ài)打球的程序員

事務(wù)想必大家并不陌生,比如經(jīng)常被人提起的ACID,但是為了后續(xù)的分布式事務(wù)的內(nèi)容,我們先來(lái)聊聊 ACID,然后再介紹下什么是分布式事務(wù),最后著重講下基于可靠消息的分布式事務(wù)解決方案。

什么是事務(wù)

嚴(yán)格意義上的事務(wù)應(yīng)該是具備原子性、一致性、隔離性和持久性,簡(jiǎn)稱 ACID。

  1. 原子性(Atomicity),可以理解為一個(gè)事務(wù)內(nèi)的所有操作要么都執(zhí)行,要么都不執(zhí)行。
  2. 一致性(Consistency),可以理解為數(shù)據(jù)是滿足完整性約束的,也就是不會(huì)存在中間狀態(tài)的數(shù)據(jù),比如你錢包有100,我錢包有100,你給我打50塊,此時(shí)你錢包的錢應(yīng)該是50,我錢包的錢應(yīng)該是150,不會(huì)存在我錢加了,你錢沒(méi)扣的中間狀態(tài)。
  3. 隔離性(Isolation),指的是多個(gè)事務(wù)并發(fā)執(zhí)行的時(shí)候不會(huì)互相干擾,即一個(gè)事務(wù)內(nèi)部的數(shù)據(jù)對(duì)于其他事務(wù)來(lái)說(shuō)是隔離的。
  4. 持久性(Durability),指的是一個(gè)事務(wù)完成了之后數(shù)據(jù)就被永遠(yuǎn)保存下來(lái),之后的其他操作或故障都不會(huì)對(duì)事務(wù)的結(jié)果產(chǎn)生影響。

而通俗意義上事務(wù)就是為了使得一些更新操作要么都成功,要么都失敗。

什么是分布式事務(wù)

分布式事務(wù)顧名思義就是要在分布式系統(tǒng)中實(shí)現(xiàn)事務(wù),它其實(shí)是由多個(gè)本地事務(wù)組合而成。

一次大的操作由不同的小操作組成的,這些小的操作分布在不同的服務(wù)器上,分布式事務(wù)需要保證這些小操作要么全部成功,要么全部失敗。從本質(zhì)上來(lái)說(shuō),分布式事務(wù)就是為了保證不同數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性。

常見(jiàn)的分布式事務(wù)的解決方案有以下幾種:2PC,3PC,TCC,本地消息表、可靠消息最終一致性、盡最大努力通知等

今天我們就著重講講可靠消息最終一致性的解決方案

什么是可靠消息最終一致性方案

可靠消息最終一致性方案是指當(dāng)事務(wù)發(fā)起方執(zhí)行完成本地事務(wù)后發(fā)出消息到消息中間件,事務(wù)參與方(消息消費(fèi)者)一定能夠接收到消息并處理事務(wù)成功,此方案強(qiáng)調(diào)的是只要消息發(fā)給事務(wù)參與方,則最終事務(wù)要達(dá)到一致。

這個(gè)方式存在哪些問(wèn)題?

此方案是通過(guò)消息中間件實(shí)現(xiàn)的,事務(wù)發(fā)起方(消息生產(chǎn)方)將消息發(fā)給消息中間件,事務(wù)參與方從消息中間件接收消息,由于網(wǎng)絡(luò)通信的不確定性會(huì)導(dǎo)致分布式事務(wù)問(wèn)題,如下圖:

1.本地事務(wù)與消息的原子性問(wèn)題

如上圖在虛線框內(nèi),存在以下幾種情況:

  • 1)本地事務(wù)提交失敗,則消息不發(fā)送。
  • 2)本地事務(wù)成功,消息發(fā)送失敗,本地事務(wù)回滾。
  • 3)本地消息成功,消息超時(shí),本地事務(wù)回滾,消息最終失敗。
  • 4)本地消息成功,消息超時(shí),本地事務(wù)回滾,消息最終成功。

綜上所述,存在第四種情況,造成本地事務(wù),與消息參與方的事務(wù)不一致。

2.事務(wù)參與方接收消息的可靠性。

消息中間件與事務(wù)參與方要確保能夠成功消費(fèi)到消息。

3.消息重復(fù)消費(fèi)

注意事務(wù)參與方的接口冪等性問(wèn)題,消息參與方可能已經(jīng)成功消費(fèi),由于網(wǎng)絡(luò)問(wèn)題導(dǎo)致消息中間件認(rèn)為消息未消費(fèi),發(fā)起重試之后產(chǎn)生的問(wèn)題。

解決方案

1.本地消息表

本地消息表的關(guān)鍵在于本地有一張存儲(chǔ)消息日志的記錄表,需要啟動(dòng)一個(gè)定時(shí)任務(wù)去不停地掃描消息日志記錄,確保消息能夠被發(fā)送。具體流程如下圖:

上圖流程:

  • 1)事務(wù)發(fā)起方本地事務(wù)執(zhí)行成功,在本地消息表中記錄消息日志。
  • 2)啟動(dòng)定時(shí)任務(wù),循環(huán)掃描本地消息表。
  • 3)定時(shí)任務(wù)掃描到消息則發(fā)送消息到消息中間件。
  • 4)消息中間件收到消息,成功返回消息發(fā)送成功通知給事務(wù)發(fā)起方。
  • 5)事務(wù)發(fā)起方收到消息發(fā)送成功則刪除日志消息。
  • 6)事務(wù)參與方訂閱消息,消費(fèi)消息。
  • 7)事務(wù)參與方處理本地事務(wù)。
  • 8)本地事務(wù)處理成功,發(fā)送成功ack給消息中間件。

需要注意的點(diǎn):

事務(wù)參與方保證接口冪等性。

2.RocketMq事務(wù)消息方案

Apache RocketMQ 4.3之后的版本正式支持事務(wù)消息,為分布式事務(wù)實(shí)現(xiàn)提供了便利性支持。在RocketMQ 4.3后實(shí)現(xiàn)了完整的事務(wù)消息,實(shí)際上其實(shí)是對(duì)本地消息表的一個(gè)封裝,將本地消息表移動(dòng)到了MQ內(nèi)部,解決 Producer 端的消息發(fā)送與本地事務(wù)執(zhí)行的原子性問(wèn)題。

實(shí)現(xiàn)流程:

  • 1)事務(wù)發(fā)起方發(fā)送Half事務(wù)消息
  • 2)RocketMq回復(fù)Half發(fā)送成功
  • 3)事務(wù)發(fā)起方執(zhí)行本地事務(wù)
  • 4)事務(wù)發(fā)起方執(zhí)行本地事務(wù)成功,發(fā)送commit到RocketMq,mq投遞消息到事務(wù)參與方;事務(wù)發(fā)起方執(zhí)行本地事務(wù)失敗,發(fā)送rollback到RocketMq,mq刪除消息。
  • 5)當(dāng)RocketMq一定時(shí)間內(nèi)未收到來(lái)自事務(wù)發(fā)起方的確認(rèn)信息,會(huì)對(duì)事務(wù)發(fā)起方進(jìn)行事務(wù)回查。
  • 6)事務(wù)發(fā)起方查詢本地事務(wù)狀態(tài)。
  • 7)事務(wù)發(fā)起方根據(jù)查詢到的事務(wù)狀態(tài)發(fā)送commint/rollback到RocketMq。
  • 8)當(dāng)RocketMq發(fā)起commit后,收到失敗或一定時(shí)間未收到成功ack,則會(huì)發(fā)起重試。

優(yōu)點(diǎn):

消息數(shù)據(jù)獨(dú)立存儲(chǔ),降低業(yè)務(wù)系統(tǒng)與消息系統(tǒng)之間的耦合。

吞吐量?jī)?yōu)于本地消息表方案。

缺點(diǎn):

一次消息發(fā)送需要兩次網(wǎng)絡(luò)請(qǐng)求(half消息 + commit/rollback)。

需要實(shí)現(xiàn)消息回查接口。

其實(shí)每種分布式事務(wù)的解決方案都有優(yōu)劣,我們需要權(quán)衡利弊,選擇最合適業(yè)務(wù)場(chǎng)景的一種才是王道!

好了。今天就說(shuō)到這了,我還會(huì)不斷分享自己的所學(xué)所想,希望我們一起走在成功的道路上!

本文轉(zhuǎn)載自微信公眾號(hào)「狼王編程」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系狼王編程公眾號(hào)。

 

責(zé)任編輯:姜華 來(lái)源: 狼王編程
相關(guān)推薦

2023-07-25 09:52:00

本地事務(wù)宕機(jī)

2022-07-21 06:54:28

微服務(wù)系統(tǒng)RocketMQ

2015-10-19 10:42:37

分布式一致性應(yīng)用系統(tǒng)

2024-06-04 10:58:30

2022-12-19 19:12:17

分布式事務(wù)

2019-10-11 23:27:19

分布式一致性算法開(kāi)發(fā)

2021-06-06 12:45:41

分布式CAPBASE

2017-09-22 12:08:01

數(shù)據(jù)庫(kù)分布式系統(tǒng)互聯(lián)網(wǎng)

2019-09-05 08:43:34

微服務(wù)分布式一致性數(shù)據(jù)共享

2021-11-22 16:30:30

分布式一致性分布式系統(tǒng)

2024-01-31 09:54:51

Redis分布式

2017-09-21 10:59:36

分布式系統(tǒng)線性一致性測(cè)試

2024-11-28 10:56:55

2021-07-28 08:39:25

分布式架構(gòu)系統(tǒng)

2022-06-07 12:08:10

Paxos算法

2021-06-03 15:27:31

RaftSOFAJRaft

2025-03-27 03:00:00

2023-08-22 09:32:44

邊緣計(jì)算管理

2023-11-01 10:11:00

Java分布式

2023-06-28 07:39:02

SeataTCC方案XA 方案
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)