卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

RocketMQ解決消息重復(fù)啟動(dòng) 實(shí)用docker容器推薦?

實(shí)用docker容器推薦?推薦MySQL Redis MongoDB等存儲(chǔ)容器,非常方便本地開(kāi)發(fā)和學(xué)習(xí)。此外,還有一系列類(lèi)似于nacos gitlab rockRocketMQ是如何應(yīng)對(duì)每天1500億

實(shí)用docker容器推薦?

推薦MySQL Redis MongoDB等存儲(chǔ)容器,非常方便本地開(kāi)發(fā)和學(xué)習(xí)。此外,還有一系列類(lèi)似于nacos gitlab rock

RocketMQ是如何應(yīng)對(duì)每天1500億條的數(shù)據(jù)處理的?

這個(gè)問(wèn)題太大了。簡(jiǎn)單來(lái)說(shuō),發(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基于具有跨語(yǔ)言特性的AMQP協(xié)議,支持多種開(kāi)發(fā)語(yǔ)言,用erlang語(yǔ)言編寫(xiě),天生具有高并發(fā)性。

Rock

JAVA面試如何保證消息不被重復(fù)消費(fèi)?如何保證消息消費(fèi)的冪等性?

今天,讓我們 讓我們看一些方案來(lái)確保MQ的冪等性。

01.冪等的概念

我先說(shuō)說(shuō)什么是冪等。

當(dāng)用戶(hù)一次或多次請(qǐng)求同一個(gè)操作時(shí)(多次發(fā)送或接收消息),最終結(jié)果是一致的,不會(huì)因?yàn)槎啻握?qǐng)求而產(chǎn)生副作用;比如同一個(gè)訂單付款兩次,客戶(hù)最后應(yīng)該只扣一次。

查詢(xún)和刪除:查詢(xún)自然是冪等的。在數(shù)據(jù)不變的前提下,相同查詢(xún)條件下一次查詢(xún)和多次查詢(xún)的結(jié)果相同;刪除也是如此。如果同一個(gè)條件刪除一次,刪除多次,可能刪除的數(shù)據(jù)量是不一樣的,但是數(shù)據(jù)庫(kù)里的數(shù)據(jù)不會(huì)因?yàn)橹貜?fù)刪除而不一樣。

添加和修改:如果你不 t做冪等處理,可能會(huì)出現(xiàn)問(wèn)題;多次添加可能導(dǎo)致多個(gè)相同的數(shù)據(jù)(主鍵是自動(dòng)生成的);如果只是將部分字段更新為固定值,不會(huì)出現(xiàn)冪等問(wèn)題,但是如果新值需要在舊值上進(jìn)行處理和計(jì)算,比如增加多少,減少多少,那么重復(fù)執(zhí)行后結(jié)果就不一樣了。

消息不是等冪的。

1.生產(chǎn)者通常使用超時(shí)重傳機(jī)制向MQ發(fā)送消息,但是如果生產(chǎn)者 s消息已經(jīng)發(fā)出,但是由于網(wǎng)絡(luò)原因沒(méi)有收到確認(rèn)信息,可能會(huì)重新發(fā)送,最終導(dǎo)致消息重復(fù)發(fā)送。

2.消費(fèi)者消費(fèi)的過(guò)程也差不多。消費(fèi)者收到來(lái)自MQ的消息,但MQ沒(méi)有收到確認(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ù)庫(kù)、單個(gè)表的情況下。只有等待后才有效。如果項(xiàng)目的數(shù)據(jù)量很大,采用將數(shù)據(jù)庫(kù)分表的策略,那么冪等性的問(wèn)題就無(wú)法再通過(guò)數(shù)據(jù)庫(kù)的唯一索引來(lái)解決了。

2.全球唯一ID

每封郵件都帶有一個(gè)全球唯一的ID。當(dāng)消費(fèi)者收到消息時(shí),他在執(zhí)行之前判斷這個(gè)ID是否已經(jīng)在本地存在。如果不存在,他記錄執(zhí)行后的ID(存儲(chǔ)在數(shù)據(jù)庫(kù)或Redis中,表示交易已經(jīng)執(zhí)行)。如果已經(jīng)存在,說(shuō)明該消息已經(jīng)被消費(fèi),不能再次執(zhí)行。

在許多分布式架構(gòu)中,全球唯一ID將被用作基本的微服務(wù)。當(dāng)然,這種服務(wù)的可靠性極高,或者可以由每個(gè)應(yīng)用程序使用并生成全局唯一的ID算法。然而,總的來(lái)說(shuō),實(shí)現(xiàn)引入全球唯一ID的方案仍然非常麻煩。

3.營(yíng)業(yè)狀況

為了保證消息的冪等性,也可以結(jié)合業(yè)務(wù)流程來(lái)考慮。例如,許多業(yè)務(wù)流程在每一步都是有狀態(tài)的。例如,在線購(gòu)物可能包括:訂單創(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開(kāi)發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的看法,希望得到大家的關(guān)注。