在并發(fā)場景中,我們往往會使用隊列將一些耗時的行為給暫存起來嘀倒,然后后臺啟用業(yè)務(wù)程序去消化它。?
能夠提供這種隊列服務(wù)的局冰,redis测蘑,kafka各算一個。先說redis.? redis有個list類型康二,有排序功能碳胳,能存億級別的數(shù)據(jù),并且從頭或尾出數(shù)據(jù)復(fù)雜度O1沫勿,并且有原子級別的鎖機制挨约,講這么多就是為了證明它有能力使用于高并發(fā)場景接收C端的必要業(yè)務(wù)數(shù)據(jù)入隊。技術(shù)角度分析:C端10萬級別請求來了产雹,redis的list入隊有個原子性操作可以保證快去并且最終有序的入隊诫惭,這樣一來無論你同一時刻多少請求來了,最終redis總是一個一個來處理的蔓挖,只是它會很快速夕土,最終的結(jié)果就是它們有項先后順序的進入了redis的list,就成了我們常說的入隊列了瘟判。再說出隊怨绣,后臺啟用多進程/線程/協(xié)程并行去隊列里面取數(shù)據(jù)進行業(yè)務(wù)處理,當(dāng)然盡管你后臺程序可以是并行去redis隊列取數(shù)據(jù)并使用拷获,但是對于redis服務(wù)端來說都是一個個客戶端篮撑,可以做到讓所有客戶端只能一個個來pull隊列里面的數(shù)據(jù),劃重點啦4夜稀S俊!強調(diào)下redis服務(wù)端是異步行為將數(shù)據(jù)發(fā)送到客戶端的驮吱,這就會造成服務(wù)端單方面認為從它這里出去的數(shù)據(jù)都是按隊列里面的先進先出的順序發(fā)送給客戶端茧妒,它才不管你達到客戶端實際接受到的是不是還是原有的那個順序,反正服務(wù)端是按那個順序異步發(fā)的糠馆,有趣的地方也是這里了嘶伟,比如服務(wù)端先數(shù)據(jù)a出隊,其次數(shù)據(jù)b又碌,但說不定實際到達客戶端的是數(shù)據(jù)b九昧,道理很簡單異步行為,讓a先走毕匀,但接收a的客戶端可能卡了铸鹰,花了3秒才接住a,但接收b的客戶端信號很好皂岔,1秒就接住了蹋笼,那你a雖然比b先出隊半秒也還是比b慢。
再談kafka躁垛,kafka用到了zookeeper剖毯,意味著它可以分布式的集群部署便的簡單可靠強大并響應(yīng)快速,redis你自己去部署一個集群說實話我有點懵教馆,畢竟我沒有從它文檔里面直接獲取我該怎樣去配置它它就是集群了逊谋,但kafka有,kafka有訂閱通知那一套土铺,redis我印象中它也有胶滋,但是redis不保證推送過去的消息客戶端一定就接受到了,所以對于redis的訂閱通知來說悲敷,而且redis萬一掛了呢究恤,你可能會說有持久化啊,快照級別的后德,跟秒級別的持久化redis也都是有的部宿,但是服務(wù)不能停啊F芭取?呱汀!哪怕是一刻箱季,可見并不是它的拿手好菜涯穷,想反kafka的集群對于數(shù)據(jù)有效寫入的標(biāo)準(zhǔn)是可以根據(jù)實際寫成功服務(wù)器的數(shù)量為參考依據(jù)去保證的,打個比方集群3臺藏雏,2臺寫入成功了拷况,1臺失敗了,它就認為寫入成功了掘殴,并且它有自己的一套機制去保證集群服務(wù)器最低存活數(shù)量赚瘦,重啟掛掉的服務(wù)器,并且它總是建議你配置的服務(wù)器數(shù)量為奇數(shù)奏寨。再回正題起意,kafka訂閱通知發(fā)消息是以組為單位,一個組里面的成員應(yīng)該保持小于或者等于該主題創(chuàng)建時設(shè)置的分區(qū)個數(shù)病瞳,并且發(fā)送過來消息只會讓該組中的一個客戶端消費揽咕,劃重點啦1帷!G咨啤I枰住!? 3個kafka客戶端進一個H組了蛹头,訂閱了一個3分區(qū)的A主題顿肺,現(xiàn)在A主題有一個M消息過來了,它會直接發(fā)到訂閱該主題的組渣蜗,那么我們的H組就獲取到了M消息屠尊,但kafka內(nèi)部機制可以保證M消息只會被該組的一個成員客戶端給消費掉,這不就是提供了多進程并行處理隊列的數(shù)據(jù)的類似場景么耕拷,想想一下主題就是隊列讼昆,組里面的成員就是多個不同服務(wù)器里面進程,不就是多個進程同時等著該主題的消息發(fā)送過來斑胜,最終總有也只有一個客戶端成功處理掉該消息控淡,并且由于kafka支持分區(qū),組內(nèi)的成員可以各自對接一個分區(qū)止潘,實現(xiàn)并行2籼俊!凭戴!而且kafka消費是支持同步與異步的噢涧狮,這個可以對比redis了隊列和訂閱了。
kafka是基于zookeeper上玩耍的么夫,所以可以先去大概了解一下zookeeper受分布式場景喜愛的者冤。我感覺到了kafka主題分區(qū)并行,以及配置選舉档痪,leader涉枫,flower等還有很多秘密,估計只能實戰(zhàn)中慢慢再挖掘了腐螟,ok愿汰!