本申請(qǐng)涉及計(jì)算機(jī)軟件技術(shù)領(lǐng)域,尤其涉及一種消息蓄洪方法及裝置。
背景技術(shù):
消息中間件是一個(gè)用于系統(tǒng)或組件之間、提供可靠的異步通訊、降低系統(tǒng)耦合度、提高整個(gè)系統(tǒng)的可擴(kuò)展性和可用性的一個(gè)組件,簡單理解可以看作傳話人。
消息中間件包括消息總線和消息客戶端兩部分。消息總線接收從一消息客戶端發(fā)來的消息,以及將該消息發(fā)送給另一消息客戶端,另一消息客戶端接收該消息并推送給相應(yīng)的處理系統(tǒng)進(jìn)行處理。在這個(gè)過程中,發(fā)送消息的消息客戶端為該消息的生產(chǎn)者,接收該消息的消息客戶端為該消息的消費(fèi)者。
在現(xiàn)有技術(shù)中,當(dāng)消息較多消息總線處理不過來時(shí),可以通過消息蓄洪庫對(duì)處理不過來的消息進(jìn)行蓄洪,等到有能力處理時(shí)發(fā)送該消息用以消費(fèi)。具體地,消息蓄洪庫通常是由多個(gè)數(shù)據(jù)庫構(gòu)成的集群,通過按照消息相關(guān)的指定標(biāo)識(shí),在集群中分?jǐn)?shù)據(jù)庫存儲(chǔ)對(duì)應(yīng)的消息(比如,將消息的序號(hào)取模映射向集群中的某個(gè)數(shù)據(jù)庫,作為存儲(chǔ)該消息的數(shù)據(jù)庫),完成對(duì)消息的蓄洪。
但是,上述現(xiàn)有技術(shù)中的消息蓄洪方式導(dǎo)致集群中的每個(gè)數(shù)據(jù)庫固定地對(duì)應(yīng)于一些待蓄洪消息,若某個(gè)數(shù)據(jù)庫不可用時(shí),將會(huì)直接影響到對(duì)該數(shù)據(jù)庫對(duì)應(yīng)的待蓄洪消息的蓄洪操作,進(jìn)而也影響到消息蓄洪庫的可用性。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)實(shí)施例提供風(fēng)險(xiǎn)識(shí)別方法、裝置及系統(tǒng),用以解決如下技術(shù)問題:現(xiàn)有技術(shù)中的消息蓄洪方式導(dǎo)致集群中的每個(gè)數(shù)據(jù)庫固定地對(duì)應(yīng)于一些待蓄洪消息,若某個(gè)數(shù)據(jù)庫不可用時(shí),將會(huì)直接影響到對(duì)該數(shù)據(jù)庫對(duì)應(yīng)的待蓄洪消息的蓄洪操作,進(jìn)而也影響到消息蓄洪庫的可用性。
為解決上述技術(shù)問題,本申請(qǐng)實(shí)施例是這樣實(shí)現(xiàn)的:
本申請(qǐng)實(shí)施例提供的一種消息蓄洪方法,包括:
獲得待蓄洪消息;
確定可存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫的集合,所述集合是通過對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到的;
通過在確定的所述集合中,選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,完成對(duì)所述待蓄洪消息的蓄洪。
本申請(qǐng)實(shí)施例提供的一種消息蓄洪裝置,包括:
獲得模塊,獲得待蓄洪消息;
確定模塊,確定可存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫的集合,所述集合是通過對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到的;
蓄洪模塊,通過在確定的所述集合中,選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,完成對(duì)所述待蓄洪消息的蓄洪。
本申請(qǐng)實(shí)施例采用的上述至少一個(gè)技術(shù)方案能夠達(dá)到以下有益效果:不再像現(xiàn)有技術(shù)中按照標(biāo)識(shí)分?jǐn)?shù)據(jù)庫蓄洪消息(每條待蓄洪消息與蓄洪該消息所要使用的數(shù)據(jù)庫是相對(duì)固定,可以預(yù)計(jì)),而是可以基于預(yù)先或?qū)崟r(shí)對(duì)各數(shù)據(jù)庫進(jìn)行的可行性檢測,在經(jīng)檢測被認(rèn)為可用的各數(shù)據(jù)庫中選擇數(shù)據(jù)庫進(jìn)行消息蓄洪,這種選擇也可以是隨機(jī)不固定的。因此,可以消除或減少消息蓄洪庫的部分?jǐn)?shù)據(jù)庫不可用時(shí)對(duì)消息蓄洪的不利影響,有利于提高消息蓄洪庫的可用性。
附圖說明
為了更清楚地說明本申請(qǐng)實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請(qǐng)中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本申請(qǐng)實(shí)施例提供的一種消息中間件的原理示意圖;
圖2為本申請(qǐng)實(shí)施例提供的一種消息蓄洪方法的流程示意圖;
圖3為本申請(qǐng)實(shí)施例提供的一種實(shí)際應(yīng)用場景下,數(shù)據(jù)庫的一種架構(gòu)圖;
圖4為本申請(qǐng)實(shí)施例提供的對(duì)應(yīng)于圖3的一種可用數(shù)據(jù)庫集合示意圖;
圖5為本申請(qǐng)實(shí)施例提供的對(duì)應(yīng)于圖2的一種消息蓄洪裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
本申請(qǐng)實(shí)施例提供一種消息蓄洪方法及裝置。
為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)中的技術(shù)方案,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例。基于本申請(qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù)的范圍。
需要說明的是,上述的現(xiàn)有技術(shù)是以一定的場景為前提的。消息蓄洪通常通過隊(duì)列(queue)來實(shí)現(xiàn),具體地,經(jīng)常通過apachekafka來實(shí)現(xiàn)。但在所述一定的場景下,由于開源協(xié)議或其他一些原因的限制,不能使用apachekafka,于是,在上述現(xiàn)有技術(shù)中,用數(shù)據(jù)庫集群當(dāng)作一個(gè)queue來實(shí)現(xiàn)消息蓄洪,進(jìn)而導(dǎo)致了上述現(xiàn)有技術(shù)中的問題。
圖1為本申請(qǐng)實(shí)施例提供的一種消息中間件的原理示意圖。在圖1中,有a~f共六個(gè)消息客戶端,它們分別為對(duì)應(yīng)的系統(tǒng)提供消息服務(wù),當(dāng)前,a~c為消息的生產(chǎn)者,d~f為消息的消費(fèi)者。其中,a的消息通過消息總線發(fā)送給了d和e,b的消息雖然發(fā)給了消息總線但沒有客戶端消費(fèi),c的消息通過消息總線發(fā)送給了d和f。
當(dāng)消息總線接收到的消息超過其處理能力時(shí),則可以進(jìn)行消息蓄洪,等到有能力時(shí)再使消息被消費(fèi)。
下面對(duì)本申請(qǐng)的方案進(jìn)行詳細(xì)說明。
圖2為本申請(qǐng)實(shí)施例提供的一種消息蓄洪方法的流程示意圖。從程序角度而言,該流程的執(zhí)行主體包括但不限于:數(shù)據(jù)庫的客戶端或服務(wù)端、可以連接數(shù)據(jù)庫或數(shù)據(jù)庫集群的軟件(比如,背景技術(shù)中的消息總線等),等等。從設(shè)備角度而言,該流程的執(zhí)行主體可以包括但不限于可搭載上述程序的以下設(shè)備:個(gè)人計(jì)算機(jī)、大中型計(jì)算機(jī)、計(jì)算機(jī)集群、手機(jī)、平板電腦、智能可穿戴設(shè)備、車機(jī),等等。
圖2中的流程可以包括以下步驟:
s201:獲得待蓄洪消息。
在本申請(qǐng)實(shí)施例中,對(duì)于背景技術(shù)中的場景,待蓄洪消息可以獲取自消息總線,通常為消息總線來不及處理的消息;對(duì)于存在類似問題的其他場景,比如,擁塞的消息隊(duì)列,則待蓄洪消息可以獲取自消息隊(duì)列的入口;等等。
本申請(qǐng)對(duì)待蓄洪消息具體包含什么內(nèi)容,以及具體采用何種格式并不做限定,這些可以取決于待蓄洪消息所涉及的業(yè)務(wù)。比如,待蓄洪消息可以是即時(shí)通訊業(yè)務(wù)中的離線留言消息,可以是電子商務(wù)業(yè)務(wù)中的交易明細(xì)消息,可以是監(jiān)控業(yè)務(wù)中的日志消息,等等。
s202:確定可存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫的集合,所述集合是通過是對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到的。
在本申請(qǐng)實(shí)施例中,所述集合可以有多種具體表示形式,比如,列表、枚舉類型數(shù)據(jù)、結(jié)構(gòu)體等。
在本申請(qǐng)實(shí)施例中,可以有多個(gè)數(shù)據(jù)庫用于存儲(chǔ)待蓄洪消息,這些數(shù)據(jù)庫通常以集群的形式工作,在實(shí)際應(yīng)用中,由于種種原因,可能導(dǎo)致集群中的部分?jǐn)?shù)據(jù)庫暫時(shí)不可用,比如,機(jī)器故障、掉電、軟件異常等,從而導(dǎo)致背景技術(shù)中的問題。
而本申請(qǐng)則可以預(yù)先得到或?qū)崟r(shí)得到一個(gè)經(jīng)檢測具有可用性的數(shù)據(jù)庫的集合,該集合是集群的一個(gè)子集。這種可用性檢測可以是定時(shí)或不定時(shí)執(zhí)行的,也即,可以執(zhí)行多次,通過可用性檢測,可以在對(duì)消息蓄洪前,就將檢測時(shí)不具有可用性的數(shù)據(jù)庫確定出來,不作為本次消息蓄洪所要使用的數(shù)據(jù)庫,從而有利于提高消息蓄洪成功的概率,也有利于提高消息蓄洪庫的可用性。
在本申請(qǐng)實(shí)施例中,數(shù)據(jù)庫的可用性檢測具有多種具體實(shí)施方式,在不同的具體實(shí)施方式,相應(yīng)地,檢測結(jié)果的可靠性可能不同。列舉兩種檢測方式作為示例:可以針對(duì)數(shù)據(jù)庫執(zhí)行數(shù)據(jù)操作,比如,數(shù)據(jù)查詢(select)操作、數(shù)據(jù)插入(insert)操作、數(shù)據(jù)更新(upadte)操作等;可以分析數(shù)據(jù)庫最近的工作日志是否正常。
在本申請(qǐng)實(shí)施例中,步驟s202中所述的“確定集合”具體可以指:該集合已經(jīng)由執(zhí)行主體或者其他主體預(yù)先得到,在執(zhí)行步驟s202,執(zhí)行主體再確定接下來要使用的是該集合;所述的“確定集合”具體也可以指:該集合在執(zhí)行步驟s202時(shí)尚未得到,而是在執(zhí)行步驟s202中再實(shí)時(shí)地得到。前一種方式的優(yōu)點(diǎn)是有利于提高本申請(qǐng)的方案的執(zhí)行速度,后一種方式的優(yōu)點(diǎn)是可用性檢測的結(jié)果的時(shí)效性較好,有利于提高后續(xù)操作的可靠性。
s203:通過在確定的所述集合中,選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,完成對(duì)所述待蓄洪消息的蓄洪。
在本申請(qǐng)實(shí)施例中,在確定集合后,可以在集合中隨機(jī)選擇或者按照其他策略選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)待蓄洪消息。將待蓄洪消息在所選的數(shù)據(jù)庫中存儲(chǔ)完成也即表示對(duì)該待蓄洪消息蓄洪完成。
在具體實(shí)施時(shí),可以針對(duì)每條待蓄洪消息執(zhí)行一次圖2的流程,也可以針對(duì)一批待蓄洪消息執(zhí)行一次圖2中的流程。
通過圖2的方法,不再像現(xiàn)有技術(shù)中按照標(biāo)識(shí)分?jǐn)?shù)據(jù)庫蓄洪消息(每條待蓄洪消息與蓄洪該消息所要使用的數(shù)據(jù)庫是相對(duì)固定,可以預(yù)計(jì)),而是可以基于預(yù)先或?qū)崟r(shí)對(duì)各數(shù)據(jù)庫進(jìn)行的可行性檢測,在經(jīng)檢測被認(rèn)為可用的各數(shù)據(jù)庫中選擇數(shù)據(jù)庫進(jìn)行消息蓄洪,這種選擇也可以是隨機(jī)不固定的。因此,可以消除或減少消息蓄洪庫的部分?jǐn)?shù)據(jù)庫不可用時(shí)對(duì)消息蓄洪的不利影響,有利于提高消息蓄洪庫的可用性。
基于圖2的方法,本申請(qǐng)實(shí)施例還提供了該方法的一些具體實(shí)施方案,以及擴(kuò)展方案,下面進(jìn)行說明。
在本申請(qǐng)實(shí)施例中,對(duì)于步驟s202,可以預(yù)先或?qū)崟r(shí)地、定時(shí)或不定時(shí)地按照如下方式,對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到所述集合:對(duì)所述多個(gè)數(shù)據(jù)庫中的每個(gè)數(shù)據(jù)庫執(zhí)行數(shù)據(jù)操作,操作成功時(shí)確定該數(shù)據(jù)庫可用;獲得包含一個(gè)或多個(gè)被確定可用的數(shù)據(jù)庫的所述集合。該方式可以有多種更具體的實(shí)施方案。
例如,可以在執(zhí)行主體本地起一個(gè)線程,定時(shí)地(比如,每隔30秒)執(zhí)行以下操作:查詢消息蓄洪庫對(duì)應(yīng)的每個(gè)數(shù)據(jù)庫中的至少一張數(shù)據(jù)表,如果查詢成功,則可以認(rèn)為該數(shù)據(jù)庫當(dāng)前可用。根據(jù)各次查詢結(jié)果可以得到一張可用數(shù)據(jù)庫列表(也即,上述集合),并可以對(duì)該列表定時(shí)維護(hù)。
又例如,可以隨機(jī)從消息蓄洪庫對(duì)應(yīng)的各數(shù)據(jù)庫中選擇至少一個(gè)數(shù)據(jù)庫,在選擇的數(shù)據(jù)庫中分別更新一條數(shù)據(jù)記錄,如果更新成功,則可以認(rèn)為該數(shù)據(jù)庫當(dāng)前可用,并將該數(shù)據(jù)庫加入一張可用數(shù)據(jù)庫列表中,并可以對(duì)該列表定時(shí)維護(hù)。
在本申請(qǐng)實(shí)施例中,對(duì)于步驟s203,所述在確定的所述集合中,選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,具體可以包括:在確定的所述集合中,隨機(jī)選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息。此處,隨機(jī)選擇的優(yōu)點(diǎn)的是:邏輯簡單,且在待蓄洪消息數(shù)量較多時(shí),有利于使各可用數(shù)據(jù)庫的負(fù)載逐漸趨向均衡。
當(dāng)然,前面也有提到,也可以采用隨機(jī)以外的其他策略選擇數(shù)據(jù)庫,比如,可以輪流向集合中的各數(shù)據(jù)庫中存儲(chǔ)待蓄洪消息,等等。
在本申請(qǐng)實(shí)施例中,根據(jù)前面的說明可知,雖然在消息蓄洪前通過對(duì)數(shù)據(jù)庫進(jìn)行可用性檢測確定了集合,但是,這種可用性檢測通常都是預(yù)先執(zhí)行的,其結(jié)果的時(shí)效性未必符合實(shí)際需求。也即,雖然在剛得到集合時(shí),集合中的數(shù)據(jù)庫是可用的,但在執(zhí)行步驟s203時(shí),集合中的數(shù)據(jù)庫未必仍然可用的,這種情況的發(fā)生概率往往還會(huì)隨這兩個(gè)時(shí)間點(diǎn)間隔變遠(yuǎn)而增大。
針對(duì)這種情況,本申請(qǐng)的方案也提供了相應(yīng)的應(yīng)對(duì)措施。比如,對(duì)于步驟s203,在選擇至少一個(gè)數(shù)據(jù)庫后,存儲(chǔ)所述待蓄洪消息前,還可以執(zhí)行:再次檢測所選擇的數(shù)據(jù)庫是否可用;若不可用,將其從所述集合中剔除,并在剔除后的所述集合中重新選擇數(shù)據(jù)庫;從而可以進(jìn)一步地保證后續(xù)所選擇數(shù)據(jù)庫的可用性。為了防止混淆,將這次檢測稱為第二次可用性檢測,而將步驟s202中所述的可用性檢測稱為第一次可用性檢測。
第一次可用性檢測與第二次可用性檢測采用的具體實(shí)施方式可以相同,也可以不同。在實(shí)際應(yīng)用中,第一次可用性檢測通常是預(yù)先執(zhí)行的,而第二次可用性檢測是在執(zhí)行步驟s203時(shí)實(shí)時(shí)執(zhí)行的,因此,在執(zhí)行效率和速度方面,對(duì)第二次可用性檢測的要求相對(duì)更高,則第二次可用性檢測相比于第一次可用性檢測往往可以簡單一些,以便于更高效更快速地執(zhí)行。比如,若第一次可用檢測需要對(duì)數(shù)據(jù)庫中的多張表分別進(jìn)行至少一次查詢操作,則第二次可用檢測可以只對(duì)數(shù)據(jù)庫中的任一張表進(jìn)行一次查詢操作。
另外,若在步驟s203中選擇了多個(gè)數(shù)據(jù)庫,且通過第二次可用檢測,檢測出這多個(gè)數(shù)據(jù)庫只有部分?jǐn)?shù)據(jù)庫不可用,并非全不可用,則也可以不重新選擇數(shù)據(jù)庫,而是在所選擇的可用的數(shù)據(jù)庫中存儲(chǔ)待蓄洪消息。
在本申請(qǐng)實(shí)施例中,本申請(qǐng)的方案還提供了一種實(shí)際場景下,進(jìn)行消息蓄洪的一些技術(shù)細(xì)節(jié),這些技術(shù)細(xì)節(jié)有利于提高消息蓄洪庫的可用性。下面進(jìn)行說明。
在該實(shí)際應(yīng)用場景下,上述的數(shù)據(jù)庫為邏輯庫,每個(gè)邏輯庫由至少一主一備兩個(gè)物理庫支持。
為了便于理解,對(duì)“邏輯庫”、“物理庫”這兩個(gè)概念進(jìn)行解釋。以計(jì)算機(jī)系統(tǒng)作為類比,“邏輯庫”可類比于計(jì)算機(jī)系統(tǒng)中的文件系統(tǒng),一般為用戶提供有相應(yīng)的可視界面,“物理庫”可類比于存儲(chǔ)該文件系統(tǒng)的數(shù)據(jù)物理區(qū)域(通常是硬盤上的某個(gè)分區(qū)),“物理庫”為“邏輯庫”提供底層硬件支持。為了保障邏輯庫的可靠性,其對(duì)應(yīng)的主備物理庫一般在不同的機(jī)器上,如此,即使其中一臺(tái)機(jī)器宕機(jī),邏輯庫仍然可能正常工作。
進(jìn)一步地,對(duì)于步驟s203,在選擇了數(shù)據(jù)庫后,所述存儲(chǔ)所述待蓄洪消息,具體可以包括:將所述待蓄洪消息存儲(chǔ)在支持該數(shù)據(jù)庫的主物理庫和備物理庫中。其中,將待蓄洪消息存儲(chǔ)在備物理庫可以由執(zhí)行主體間接導(dǎo)致的,具體地,執(zhí)行主體“將待蓄洪消息存儲(chǔ)在主物理庫”間接導(dǎo)致“主物理庫將待蓄洪消息同步存儲(chǔ)至備物理庫中”。
圖3為本申請(qǐng)實(shí)施例提供的該實(shí)際應(yīng)用場景下,數(shù)據(jù)庫的一種架構(gòu)圖。在圖3中,示出了兩個(gè)數(shù)據(jù)庫(邏輯庫),實(shí)際上也可能有更多的邏輯庫。每個(gè)邏輯庫由一主一備兩個(gè)物理庫支持,主備之間可以相互同步。在本申請(qǐng)實(shí)施例中,應(yīng)用程序具體可以是圖2中流程的執(zhí)行主體。
在本申請(qǐng)實(shí)施例中,為盡量保證數(shù)據(jù)庫的可靠性,當(dāng)確定任一數(shù)據(jù)庫的主物理庫或備物理庫不可用時(shí)(此時(shí),主備功能實(shí)際已經(jīng)失效),可以認(rèn)為該數(shù)據(jù)庫不可用(實(shí)際上該數(shù)據(jù)庫可用,只是可靠性已經(jīng)大打折扣,不如主備功能正常時(shí)的預(yù)期),若該數(shù)據(jù)庫尚在集合中,則可以將其從集合中剔除。以下相關(guān)的實(shí)施例主要基于這樣的前提進(jìn)行說明。
圖4為本申請(qǐng)實(shí)施例提供的對(duì)應(yīng)于圖3的一種可用數(shù)據(jù)庫集合示意圖。在圖4中,集合的具體表現(xiàn)形式是列表,集合中包含了多個(gè)經(jīng)過第一次可用性檢測的數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫分別由一主一備兩個(gè)物理庫支持,圖4中只示出了數(shù)據(jù)庫1的主物理庫和備物理庫,其他幾個(gè)數(shù)據(jù)庫的省略未示出。當(dāng)集合中任一個(gè)物理庫被認(rèn)為不可用時(shí),可以將該物理庫所支持的數(shù)據(jù)庫從集合中剔除。
在上述前提下,自然地,可以當(dāng)待蓄洪消息在該數(shù)據(jù)庫的主物理庫和備物理庫中均存儲(chǔ)成功時(shí),才認(rèn)為待蓄洪消息蓄洪成功。
進(jìn)一步地,當(dāng)所述待蓄洪消息在支持該數(shù)據(jù)庫的主物理庫和備物理庫兩者中的任一物理庫中存儲(chǔ)失敗,且在所述兩者中另一物理庫中存儲(chǔ)成功時(shí)(此時(shí),待蓄洪消息被認(rèn)為在該數(shù)據(jù)庫中蓄洪失敗),還可以執(zhí)行:在所述集合中,選擇另一數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息;根據(jù)在所述另一數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息的結(jié)果,對(duì)所述另一物理庫中存儲(chǔ)成功的所述待蓄洪消息進(jìn)行處理。更具體地,若在所述另一數(shù)據(jù)庫中存儲(chǔ)成功,則可以刪除在所述另一物理庫中存儲(chǔ)成功的待蓄洪消息,以避免后續(xù)重復(fù)消費(fèi)。
在本申請(qǐng)實(shí)施例中,對(duì)于已蓄洪的消息,在消息總線有能力處理時(shí)隨時(shí)有可能處理,也即,已蓄洪的消息后續(xù)將會(huì)被消費(fèi)。所述的“消費(fèi)”可以包括:已蓄洪的消息被從消息蓄洪庫中讀取出來,被發(fā)送給目標(biāo)消息客戶端。
進(jìn)一步地,對(duì)于已消費(fèi)的消息,可以將其從數(shù)據(jù)庫中刪除,也可以將其狀態(tài)標(biāo)記為“已消費(fèi)狀態(tài)”暫不刪除,如此,可以避免重復(fù)消費(fèi)。
在實(shí)際應(yīng)用中,無論在要消費(fèi)時(shí)讀取消息,還是在消費(fèi)后標(biāo)記已消費(fèi)狀態(tài),都有可能執(zhí)行失敗,這些不穩(wěn)定因素帶來了一些麻煩,本申請(qǐng)的方案針對(duì)此也提供了相應(yīng)的應(yīng)對(duì)措施,有利于提高消息蓄洪及后續(xù)消費(fèi)的可靠性,下面具體說明。
在本申請(qǐng)實(shí)施例中,對(duì)于步驟s203,所述完成對(duì)所述待蓄洪消息的蓄洪后,還可以執(zhí)行:在要消費(fèi)已蓄洪的所述待蓄洪消息時(shí),從存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫中讀取所述待蓄洪消息,以用于消費(fèi);若讀取失敗,重試或者讀取其他數(shù)據(jù)庫中其他已蓄洪的消息。
進(jìn)一步地,所述讀取所述待蓄洪消息后(讀取成功后),還可以執(zhí)行:在所述待蓄洪消息被消費(fèi)后,將支持所述數(shù)據(jù)庫的主物理庫和備物理庫中存儲(chǔ)的所述待蓄洪消息的狀態(tài)標(biāo)記為已消費(fèi)狀態(tài);
若確定所述主物理庫和備物理庫均標(biāo)記失敗(可以由于物理庫不可用,或標(biāo)記相關(guān)邏輯執(zhí)行錯(cuò)誤等原因?qū)е?,執(zhí)行用于防止所述待蓄洪消息被重復(fù)消費(fèi)的預(yù)定措施;比如,預(yù)定措施可以是重試標(biāo)記直至成功,或者刪除所述主物理庫和備物理庫中保存的該待蓄洪消息,等等;
若確定所述主物理庫和備物理庫中有一物理庫標(biāo)記失敗,另一物理庫標(biāo)記成功,不執(zhí)行所述預(yù)定措施;需要說明的是,這種情況下不執(zhí)行預(yù)定措施通常是前提的,即:確定所述集合中其他數(shù)據(jù)庫中,不存在尚未被標(biāo)記已消費(fèi)的所述待蓄洪消息。而若確定存在,則可以認(rèn)為該待蓄洪消息已消費(fèi)過,無需重復(fù)消費(fèi),可以將其狀態(tài)標(biāo)記為已消費(fèi)狀態(tài)。
上面對(duì)本申請(qǐng)實(shí)施例提供的消息蓄洪方法進(jìn)行了說明,基于同樣的發(fā)明思路,本申請(qǐng)實(shí)施例還提供了對(duì)應(yīng)的裝置,如圖5所示。
圖5為本申請(qǐng)實(shí)施例提供的對(duì)應(yīng)于圖2的一種消息蓄洪裝置的結(jié)構(gòu)示意圖,虛線表示可選的模塊,所述裝置包括:
獲得模塊501,獲得待蓄洪消息;
確定模塊502,確定可存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫的集合,所述集合是通過是對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到的;
蓄洪模塊503,通過在確定的所述集合中,選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,完成對(duì)所述待蓄洪消息的蓄洪。
可選地,所述裝置還包括:
檢測模塊504,通過對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到所述集合;具體地,所述檢測模塊504按照如下方式,對(duì)多個(gè)數(shù)據(jù)庫進(jìn)行可用性檢測得到所述集合:
定時(shí)對(duì)所述多個(gè)數(shù)據(jù)庫中的每個(gè)數(shù)據(jù)庫執(zhí)行數(shù)據(jù)操作,操作成功時(shí)確定該數(shù)據(jù)庫可用;
獲得包含一個(gè)或多個(gè)被確定可用的數(shù)據(jù)庫的所述集合。
可選地,所述數(shù)據(jù)操作包括數(shù)據(jù)查詢操作。
可選地,所述蓄洪模塊503在確定的所述集合中,選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,具體包括:
所述蓄洪模塊503在確定的所述集合中,隨機(jī)選擇至少一個(gè)數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息。
可選地,所述裝置還包括:
再檢測模塊505,在所述蓄洪模塊503選擇至少一個(gè)數(shù)據(jù)庫后存儲(chǔ)所述待蓄洪消息前,再次檢測所選擇的數(shù)據(jù)庫是否可用;若不可用,將其從所述集合中剔除,并在剔除后的所述集合中重新選擇數(shù)據(jù)庫。
可選地,所述數(shù)據(jù)庫為邏輯庫,每個(gè)所述邏輯庫由至少一主一備兩個(gè)物理庫支持;
所述蓄洪模塊503在選擇了數(shù)據(jù)庫后,所述存儲(chǔ)所述待蓄洪消息,具體包括:
所述蓄洪模塊503將所述待蓄洪消息存儲(chǔ)在支持該數(shù)據(jù)庫的主物理庫和備物理庫中。
可選地,所述確定模塊502確定可存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫的集合后,當(dāng)確定所述集合中的任一數(shù)據(jù)庫的主物理庫或備物理庫不可用時(shí),將該數(shù)據(jù)庫確定為不可用并從所述集合中剔除。
可選地,所述蓄洪模塊503當(dāng)所述待蓄洪消息在支持該數(shù)據(jù)庫的主物理庫和備物理庫兩者中的任一物理庫中存儲(chǔ)失敗,且在所述兩者中的另一物理庫中存儲(chǔ)成功時(shí),在所述集合中,選擇另一數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息,根據(jù)在所述另一數(shù)據(jù)庫存儲(chǔ)所述待蓄洪消息的結(jié)果,對(duì)所述另一物理庫中存儲(chǔ)成功的所述待蓄洪消息進(jìn)行處理。
可選地,所述裝置還包括:
消費(fèi)模塊506,在所述蓄洪模塊503完成對(duì)所述待蓄洪消息的蓄洪后,在要消費(fèi)已蓄洪的所述待蓄洪消息時(shí),從存儲(chǔ)所述待蓄洪消息的數(shù)據(jù)庫中讀取所述待蓄洪消息,以用于消費(fèi);若讀取失敗,重試或者讀取其他數(shù)據(jù)庫中其他已蓄洪的消息。
可選地,所述消費(fèi)模塊506讀取所述待蓄洪消息后,且在所述待蓄洪消息被消費(fèi)后,將支持所述數(shù)據(jù)庫的主物理庫和備物理庫中存儲(chǔ)的所述待蓄洪消息的狀態(tài)標(biāo)記為已消費(fèi)狀態(tài);若確定所述主物理庫和備物理庫均標(biāo)記失敗,執(zhí)行用于防止所述待蓄洪消息被重復(fù)消費(fèi)的預(yù)定措施;若確定所述主物理庫和備物理庫中有一物理庫標(biāo)記失敗,另一數(shù)據(jù)庫標(biāo)記成功,不執(zhí)行所述預(yù)定措施。
可選地,所述消費(fèi)模塊506若確定所述主物理庫和備物理庫中有一物理庫標(biāo)記失敗,另一數(shù)據(jù)庫標(biāo)記成功,在所述不執(zhí)行所述預(yù)定措施前,確定所述集合中其他數(shù)據(jù)庫中,不存在尚未被標(biāo)記已消費(fèi)的所述待蓄洪消息。
本申請(qǐng)實(shí)施例提供的裝置與方法是一一對(duì)應(yīng)的,因此,裝置也具有與其對(duì)應(yīng)的方法類似的有益技術(shù)效果,由于上面已經(jīng)對(duì)方法的有益技術(shù)效果進(jìn)行了詳細(xì)說明,因此,這里不再贅述對(duì)應(yīng)裝置的有益技術(shù)效果。
在20世紀(jì)90年代,對(duì)于一個(gè)技術(shù)的改進(jìn)可以很明顯地區(qū)分是硬件上的改進(jìn)(例如,對(duì)二極管、晶體管、開關(guān)等電路結(jié)構(gòu)的改進(jìn))還是軟件上的改進(jìn)(對(duì)于方法流程的改進(jìn))。然而,隨著技術(shù)的發(fā)展,當(dāng)今的很多方法流程的改進(jìn)已經(jīng)可以視為硬件電路結(jié)構(gòu)的直接改進(jìn)。設(shè)計(jì)人員幾乎都通過將改進(jìn)的方法流程編程到硬件電路中來得到相應(yīng)的硬件電路結(jié)構(gòu)。因此,不能說一個(gè)方法流程的改進(jìn)就不能用硬件實(shí)體模塊來實(shí)現(xiàn)。例如,可編程邏輯器件(programmablelogicdevice,pld)(例如現(xiàn)場可編程門陣列(fieldprogrammablegatearray,fpga))就是這樣一種集成電路,其邏輯功能由用戶對(duì)器件編程來確定。由設(shè)計(jì)人員自行編程來把一個(gè)數(shù)字系統(tǒng)“集成”在一片pld上,而不需要請(qǐng)芯片制造廠商來設(shè)計(jì)和制作專用的集成電路芯片。而且,如今,取代手工地制作集成電路芯片,這種編程也多半改用“邏輯編譯器(logiccompiler)”軟件來實(shí)現(xiàn),它與程序開發(fā)撰寫時(shí)所用的軟件編譯器相類似,而要編譯之前的原始代碼也得用特定的編程語言來撰寫,此稱之為硬件描述語言(hardwaredescriptionlanguage,hdl),而hdl也并非僅有一種,而是有許多種,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)與verilog。本領(lǐng)域技術(shù)人員也應(yīng)該清楚,只需要將方法流程用上述幾種硬件描述語言稍作邏輯編程并編程到集成電路中,就可以很容易得到實(shí)現(xiàn)該邏輯方法流程的硬件電路。
控制器可以按任何適當(dāng)?shù)姆绞綄?shí)現(xiàn),例如,控制器可以采取例如微處理器或處理器以及存儲(chǔ)可由該(微)處理器執(zhí)行的計(jì)算機(jī)可讀程序代碼(例如軟件或固件)的計(jì)算機(jī)可讀介質(zhì)、邏輯門、開關(guān)、專用集成電路(applicationspecificintegratedcircuit,asic)、可編程邏輯控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存儲(chǔ)器控制器還可以被實(shí)現(xiàn)為存儲(chǔ)器的控制邏輯的一部分。本領(lǐng)域技術(shù)人員也知道,除了以純計(jì)算機(jī)可讀程序代碼方式實(shí)現(xiàn)控制器以外,完全可以通過將方法步驟進(jìn)行邏輯編程來使得控制器以邏輯門、開關(guān)、專用集成電路、可編程邏輯控制器和嵌入微控制器等的形式來實(shí)現(xiàn)相同功能。因此這種控制器可以被認(rèn)為是一種硬件部件,而對(duì)其內(nèi)包括的用于實(shí)現(xiàn)各種功能的裝置也可以視為硬件部件內(nèi)的結(jié)構(gòu)?;蛘呱踔?,可以將用于實(shí)現(xiàn)各種功能的裝置視為既可以是實(shí)現(xiàn)方法的軟件模塊又可以是硬件部件內(nèi)的結(jié)構(gòu)。
上述實(shí)施例闡明的系統(tǒng)、裝置、模塊或單元,具體可以由計(jì)算機(jī)芯片或?qū)嶓w實(shí)現(xiàn),或者由具有某種功能的產(chǎn)品來實(shí)現(xiàn)。一種典型的實(shí)現(xiàn)設(shè)備為計(jì)算機(jī)。具體的,計(jì)算機(jī)例如可以為個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)、蜂窩電話、相機(jī)電話、智能電話、個(gè)人數(shù)字助理、媒體播放器、導(dǎo)航設(shè)備、電子郵件設(shè)備、游戲控制臺(tái)、平板計(jì)算機(jī)、可穿戴設(shè)備或者這些設(shè)備中的任何設(shè)備的組合。
為了描述的方便,描述以上裝置時(shí)以功能分為各種單元分別描述。當(dāng)然,在實(shí)施本申請(qǐng)時(shí)可以把各單元的功能在同一個(gè)或多個(gè)軟件和/或硬件中實(shí)現(xiàn)。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)、其他類型的隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、電可擦除可編程只讀存儲(chǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。
還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本申請(qǐng)可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請(qǐng),在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。
本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見即可,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
以上所述僅為本申請(qǐng)的實(shí)施例而已,并不用于限制本申請(qǐng)。對(duì)于本領(lǐng)域技術(shù)人員來說,本申請(qǐng)可以有各種更改和變化。凡在本申請(qǐng)的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)的權(quán)利要求范圍之內(nèi)。