本發(fā)明涉及遠(yuǎn)程調(diào)用,尤其是涉及一種基于Redis的Storm的遠(yuǎn)程調(diào)用方法。
背景技術(shù):
Storm是一個(gè)分布式的,可靠的,容錯(cuò)的數(shù)據(jù)流處理系統(tǒng)。它會(huì)把工作任務(wù)委托給不同類型的組件,每個(gè)組件負(fù)責(zé)處理一項(xiàng)簡單特定的任務(wù)。Storm集群的輸入流由一個(gè)被稱作spout的組件管理,spout把數(shù)據(jù)傳遞給bolt,bolt要么把數(shù)據(jù)保存到某種存儲(chǔ)器,要么把數(shù)據(jù)傳遞給其它的bolt。一個(gè)Storm集群就是在一連串的bolt之間轉(zhuǎn)換spout傳過來的數(shù)據(jù)。
RPC(Remote Procedure Call Protocol)為遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請求服務(wù)而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
RPC采用客戶機(jī)/服務(wù)器模式。請求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
Storm也提供RPC接口實(shí)現(xiàn),但Storm RPC存在諸多問題。原因如下:RPC請求消息是放在RPC Server內(nèi)存隊(duì)列中,在請求量大時(shí),內(nèi)存需要緩存大量數(shù)據(jù),對內(nèi)存造成很大的負(fù)擔(dān),造成巨大的瓶頸。雖然Storm集群可以啟動(dòng)多個(gè)RPCServer,但單個(gè)客戶端一次只能選擇連接一個(gè)目標(biāo)Server。多個(gè)Server之間并沒有做負(fù)載均衡。如果一個(gè)Server故障,客戶端需要重新連接另外一個(gè)Server,并重新調(diào)用。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是針對上述問題提供一種避免數(shù)據(jù)緩存量過大、防止單點(diǎn)故障以及可靠性高的基于Redis的Storm的遠(yuǎn)程調(diào)用方法。
本發(fā)明的目的可以通過以下技術(shù)方案來實(shí)現(xiàn):
一種基于Redis的Storm的遠(yuǎn)程調(diào)用方法,調(diào)用客戶端利用消息隊(duì)列和Redis對Storm實(shí)現(xiàn)遠(yuǎn)程調(diào)用,其特征在于,所述方法包括下列步驟:
1)調(diào)用客戶端發(fā)送請求消息至消息隊(duì)列;
2)Storm從消息隊(duì)列中獲取請求消息并進(jìn)行處理;
3)Storm將處理后的消息結(jié)果放入Redis中;
4)調(diào)用客戶端從Redis中獲取步驟3)中處理后的消息結(jié)果。
所述步驟3)采用LPUSH命令將處理后的消息結(jié)果放入Redis中,具體為:
31)查找key對應(yīng)的變量,若該變量不存在,則進(jìn)入步驟32),若該變量存在,則進(jìn)入步驟33);
32)創(chuàng)建一個(gè)空列表,并與key對應(yīng);
33)判斷與key對應(yīng)的變量是否為列表類型,若否則返回錯(cuò)誤,若是則進(jìn)入步驟34);
34)將指定值插入到key對應(yīng)的變量的頭部。
所述步驟4)采用BLPOP命令從Redis中獲取處理后的消息結(jié)果,具體為:
41)查找key對應(yīng)的變量,若該變量不存在或該變量對應(yīng)的列表為空列表,則返回步驟41),否則進(jìn)入步驟42);
42)彈出key對應(yīng)的第一個(gè)變量的頭元素,并和key一起組成結(jié)果返回給調(diào)用者。
所述消息隊(duì)列包括基于Kafka的隊(duì)列。
所述消息含有MessageID。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
(1)Storm只用于做流式處理,處理消息可以來自于消息隊(duì)列(如Kafka等),解決了RPC Server的數(shù)據(jù)緩存內(nèi)存瓶頸。
(2)客戶端交互的是消息隊(duì)列(如Kafka)和Redis,不存在RPC Server一次調(diào)用中的單點(diǎn)故障,有更高的可靠性。
(3)采用LPUSH命令,在將消息結(jié)果放入Redis中時(shí),如果找不到目標(biāo)對象將會(huì)及時(shí)報(bào)錯(cuò)。
(4)采用BLPOP命令,從Redis中取消息結(jié)果時(shí),若果Redis中暫時(shí)沒有存放的消息結(jié)果時(shí)保持堵塞,避免誤取數(shù)據(jù)。
(5)消息隊(duì)列可以選擇Kafka,也可根據(jù)實(shí)際情況選擇其他消息隊(duì)列,實(shí)用性能強(qiáng)。
(6)調(diào)用客戶端發(fā)給Stom處理的每條記錄都有一個(gè)唯一的MessageID,避免數(shù)據(jù)出現(xiàn)重復(fù)或錯(cuò)誤。
附圖說明
圖1為Storm的組件示意圖;
圖2為本發(fā)明的方法示意圖。
具體實(shí)施方式
下面結(jié)合附圖和具體實(shí)施例對本發(fā)明進(jìn)行詳細(xì)說明。本實(shí)施例以本發(fā)明技術(shù)方案為前提進(jìn)行實(shí)施,給出了詳細(xì)的實(shí)施方式和具體的操作過程,但本發(fā)明的保護(hù)范圍不限于下述的實(shí)施例。
如圖1所示,Storm集群的輸入流由一個(gè)被稱作spout的組件管理,spout把數(shù)據(jù)傳遞給bolt,bolt要么把數(shù)據(jù)保存到某種存儲(chǔ)器,要么把數(shù)據(jù)傳遞給其它的bolt。一個(gè)Storm集群就是在一連串的bolt之間轉(zhuǎn)換spout傳過來的數(shù)據(jù)。
因此要實(shí)現(xiàn)Storm的遠(yuǎn)程調(diào)用,可以利用Storm的RPC接口,但這種方式的性能較差。如圖2所示為本發(fā)明提出的基于Redis的Storm的遠(yuǎn)程調(diào)用方法,調(diào)用客戶端利用消息隊(duì)列和Redis對Storm實(shí)現(xiàn)遠(yuǎn)程調(diào)用,該方法包括下列步驟:
1)調(diào)用客戶端發(fā)送消息至消息隊(duì)列;
2)Storm從消息隊(duì)列中獲取消息并進(jìn)行處理;
3)Storm使用LPUSH命令將處理后的消息結(jié)果放入Redis中;
4)調(diào)用客戶端使用BLPOP命令從Redis中獲取步驟3)中處理后的消息結(jié)果。
其中,LPUSH命令具體為LPUSH key value[value...],它是將所有指定的值插入到存于key的列表的頭部。如果key不存在,那么在進(jìn)行push操作前會(huì)創(chuàng)建一個(gè)空列表。如果key對應(yīng)的值不是一個(gè)list的話,那么會(huì)返回一個(gè)錯(cuò)誤。
而BLPOP命令具體為BLPOP key[key...]timeout,當(dāng)BLPOP被調(diào)用時(shí),如果給定key內(nèi)至少有一個(gè)非空列表,那么彈出遇到的第一個(gè)非空列表的頭元素,并和被彈出元素所屬的列表的名字key一起,組成結(jié)果返回給調(diào)用者。也就是說,調(diào)用BLPOP命令會(huì)堵塞一直到能取到key。
因此在調(diào)用客戶端對Storm進(jìn)行遠(yuǎn)程調(diào)用時(shí),首先對發(fā)送的消息都記錄一個(gè)唯一的ID即MessageID,然后將該消息發(fā)送給消息隊(duì)列(如Kafka),Storm從消息隊(duì)列中獲取消息并對該消息進(jìn)行處理。處理后,Storm使用LPUSH命令把結(jié)果放入到Redis中,具體的指令為LPUSH MessageID結(jié)果,調(diào)用客戶端則通過BLPOP命令從Redis中獲取數(shù)據(jù),具體的指令為BLPOP MessageID超時(shí)時(shí)間。通過上述流程,調(diào)用客戶端可以遠(yuǎn)程調(diào)用Storm為其處理消息,同時(shí)無需使用Storm的RPCServer,也就避免了內(nèi)存中緩存大量數(shù)據(jù)造成性能瓶頸,同時(shí)也避免了一個(gè)Server故障導(dǎo)致需要重新連接另一個(gè)Server并重新遠(yuǎn)程調(diào)用這類問題。