laravel隊(duì)列消費(fèi)方式 JAVA如何用隊(duì)列實(shí)現(xiàn)并發(fā)?
JAVA如何用隊(duì)列實(shí)現(xiàn)并發(fā)?如果是為了爭(zhēng)奪資源,按照先到先得的規(guī)則不作弊,那么一個(gè)相對(duì)簡(jiǎn)單的實(shí)現(xiàn)就是排隊(duì)。無(wú)論請(qǐng)求的并發(fā)度有多高,如果用線程來(lái)服務(wù)用戶,也就是說(shuō)一個(gè)人請(qǐng)求資源,那么就啟動(dòng)一個(gè)線程,CP
JAVA如何用隊(duì)列實(shí)現(xiàn)并發(fā)?
如果是為了爭(zhēng)奪資源,按照先到先得的規(guī)則不作弊,那么一個(gè)相對(duì)簡(jiǎn)單的實(shí)現(xiàn)就是排隊(duì)。無(wú)論請(qǐng)求的并發(fā)度有多高,如果用線程來(lái)服務(wù)用戶,也就是說(shuō)一個(gè)人請(qǐng)求資源,那么就啟動(dòng)一個(gè)線程,CPU總是按順序執(zhí)行線程,比如現(xiàn)在有三個(gè)人(passer-by-a,passer-by-B,passer-by-C)請(qǐng)求一個(gè)資源,服務(wù)器有三個(gè)線程為這三個(gè)人服務(wù)。假設(shè)這三個(gè)人在請(qǐng)求時(shí)沒(méi)有足夠的幸運(yùn)及時(shí)得到CPU時(shí)間片,那么他們就等于公平競(jìng)爭(zhēng)CPU資源,CPU選擇運(yùn)行線程的順序是不確定的,如果選擇運(yùn)行路人C的線程,就把它放入隊(duì)列。路人B、路人C等等,他們可能會(huì)奇怪為什么不及時(shí)處理,因?yàn)楹罄m(xù)操作可能會(huì)很費(fèi)時(shí),而且線程需要很長(zhǎng)時(shí)間,當(dāng)有更多的人請(qǐng)求資源時(shí),服務(wù)器可能會(huì)掛斷
1。首先,上圖顯示了發(fā)送和使用消息的過(guò)程
2。首先,需要定義消息協(xié)議,如ActiveMQ、stomp、XMPP等。消息協(xié)議定義后,消息隊(duì)列需要滿足什么場(chǎng)景
是的,您需要保證消息的可靠性嗎?如果需要的話,您需要使存儲(chǔ)高度可用
您需要支持同步和異步消息
您需要確保消息的順序
您需要支持延遲消息
有關(guān)詳細(xì)信息,您可以參考許多開(kāi)源實(shí)現(xiàn)功能。例如,rocketmq是高度可靠的,Kafka是高吞吐量的,但是它不是高度可靠的。
如何設(shè)計(jì)一個(gè)MQ消息隊(duì)列?
庫(kù)存被加載到緩存中,例如redis、基于redis的原子操作、庫(kù)存扣減和庫(kù)存驗(yàn)證。
下單成功后,發(fā)送成功的訂單MQ,庫(kù)存系統(tǒng)消耗MQ扣減庫(kù)存。當(dāng)然,消費(fèi)者需要確保冪等。
樂(lè)觀鎖用于庫(kù)存系統(tǒng)的數(shù)據(jù)庫(kù)操作。