RocketMQ解決消息重復(fù)啟動(dòng) 實(shí)用docker容器推薦?
實(shí)用docker容器推薦?推薦MySQL Redis MongoDB等存儲(chǔ)容器,非常方便本地開發(fā)和學(xué)習(xí)。此外,還有一系列類似于nacos gitlab rockRocketMQ是如何應(yīng)對(duì)每天1500億
實(shí)用docker容器推薦?
推薦MySQL Redis MongoDB等存儲(chǔ)容器,非常方便本地開發(fā)和學(xué)習(xí)。此外,還有一系列類似于nacos gitlab rock
RocketMQ是如何應(yīng)對(duì)每天1500億條的數(shù)據(jù)處理的?
這個(gè)問題太大了。簡(jiǎn)單來說,發(fā)布者發(fā)出消息后,消息數(shù)據(jù)已經(jīng)以文件的形式相對(duì)有序地存儲(chǔ)在各個(gè)服務(wù)器中,消費(fèi)者也相對(duì)有序地消費(fèi)了消息數(shù)據(jù)。關(guān)鍵點(diǎn)是消息的分布式存儲(chǔ)、異步傳輸和內(nèi)存的零拷貝。
rabbitmq和rocketmq區(qū)別?
RabbitMQ基于具有跨語言特性的AMQP協(xié)議,支持多種開發(fā)語言,用erlang語言編寫,天生具有高并發(fā)性。
Rock
JAVA面試如何保證消息不被重復(fù)消費(fèi)?如何保證消息消費(fèi)的冪等性?
今天,讓我們 讓我們看一些方案來確保MQ的冪等性。
01.冪等的概念
我先說說什么是冪等。
當(dāng)用戶一次或多次請(qǐng)求同一個(gè)操作時(shí)(多次發(fā)送或接收消息),最終結(jié)果是一致的,不會(huì)因?yàn)槎啻握?qǐng)求而產(chǎn)生副作用;比如同一個(gè)訂單付款兩次,客戶最后應(yīng)該只扣一次。
查詢和刪除:查詢自然是冪等的。在數(shù)據(jù)不變的前提下,相同查詢條件下一次查詢和多次查詢的結(jié)果相同;刪除也是如此。如果同一個(gè)條件刪除一次,刪除多次,可能刪除的數(shù)據(jù)量是不一樣的,但是數(shù)據(jù)庫里的數(shù)據(jù)不會(huì)因?yàn)橹貜?fù)刪除而不一樣。
添加和修改:如果你不 t做冪等處理,可能會(huì)出現(xiàn)問題;多次添加可能導(dǎo)致多個(gè)相同的數(shù)據(jù)(主鍵是自動(dòng)生成的);如果只是將部分字段更新為固定值,不會(huì)出現(xiàn)冪等問題,但是如果新值需要在舊值上進(jìn)行處理和計(jì)算,比如增加多少,減少多少,那么重復(fù)執(zhí)行后結(jié)果就不一樣了。
消息不是等冪的。
1.生產(chǎn)者通常使用超時(shí)重傳機(jī)制向MQ發(fā)送消息,但是如果生產(chǎn)者 s消息已經(jīng)發(fā)出,但是由于網(wǎng)絡(luò)原因沒有收到確認(rèn)信息,可能會(huì)重新發(fā)送,最終導(dǎo)致消息重復(fù)發(fā)送。
2.消費(fèi)者消費(fèi)的過程也差不多。消費(fèi)者收到來自MQ的消息,但MQ沒有收到確認(rèn)消息,因此消息可能會(huì)重新發(fā)送給其他消費(fèi)者,或者網(wǎng)絡(luò)恢復(fù)后再次發(fā)送給消費(fèi)者,最終導(dǎo)致重復(fù)消費(fèi)。
03.解決辦法
1.唯一索引
使用唯一索引可以有效防止臟數(shù)據(jù)的添加:當(dāng)一個(gè)表中存在唯一索引時(shí),并發(fā)添加相同數(shù)據(jù)時(shí)會(huì)報(bào)錯(cuò),但這是在單個(gè)數(shù)據(jù)庫、單個(gè)表的情況下。只有等待后才有效。如果項(xiàng)目的數(shù)據(jù)量很大,采用將數(shù)據(jù)庫分表的策略,那么冪等性的問題就無法再通過數(shù)據(jù)庫的唯一索引來解決了。
2.全球唯一ID
每封郵件都帶有一個(gè)全球唯一的ID。當(dāng)消費(fèi)者收到消息時(shí),他在執(zhí)行之前判斷這個(gè)ID是否已經(jīng)在本地存在。如果不存在,他記錄執(zhí)行后的ID(存儲(chǔ)在數(shù)據(jù)庫或Redis中,表示交易已經(jīng)執(zhí)行)。如果已經(jīng)存在,說明該消息已經(jīng)被消費(fèi),不能再次執(zhí)行。
在許多分布式架構(gòu)中,全球唯一ID將被用作基本的微服務(wù)。當(dāng)然,這種服務(wù)的可靠性極高,或者可以由每個(gè)應(yīng)用程序使用并生成全局唯一的ID算法。然而,總的來說,實(shí)現(xiàn)引入全球唯一ID的方案仍然非常麻煩。
3.營(yíng)業(yè)狀況
為了保證消息的冪等性,也可以結(jié)合業(yè)務(wù)流程來考慮。例如,許多業(yè)務(wù)流程在每一步都是有狀態(tài)的。例如,在線購物可能包括:訂單創(chuàng)建、支付和交付,因此保單狀態(tài)為 "待定付款 "付款前,保單狀態(tài)可以更改為 "等待交付和付款后;然后,如果發(fā)起重復(fù)扣款,第二次扣款時(shí)保單狀態(tài)已經(jīng)改變,扣款失敗。
步驟4:復(fù)制表格
如果服務(wù)中有一個(gè)唯一的標(biāo)識(shí)符,您可以使用一個(gè)復(fù)制表將這個(gè)唯一的表示保存在復(fù)制表中。如果重復(fù)插入,將被檢查。
例如,在上面的場(chǎng)景中,一個(gè)訂單只會(huì)支付一次,所以在支付時(shí),將訂單號(hào)作為唯一標(biāo)識(shí)符保存在重復(fù)表中,以確保支付操作只會(huì)發(fā)生一次;這種方法也使用唯一ID,但與全局唯一ID不同,這個(gè)唯一ID是特定于特定業(yè)務(wù)的。
我會(huì)繼續(xù)分享我對(duì)Java開發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的看法,希望得到大家的關(guān)注。