請(qǐng)求數(shù)據(jù)。
[0025]步驟S200、所述API服務(wù)器接收所述請(qǐng)求數(shù)據(jù),并將所述請(qǐng)求數(shù)據(jù)發(fā)送至消息隊(duì)列集群緩沖,所述消息隊(duì)列集群再將所述請(qǐng)求數(shù)據(jù)發(fā)送至分布式實(shí)時(shí)計(jì)算系統(tǒng)集群。
[0026]本發(fā)明的實(shí)施例中,當(dāng)所述API服務(wù)器接收所述請(qǐng)求數(shù)據(jù)后,并未在API服務(wù)器上進(jìn)行請(qǐng)求數(shù)據(jù)的業(yè)務(wù)邏輯運(yùn)算,而是將所述請(qǐng)求數(shù)據(jù)發(fā)送至消息隊(duì)列集群緩沖后,再由所述消息隊(duì)列集群將所述請(qǐng)求數(shù)據(jù)發(fā)送至分布式實(shí)時(shí)計(jì)算系統(tǒng)集群。
[0027]具體實(shí)施時(shí),在API服務(wù)器中部署Zooke印er(它是一個(gè)針對(duì)大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng),提供的功能包括:配置維護(hù)、名字服務(wù)、分布式同步、組服務(wù)等)集群,用于集中管理配置信息并可以動(dòng)態(tài)修改配置。
[0028]所述消息隊(duì)列集群部署為Kafka (它是一個(gè)分布式的,分區(qū)的,重復(fù)提交的日志服務(wù))集群,將Kafka各個(gè)節(jié)點(diǎn)的地址寫(xiě)入Zooke印er。API服務(wù)器作為Kafka的生產(chǎn)者發(fā)送消息,分布式實(shí)時(shí)計(jì)算系統(tǒng)集群作為Kafka的消費(fèi)者消費(fèi)消息。API服務(wù)器與分布式實(shí)時(shí)計(jì)算系統(tǒng)集群之間沒(méi)有直接聯(lián)系,它們可以靈活部署,甚至不需要知道對(duì)方的存在。
[0029]所述分布式實(shí)時(shí)計(jì)算系統(tǒng)集群部署為Storm集群,Storm通過(guò)API服務(wù)器中的Zookeeper獲取Kafka集群各個(gè)節(jié)點(diǎn)數(shù)據(jù)庫(kù)的地址,。API服務(wù)器將業(yè)務(wù)運(yùn)算邏輯單獨(dú)實(shí)現(xiàn)并打包成Topology (Storm運(yùn)算單元)提交給Storm。Topology需從Kafka中讀取消息,并進(jìn)行計(jì)算,計(jì)算完成后,將計(jì)算結(jié)果分布保存到Kafka集群各個(gè)節(jié)點(diǎn)數(shù)據(jù)庫(kù)中。
[0030]由于業(yè)務(wù)邏輯運(yùn)算是在分布式實(shí)時(shí)計(jì)算系統(tǒng)集群中進(jìn)行,故能降低API服務(wù)器的運(yùn)算量。而且當(dāng)業(yè)務(wù)邏輯運(yùn)算的算法發(fā)生改變時(shí),不需要修改或重新部署API服務(wù)器。
[0031]步驟S300、所述分布式實(shí)時(shí)計(jì)算系統(tǒng)集群對(duì)所述請(qǐng)求數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯運(yùn)算,并將得到的運(yùn)算結(jié)果發(fā)送至數(shù)據(jù)庫(kù)存儲(chǔ)。
[0032]在步驟S300中,若客戶端并發(fā)請(qǐng)求量大時(shí),所述分布式實(shí)時(shí)計(jì)算系統(tǒng)集群對(duì)多個(gè)客戶端傳輸?shù)恼?qǐng)求數(shù)據(jù)分別進(jìn)行處理,并將完成算而的得到的運(yùn)算結(jié)果發(fā)送至數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)。具體實(shí)施時(shí),所述數(shù)據(jù)庫(kù)采用Redis數(shù)據(jù)庫(kù),將Redis的各個(gè)節(jié)點(diǎn)的地址寫(xiě)入Zookeeper。其中,Redis數(shù)據(jù)庫(kù)是一種使用ANSI C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value (即鍵值對(duì))數(shù)據(jù)庫(kù)。
[0033]步驟S400、當(dāng)客戶端接收到用戶的結(jié)果獲取指令時(shí),向API服務(wù)器發(fā)送所述結(jié)果獲取指令,所述API服務(wù)器據(jù)所述結(jié)果獲取指令在數(shù)據(jù)庫(kù)中查詢所述運(yùn)算結(jié)果并返回至客戶端。
[0034]本發(fā)明的實(shí)施例中,當(dāng)客戶端接收用戶的操作指令向API服務(wù)器發(fā)出結(jié)果獲取指令時(shí),所述API服務(wù)器根據(jù)所述結(jié)果獲取指令在數(shù)據(jù)庫(kù)中查詢所述運(yùn)算結(jié)果,當(dāng)查詢到所述運(yùn)算結(jié)果時(shí)則立即將其發(fā)送至客戶端??梢?jiàn),上述過(guò)程沒(méi)有阻塞或者等待,提高了 API服務(wù)器的吞吐量,使得客戶端的請(qǐng)求可以得到API服務(wù)器的快速反饋。
[0035]進(jìn)一步地實(shí)施例,如圖2所示,其為本發(fā)明所述API服務(wù)器處理大數(shù)據(jù)的運(yùn)算方法中緩存及發(fā)送請(qǐng)求數(shù)據(jù)的具體流程圖。所述步驟S200中緩存及發(fā)送請(qǐng)求數(shù)據(jù)具體包括:
步驟S201、所述API服務(wù)器接收所述數(shù)據(jù)請(qǐng)求,并生成一與所述請(qǐng)求數(shù)據(jù)相對(duì)應(yīng)的請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)。
[0036]顯然,在步驟S100中可能是一個(gè)客戶端向API服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求,也有可能是多個(gè)客戶端向API服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求。為了區(qū)別不同的數(shù)據(jù)請(qǐng)求,當(dāng)所述API服務(wù)器每接收一數(shù)據(jù)請(qǐng)求時(shí),則對(duì)應(yīng)生成一唯一的請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)。當(dāng)客戶端需查詢運(yùn)算結(jié)果時(shí),根據(jù)所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)即可查詢,同時(shí)也保證了查詢結(jié)果的唯一性。
[0037]步驟S202、所述API將所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至客戶端,并將所述請(qǐng)求數(shù)據(jù)及所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至消息隊(duì)列集群緩沖。
[0038]當(dāng)API中根據(jù)請(qǐng)求數(shù)據(jù)生成請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)后,將所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至對(duì)應(yīng)的客戶端,并將所述請(qǐng)求數(shù)據(jù)發(fā)送至消息隊(duì)列集群緩沖。
[0039]步驟S203、所述消息隊(duì)列集群接收所述請(qǐng)求數(shù)據(jù)及所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí),并將所述請(qǐng)求數(shù)據(jù)發(fā)送至分布式實(shí)時(shí)計(jì)算系統(tǒng)集群。
[0040]本發(fā)明的實(shí)施例中,采用消息隊(duì)列集群作為緩沖區(qū)來(lái)緩沖所述請(qǐng)求數(shù)據(jù),而不是直接將所述請(qǐng)求數(shù)據(jù)發(fā)送至分布式實(shí)時(shí)計(jì)算系統(tǒng)集群進(jìn)行業(yè)務(wù)邏輯運(yùn)算,避免了通過(guò)DRPC方式調(diào)用分布式實(shí)時(shí)計(jì)算系統(tǒng)集群而導(dǎo)致的API服務(wù)器阻塞的問(wèn)題。
[0041]進(jìn)一步地實(shí)施例,如圖3所示,其為本發(fā)明所述API服務(wù)器處理大數(shù)據(jù)的運(yùn)算方法中運(yùn)算結(jié)果獲取的具體流程圖。所述步驟S400中運(yùn)算結(jié)果獲取具體包括:
步驟S401、當(dāng)客戶端接收到用戶的結(jié)果獲取指令時(shí),將所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至API服務(wù)器。
[0042]當(dāng)客戶端需獲取請(qǐng)求數(shù)據(jù)的運(yùn)算結(jié)果時(shí),用戶操作客戶端向API服務(wù)器發(fā)送結(jié)果獲取指令,且同時(shí)將所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至API服務(wù)器。
[0043]步驟S402、所述API服務(wù)器接收所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí),并根據(jù)所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)在所述數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的運(yùn)算結(jié)果。
[0044]顯然,API服務(wù)器根據(jù)所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)在數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的運(yùn)算結(jié)果時(shí),由于請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)是唯一的,故能保證了查詢結(jié)果的唯一性。
[0045]步驟S403、當(dāng)查詢到所述運(yùn)算結(jié)果時(shí),則將所述運(yùn)算結(jié)果發(fā)送至客戶端。
[0046]進(jìn)一步地實(shí)施例,所述步驟S403之后還包括:
當(dāng)未查詢到所述運(yùn)算結(jié)果時(shí),所述客戶端再次發(fā)出結(jié)果獲取指令,并返回執(zhí)行步驟S401o
[0047]顯然,由于在分布式實(shí)時(shí)計(jì)算系統(tǒng)集群中對(duì)大數(shù)據(jù)進(jìn)行處理時(shí),并不能在短時(shí)間內(nèi)完成多所有請(qǐng)求數(shù)據(jù)的運(yùn)算。故當(dāng)有客戶端在發(fā)送的數(shù)據(jù)查詢指令后,API服務(wù)器返回的計(jì)算結(jié)果為空(即未查詢到運(yùn)算結(jié)果)時(shí),則客戶端需再次向API服務(wù)器發(fā)送結(jié)果獲取指令。其中,客戶端再次向向API服務(wù)器發(fā)送結(jié)果獲取指令與上一次發(fā)送結(jié)果獲取指令的時(shí)間間隔為任意的。
[0048]經(jīng)實(shí)際測(cè)試可知,傳統(tǒng)的API服務(wù)器處理10萬(wàn)次請(qǐng)求耗時(shí)168s,平均響應(yīng)時(shí)間3190ms ;而本發(fā)明所述的API服務(wù)器處理大數(shù)據(jù)的運(yùn)算方法,處理10萬(wàn)次發(fā)送請(qǐng)求數(shù)據(jù)和10萬(wàn)次運(yùn)算結(jié)果獲取耗時(shí)分別為28s和43s,總耗時(shí)為71s,平均響應(yīng)時(shí)間為1191ms??梢?jiàn),本發(fā)明所提供的步式API服務(wù)器實(shí)現(xiàn)方法是一種低延遲、高性能、易擴(kuò)展的方法。
[0049]基于上述實(shí)施例,本發(fā)明還提供一種API服務(wù)器處理大數(shù)據(jù)的運(yùn)算系統(tǒng)。如圖4所示,其為本發(fā)明所述API服務(wù)器處理大數(shù)據(jù)的運(yùn)算系統(tǒng)的較佳實(shí)施例的結(jié)構(gòu)框圖,所述API服務(wù)器處理大數(shù)據(jù)的運(yùn)算系統(tǒng)包括:
請(qǐng)求發(fā)送模塊100,用于客戶端接收用戶的操作指令,向API服務(wù)器發(fā)送請(qǐng)求數(shù)據(jù);具體如上述方法步驟S100所述。
[0050]緩存及發(fā)送模塊200,用于所述API服務(wù)器接收所述請(qǐng)求數(shù)據(jù),并將所述請(qǐng)求數(shù)據(jù)發(fā)送至消息隊(duì)列集群緩沖,所述消息隊(duì)列集群再將所述請(qǐng)求數(shù)據(jù)發(fā)送至分布式實(shí)時(shí)計(jì)算系統(tǒng)集群;具體如上述方法步驟S200所述。
[0051]運(yùn)算及存儲(chǔ)模塊300,用于所述分布式實(shí)時(shí)計(jì)算系統(tǒng)集群對(duì)所述請(qǐng)求數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯運(yùn)算,并將得到的運(yùn)算結(jié)果發(fā)送至數(shù)據(jù)庫(kù)存儲(chǔ);具體如上述方法步驟S300所述。
[0052]結(jié)果獲取模塊400,用于當(dāng)客戶端接收到用戶的結(jié)果獲取指令時(shí),向API服務(wù)器發(fā)送所述結(jié)果獲取指令,所述API服務(wù)器據(jù)所述結(jié)果獲取指令在數(shù)據(jù)庫(kù)中查詢所述運(yùn)算結(jié)果并返回至客戶端;具體如上述方法步驟S400所述。
[0053]進(jìn)一步地實(shí)施例,在所述API服務(wù)器處理大數(shù)據(jù)的運(yùn)算系統(tǒng)中,所述緩存及發(fā)送模塊200具體包括: 標(biāo)識(shí)生成單元,用于所述API服務(wù)器接收所述數(shù)據(jù)請(qǐng)求,并生成一與所述請(qǐng)求數(shù)據(jù)相對(duì)應(yīng)的請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí);具體如步驟S201所述。
[0054]數(shù)據(jù)及標(biāo)識(shí)發(fā)送單元,用于所述API將所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至客戶端,并將所述請(qǐng)求數(shù)據(jù)及所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí)發(fā)送至消息隊(duì)列集群緩沖;具體如上述方法步驟S202所述。
[0055]緩存數(shù)據(jù)發(fā)送單元,用于所述消息隊(duì)列集群接收所述請(qǐng)求數(shù)據(jù)及所述請(qǐng)求數(shù)據(jù)身份標(biāo)識(shí),并將所述請(qǐng)求數(shù)據(jù)發(fā)送至分布式實(shí)