国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      消息隊(duì)列系統(tǒng)以及實(shí)現(xiàn)消息通信的方法與流程

      文檔序號:11582383閱讀:724來源:國知局
      消息隊(duì)列系統(tǒng)以及實(shí)現(xiàn)消息通信的方法與流程

      本申請涉及計(jì)算機(jī)領(lǐng)域,特別是涉及消息隊(duì)列系統(tǒng)以及實(shí)現(xiàn)消息通信的方法。



      背景技術(shù):

      在計(jì)算機(jī)系統(tǒng)中,消息隊(duì)列是實(shí)現(xiàn)不同進(jìn)程間通信或者同一進(jìn)程中的不同線程間通信的一種重要方式。也就是說,不同的進(jìn)程之間或不同的線程之間在消息隊(duì)列中完成消息傳輸。

      在現(xiàn)有的相關(guān)技術(shù)中,已經(jīng)存在多種關(guān)于消息隊(duì)列系統(tǒng)的實(shí)現(xiàn)方案。其中一個(gè)方案為,消息隊(duì)列系統(tǒng)由進(jìn)程(或線程)所在的服務(wù)器上的緩存區(qū)以及本地磁盤構(gòu)成。其中,先將消息生產(chǎn)者推送的消息存儲在該緩存區(qū)中,當(dāng)該緩存區(qū)中的消息個(gè)數(shù)達(dá)到配置值或者消息的發(fā)布時(shí)間超過閾值時(shí),再將該緩存區(qū)中的消息存儲到本地磁盤中,以保證消息的可靠性。并且只有存儲到本地磁盤中的消息才可以被進(jìn)一步傳遞給消息消費(fèi)者。另外,由于本地磁盤的存儲空間有限,存儲在本地磁盤中的消息無論是否被傳遞給消息消費(fèi)者,其在保留一定時(shí)間后就會被刪除,以便釋放本地磁盤的存儲空間。所謂“可靠性”就是指,消息生產(chǎn)者推送到消息隊(duì)列系統(tǒng)中的消息不丟失,即使消息隊(duì)列系統(tǒng)故障也可以被恢復(fù);并且,消息在未被傳遞給消息消費(fèi)者之前可以一直保存在消息隊(duì)列系統(tǒng)中,直到被傳遞給消息消費(fèi)者為止。

      在第一個(gè)方案中,只有位于本地磁盤的消息才可以被傳遞給消息消費(fèi)者,而消息在被存儲到本地磁盤之前,還必須先被存儲在緩存區(qū)中,因此,消息傳輸?shù)膶?shí)時(shí)性會比較差。并且,消息是從本地磁盤傳遞給消息消費(fèi)者的,受到本地磁盤的io操作速度的影響,消息傳輸?shù)膶?shí)時(shí)性就會更差。另外,由于本地磁盤中的消息會被定期刪除,因此消息的可靠性也非常差。

      另一個(gè)方案為:消息隊(duì)列系統(tǒng)由進(jìn)程(或線程)所在的服務(wù)器上的內(nèi)存以及位于該服務(wù)器外部的數(shù)據(jù)庫構(gòu)成。其中,先將消息生產(chǎn)者推送的消息存儲在內(nèi)存中,再將消息從內(nèi)存中傳遞給消息消費(fèi)者。并且,為了保證消息的 可靠性,還將內(nèi)存中的消息存儲到數(shù)據(jù)庫中。顯然,在第二個(gè)方案中,消息直接從內(nèi)存?zhèn)鬟f到消息消費(fèi)者,并且,內(nèi)存的io操作速度比本地磁盤的io操作速度快,因此,相較于第一個(gè)方案,消息傳輸?shù)膶?shí)時(shí)性更好。另外,由于數(shù)據(jù)庫的存儲空間比較大,存儲在數(shù)據(jù)庫中的消息不會被定期刪除,因此,相較于第一個(gè)方案,消息的可靠性也更好。

      但是,在實(shí)現(xiàn)本申請的過程中,本申請的發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中至少存在如下問題:雖然在第二個(gè)方案中,內(nèi)存的io操作速度比較快,使其消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性相較于第一個(gè)方案好。但是,由于內(nèi)存不支持同時(shí)執(zhí)行讀/寫操作,因此,在將消息生產(chǎn)者推送的消息存儲在內(nèi)存中的同時(shí),就不能將消息從內(nèi)存中傳遞給消息消費(fèi)者,這樣會很大程度地影響消息傳輸?shù)膶?shí)時(shí)性。

      另外,在第二個(gè)方案中,如果消息消費(fèi)者無法正常地從消息隊(duì)列系統(tǒng)接收消息或者只能以很慢的速度接收消息,并且消息生產(chǎn)者生產(chǎn)消息的速度又非常快,這樣就會有越來越多的消息占滿內(nèi)存,嚴(yán)重時(shí)會發(fā)生內(nèi)存溢出。當(dāng)發(fā)生內(nèi)存溢出時(shí),溢出的消息會被丟棄掉,以至于溢出的消息無法正常傳遞給消息消費(fèi)者。



      技術(shù)實(shí)現(xiàn)要素:

      為了解決上述技術(shù)問題,本申請實(shí)施例提供了消息隊(duì)列系統(tǒng)、以及實(shí)現(xiàn)消息通信的方法,以解決現(xiàn)有技術(shù)中由于內(nèi)存不支持同時(shí)執(zhí)行讀/寫操作而影響消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性的問題。另外,進(jìn)一步解決現(xiàn)有技術(shù)中由于消息隊(duì)列系統(tǒng)中的內(nèi)存發(fā)生內(nèi)存溢出而導(dǎo)致溢出的消息無法正常地被傳遞給消息消費(fèi)者的問題。

      本申請實(shí)施例公開了如下技術(shù)方案:

      一種消息隊(duì)列系統(tǒng),包括:第一緩沖區(qū)、第二緩沖區(qū)以及持久化存儲區(qū);其中,所述第一緩沖區(qū)和第二緩沖區(qū)位于消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中,所述第二緩沖區(qū)包括主緩沖區(qū)和備緩沖區(qū);

      所述第一緩沖區(qū),用于緩存消息生產(chǎn)者推送的消息,將消息生產(chǎn)者推送的消息存儲到所述持久化存儲區(qū)中,并將已存儲到所述持久化存儲區(qū)的消息發(fā)送給所述第二緩沖區(qū);

      所述持久化存儲區(qū),用于通過持久化存儲介質(zhì)對所述第一緩沖區(qū)發(fā)送的消息進(jìn)行持久化存儲;

      所述備緩沖區(qū),用于緩存所述第一緩沖區(qū)發(fā)送的消息;

      所述主緩沖區(qū),用于將位于所述主緩沖區(qū)的消息傳遞給消息消費(fèi)者,在將位于所述主緩沖區(qū)的消息全部傳遞給消息消費(fèi)者之后,與所述備緩沖區(qū)進(jìn)行主備切換。

      優(yōu)選的,所述備緩沖區(qū)還用于,在緩存所述第一緩沖區(qū)發(fā)送的消息之前,檢查自身是否存在內(nèi)存溢出,如果存在內(nèi)存溢出,丟棄所述第一緩沖區(qū)發(fā)送的消息,并將自身的當(dāng)前狀態(tài)標(biāo)記為非正常狀態(tài),如果不存在內(nèi)存溢出,繼續(xù)緩存所述第一緩沖區(qū)發(fā)送的消息;

      所述主緩沖區(qū)還用于,在與所述備緩沖區(qū)進(jìn)行主備切換之前,檢查所述備緩沖區(qū)的當(dāng)前狀態(tài)是否為正常狀態(tài),如果為非正常狀態(tài),不與所述備緩沖區(qū)進(jìn)行主備切換,而從所述持久化存儲區(qū)中讀取消息,并將讀取的消息傳遞給消息消費(fèi)者,如果為正常狀態(tài),繼續(xù)與所述備緩沖區(qū)進(jìn)行主備切換。

      優(yōu)選的,所述主緩沖區(qū)還用于,在從所述持久化存儲區(qū)中讀取消息之后,判斷在所述備緩沖區(qū)中是否存在下一個(gè)讀取的消息,如果存在,將所述備緩沖區(qū)的當(dāng)前狀態(tài)標(biāo)記為正常狀態(tài),如果不存在,維持所述備緩沖區(qū)的當(dāng)前狀態(tài)。

      優(yōu)選的,所述持久化存儲區(qū)位于所述服務(wù)器外部的分布式文件系統(tǒng)中。

      優(yōu)選的,所述主緩沖區(qū)和備緩沖區(qū)為同構(gòu)的緩沖區(qū)。

      優(yōu)選的,所述消息生產(chǎn)者和消息消費(fèi)者為運(yùn)行在所述服務(wù)器上的兩個(gè)進(jìn)程或者為運(yùn)行在所述服務(wù)器上的一個(gè)進(jìn)程中的兩個(gè)線程。

      一種實(shí)現(xiàn)消息通信的方法,預(yù)先在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中建立第一緩沖區(qū)和第二緩沖區(qū),所述第二緩沖區(qū)包括主緩沖區(qū)和備緩沖區(qū),所述方法包括:

      第一緩沖區(qū)緩存消息生產(chǎn)者推送的消息,將消息生產(chǎn)者推送的消息存儲到持久化存儲區(qū)中,以便將所述消息持久化地存儲在所述持久化存儲區(qū)中;

      第一緩沖區(qū)將已存儲到所述持久化存儲區(qū)的消息發(fā)送給第二緩沖區(qū);

      備緩沖區(qū)緩存第一緩沖區(qū)發(fā)送的消息;

      主緩沖區(qū)將位于主緩沖區(qū)的消息傳遞給消息消費(fèi)者,在將位于所述主緩沖區(qū)的消息全部傳遞給消息消費(fèi)者之后,與備緩沖區(qū)進(jìn)行主備切換。

      優(yōu)選的,所述方法還包括:

      在緩存第一緩沖區(qū)發(fā)送的消息之前,備緩沖區(qū)檢查自身是否存在內(nèi)存溢出,如果存在內(nèi)存溢出,丟棄所述第一緩沖區(qū)發(fā)送的消息,并將自身的當(dāng)前狀態(tài)標(biāo)記為非正常狀態(tài);

      在與備緩沖區(qū)進(jìn)行主備切換之前,主緩沖區(qū)檢查備緩沖區(qū)的當(dāng)前狀態(tài)是否為正常狀態(tài),如果為非正常狀態(tài),不與備緩沖區(qū)進(jìn)行主備切換,而從持久化存儲區(qū)中讀取消息,以便將讀取的消息傳遞給消息消費(fèi)者;

      則所述備緩沖區(qū)緩存第一緩沖區(qū)發(fā)送的消息為:

      如果不存在內(nèi)存溢出,備緩沖區(qū)緩存第一緩沖區(qū)發(fā)送的消息;

      則所述主緩沖區(qū)與備緩沖區(qū)進(jìn)行主備切換為:

      如果為正常狀態(tài),主緩沖區(qū)與備緩沖區(qū)進(jìn)行主備切換。

      優(yōu)選的,所述方法還包括:

      在從持久化存儲區(qū)中讀取消息之后,主緩沖區(qū)判斷在備緩沖區(qū)中是否存在下一個(gè)讀取的消息,如果存在,將所述備緩沖區(qū)的當(dāng)前狀態(tài)標(biāo)記為正常狀態(tài),如果不存在,維持所述備緩沖區(qū)的當(dāng)前狀態(tài)。

      優(yōu)選的,所述持久化存儲區(qū)位于所述服務(wù)器外部的分布式文件系統(tǒng)中。

      優(yōu)選的,所述主緩沖區(qū)和備緩沖區(qū)為同構(gòu)的緩沖區(qū)。

      優(yōu)選的,所述消息生產(chǎn)者和消息消費(fèi)者為運(yùn)行在所述服務(wù)器上的兩個(gè)進(jìn)程或者為運(yùn)行在所述服務(wù)器上的一個(gè)進(jìn)程中的兩個(gè)線程。

      由上述實(shí)施例可以看出,與現(xiàn)有技術(shù)相比,本申請的優(yōu)點(diǎn)在于:

      在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中設(shè)置用于緩存消息的緩沖區(qū),在正常情況下,通過內(nèi)存訪問完成消息傳輸,保證了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。并且,通過主、備緩沖區(qū)的雙結(jié)構(gòu)設(shè)計(jì),可以實(shí)現(xiàn)在將消息生產(chǎn)者推送的消息存儲在備緩沖區(qū)的同時(shí),將消息從主緩沖區(qū)中傳遞給消息消費(fèi)者,更進(jìn)一步提高了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。另外,還將消息生產(chǎn)者推送的消息存儲在持久化存儲區(qū)中,保證了消息的可靠性。

      此外,當(dāng)消息隊(duì)列系統(tǒng)中的備緩沖區(qū)出現(xiàn)內(nèi)存溢出問題時(shí),即,在非正常情況下,也可以從持久化存儲區(qū)中取回內(nèi)存中丟失的消息,避免了由于消息隊(duì)列系統(tǒng)中的內(nèi)存發(fā)生內(nèi)存溢出而導(dǎo)致溢出的消息無法正常地被傳遞給消息消費(fèi)者的問題。

      附圖說明

      為了更清楚地說明本申請實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

      圖1示意性地示出了本發(fā)明的實(shí)施方式可以在其中實(shí)施的示例性應(yīng)用場景;

      圖2示意性地示出了根據(jù)本申請實(shí)施例的一種消息隊(duì)列系統(tǒng)的結(jié)構(gòu)示意圖;

      圖3示意性地示出了根據(jù)本申請實(shí)施例的另一種消息隊(duì)列系統(tǒng)的結(jié)構(gòu)示意圖;

      圖4示意性地示出了根據(jù)本申請實(shí)施例的另一種消息隊(duì)列系統(tǒng)的結(jié)構(gòu)示意圖;

      圖5示意地示出了根據(jù)本申請實(shí)施例的主緩沖區(qū)讀取消息的工作示意圖;

      圖6示意性地示出了根據(jù)本申請實(shí)施例的一種實(shí)現(xiàn)消息通信的方法的流程圖;

      圖7示意性地示出了根據(jù)本申請實(shí)施例的另一種實(shí)現(xiàn)消息通信的方法的流程圖;

      圖8示意性地示出了根據(jù)本申請實(shí)施例的另一種實(shí)現(xiàn)消息通信的方法的流程圖。

      具體實(shí)施方式

      參閱圖1所示,圖1示意性地示出了本發(fā)明的實(shí)施方式可以在其中實(shí)施的示例性應(yīng)用場景。其中,服務(wù)器上存在一個(gè)消息生產(chǎn)者10和一個(gè)消息消費(fèi)者20,當(dāng)消息生產(chǎn)者10與消息消費(fèi)者20之間進(jìn)行通信時(shí),消息生產(chǎn)者10將 消息21推送到消息隊(duì)列系統(tǒng)30中,消息隊(duì)列系統(tǒng)30負(fù)責(zé)將消息21傳遞給消息消費(fèi)者20。另外,為了保證消息21的可靠性,消息隊(duì)列系統(tǒng)30還需要將消息生產(chǎn)者10推送的消息21存儲到持久化存儲介質(zhì)中,如,服務(wù)器上的本地磁盤。其中,“傳遞”可以表現(xiàn)為“推(push)”和“拉(pull)”兩種模式,“推”模式是由消息隊(duì)列系統(tǒng)30主動將消息21推送給消息消費(fèi)者20,“拉”模式是消息消費(fèi)者20主動通過輪詢的方式從消息隊(duì)列系統(tǒng)30中拉取消息21。消息生產(chǎn)者10和消息消費(fèi)者20可以為服務(wù)器上的兩個(gè)進(jìn)程,也可以為服務(wù)器上同一個(gè)進(jìn)程中的兩個(gè)線程。本領(lǐng)域技術(shù)人員可以理解,圖1所示的示意圖僅是本發(fā)明的實(shí)施方式可以在其中得以實(shí)現(xiàn)的一個(gè)示例。本發(fā)明實(shí)施方式的應(yīng)用范圍不受到該框架任何方面的限制。例如,服務(wù)器上存在多個(gè)消息生產(chǎn)者和多個(gè)消息消費(fèi)者,而不是如圖1所示的僅存在一個(gè)消息生產(chǎn)者和一個(gè)消息消費(fèi)者。

      為使本申請的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖對本申請實(shí)施例進(jìn)行詳細(xì)描述。

      裝置實(shí)施例

      本申請實(shí)施例還提供了一種消息隊(duì)列系統(tǒng)。請參閱圖2,圖2示意性地示出了根據(jù)本申請實(shí)施例的一種消息隊(duì)列系統(tǒng)的結(jié)構(gòu)示意圖。其中,該消息隊(duì)列系統(tǒng)20包括:第一緩沖區(qū)21、第二緩沖區(qū)22以及持久化存儲區(qū)23,第一緩沖區(qū)21和第二緩沖區(qū)22位于消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中,第二緩沖區(qū)22包括主緩沖區(qū)221和備緩沖區(qū)222。下面結(jié)合該裝置的工作原理進(jìn)一步介紹其內(nèi)部結(jié)構(gòu)以及連接關(guān)系。

      第一緩沖區(qū)21,用于緩存消息生產(chǎn)者推送的消息,將消息生產(chǎn)者推送的消息存儲在持久化存儲區(qū)23中,并將已存儲到持久化存儲區(qū)23的消息發(fā)送給第二緩沖區(qū)22。

      其中,在消息生產(chǎn)者生產(chǎn)的消息到達(dá)第一緩沖區(qū)21之后,會被首先持久化地存儲到持久化存儲區(qū)23中,以保證該消息的可靠性。如果存儲失敗,持久化存儲區(qū)23告知第一緩沖區(qū)21消息存儲失敗,以便第一緩沖區(qū)21重新將 消息持久化存儲到持久化存儲區(qū)23中直到存儲成功為止,如果存儲成功,持久化存儲區(qū)23告知第一緩沖區(qū)21消息存儲成功。

      持久化存儲區(qū)23,用于通過持久化存儲介質(zhì)對第一緩沖區(qū)21發(fā)送的消息進(jìn)行持久化存儲。

      在本申請的一個(gè)可選實(shí)施方式中,持久化存儲區(qū)23位于消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器內(nèi)部的磁盤中,如圖2所示,也可以位于該服務(wù)器外部的數(shù)據(jù)庫中。

      在本申請的另一個(gè)可選實(shí)施方式中,持久化存儲區(qū)23位于該服務(wù)器外部的分布式文件系統(tǒng)中,如圖3所示。將持久化存儲區(qū)23布置在分布式文件系統(tǒng)中,可以很可靠地實(shí)現(xiàn)對海量消息的持久化存儲的需求。另外,在分布式文件系統(tǒng)中,通過logfile追加方式記錄消息,也能夠避免因?yàn)榈谝痪彌_區(qū)21遠(yuǎn)程操作分布式文件系統(tǒng)而帶來的延遲問題。

      備緩沖區(qū)222,用于緩存第一緩沖區(qū)21發(fā)送的消息。

      主緩沖區(qū)221,用于將位于主緩沖區(qū)221的消息傳遞給消息消費(fèi)者,在將位于主緩沖區(qū)221的消息全部傳遞給消息消費(fèi)者之后,與備緩沖區(qū)222進(jìn)行主備切換。

      也就是說,備緩沖區(qū)222專用于緩存第一緩沖區(qū)發(fā)送的消息,而主緩沖區(qū)221專用于將位于自身的消息傳遞給消息消費(fèi)者。一旦主緩沖區(qū)221將自身的消息全部傳遞出去之后,就與備緩沖區(qū)互換身份,轉(zhuǎn)換主備關(guān)系,即,原來的主緩沖區(qū)成為備緩沖區(qū),開始緩存來自第一緩沖區(qū)21的消息,而原來的備緩沖區(qū)成為主緩沖區(qū),將其緩存的消息傳遞給消息消費(fèi)者。在以上的正常場景下,整個(gè)消息隊(duì)列系統(tǒng)不需要讀取在持久化存儲區(qū)23中備份的消息,所有的邏輯在三個(gè)緩沖區(qū)(即,第一緩沖區(qū)21、主緩沖區(qū)221和備緩沖區(qū)222)中完成。

      可以理解的,當(dāng)在服務(wù)器的內(nèi)存中設(shè)置用于緩存消息的緩沖區(qū)時(shí),通過主、備緩沖區(qū)的雙結(jié)構(gòu)設(shè)計(jì),可以實(shí)現(xiàn)在將消息生產(chǎn)者推送的消息存儲在備緩沖區(qū)的同時(shí),將消息從主緩沖區(qū)中傳遞給消息消費(fèi)者,更好地保證了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。

      在本申請的一個(gè)可選實(shí)施方式中,主緩沖區(qū)221和備緩沖區(qū)222可以為 同構(gòu)的緩沖區(qū),即,兩個(gè)緩沖區(qū)的存儲介質(zhì)以及存儲空間大小都相同。

      考慮到消息消費(fèi)者有時(shí)可能無法正常從消息隊(duì)列系統(tǒng)中接收消息,或者只能以很慢的速度接收消息,并且消息生產(chǎn)者生產(chǎn)消息的速度又非??欤谶@種情況下,主緩沖區(qū)221傳遞消息的進(jìn)度與備緩沖區(qū)222緩存消息的進(jìn)度會出現(xiàn)不匹配,前者快于后者,因此,在主緩沖區(qū)221將自身的消息全部傳遞出去之前,備緩沖區(qū)222就會因?yàn)榈谝痪彌_區(qū)21轉(zhuǎn)發(fā)過多的消息而發(fā)生內(nèi)存溢出,當(dāng)發(fā)生內(nèi)存溢出時(shí),備緩沖區(qū)222就會主動丟棄掉溢出的消息,而導(dǎo)致溢出的消息無法正常被傳遞給消息消費(fèi)者。因此,為了解決由于備緩沖區(qū)222發(fā)生內(nèi)存溢出而導(dǎo)致溢出的消息無法正常地被傳遞給消息消費(fèi)者的問題,在本申請的另一個(gè)可選實(shí)施方式中,如圖4所示,

      備緩沖區(qū)222還用于,在緩存第一緩沖區(qū)21發(fā)送的消息之前,檢查自身是否存在內(nèi)存溢出,如果存在內(nèi)存溢出,丟棄第一緩沖區(qū)21發(fā)送的消息,并將自身的當(dāng)前狀態(tài)標(biāo)記為非正常狀態(tài),如果不存在內(nèi)存溢出,繼續(xù)緩存第一緩沖區(qū)21發(fā)送的消息。

      主緩沖區(qū)221還用于,在與備緩沖區(qū)222進(jìn)行主備切換之前,檢查備緩沖區(qū)222的當(dāng)前狀態(tài)是否為正常狀態(tài),如果為非正常狀態(tài),不與備緩沖區(qū)222進(jìn)行主備切換,而是從持久化存儲區(qū)23中讀取消息,并將讀取的消息傳遞給消息消費(fèi)者,如果為正常狀態(tài),繼續(xù)與備緩沖區(qū)進(jìn)行主備切換。

      也就是說,當(dāng)備緩沖區(qū)222發(fā)生內(nèi)存溢出時(shí),其被標(biāo)記為非正常狀態(tài),表明當(dāng)前的備緩沖區(qū)222所緩存的消息不完整,由于某些原因備緩沖區(qū)222已經(jīng)丟棄了部分消息。因此,在這種非正常場景下,主緩沖區(qū)221不與備緩沖區(qū)222進(jìn)行主備切換,而是直接訪問持久化存儲區(qū)23(如,底層的分布式文件系統(tǒng)),將持久化存儲區(qū)23中保存的消息讀取出來后繼續(xù)傳遞給消息消費(fèi)者。其中,主緩沖區(qū)221可以根據(jù)自己的存儲空間大小從持久化存儲區(qū)23中讀取相應(yīng)數(shù)量的消息,然后將讀取的消息逐個(gè)地傳遞給消息消費(fèi)者。

      這種方式可以一直持續(xù)到主緩沖區(qū)221發(fā)現(xiàn)自己傳遞消息的進(jìn)度可以與備緩沖區(qū)222緩存消息的進(jìn)度匹配,此時(shí)主緩沖區(qū)221則不再需要從持久化存儲區(qū)23中讀取消息,而是回到正常場景下,通過主備切換方式傳遞消息。因此,在本申請的另一個(gè)可選實(shí)施方式中:

      主緩沖區(qū)221還用于,在從持久化存儲區(qū)23中讀取消息之后,判斷在備緩沖區(qū)222中是否存在下一個(gè)讀取的消息,如果存在,說明主緩沖區(qū)221傳遞消息的進(jìn)度可以與備緩沖區(qū)222緩存消息的進(jìn)度匹配,主緩沖區(qū)221將備緩沖區(qū)222的當(dāng)前狀態(tài)標(biāo)記為正常狀態(tài),如果不存在,維持備緩沖區(qū)222的當(dāng)前狀態(tài)。

      例如,如圖5所示,備緩沖區(qū)222緩存了標(biāo)識為30-50的消息,而標(biāo)識為1-29的消息由于內(nèi)存溢出而被備緩沖區(qū)222丟棄掉了,主緩沖區(qū)221先從底層的分布式文件系統(tǒng)中讀取消息,假設(shè)主緩沖區(qū)221一次性只能緩存20個(gè)消息,主緩沖區(qū)221從分布式文件系統(tǒng)中讀取出標(biāo)識為1-20的消息,并逐個(gè)地傳遞給消息消費(fèi)者。在讀取完之后,主緩沖區(qū)221判斷其下一個(gè)讀取的消息(即標(biāo)識為21的消息)是否在備緩沖區(qū)222中,經(jīng)過判斷發(fā)現(xiàn),其下一個(gè)讀取的標(biāo)識為21的消息不在備緩沖區(qū)222中,主緩沖區(qū)221繼續(xù)維持備緩沖區(qū)222的當(dāng)前狀態(tài)標(biāo)記,即,非正常狀態(tài)。當(dāng)主緩沖區(qū)221將自身的消息全部傳遞出去后,即刻檢查備緩沖區(qū)222的當(dāng)前狀態(tài),由于檢查出的備緩沖區(qū)222的當(dāng)前狀態(tài)仍然為非正常狀態(tài),因此繼續(xù)從底層的分布式文件系統(tǒng)中讀取消息,即讀取標(biāo)識為21-40的消息,并逐個(gè)地傳遞給消息消費(fèi)者。在讀取完之后,主緩沖區(qū)221繼續(xù)判斷其下一個(gè)讀取的消息(即標(biāo)識為41的消息)是否在備緩沖區(qū)222中,經(jīng)過判斷發(fā)現(xiàn),其下一個(gè)讀取的標(biāo)識為41的消息在備緩沖區(qū)222中,主緩沖區(qū)221將備緩沖區(qū)222的當(dāng)前狀態(tài)標(biāo)記為正常狀態(tài)。當(dāng)主緩沖區(qū)221將自身的消息再一次全部傳遞出去后,由于檢查出的備緩沖區(qū)222的當(dāng)前狀態(tài)為正常狀態(tài),因此可以正常地與備緩沖區(qū)222進(jìn)行主備切換。

      在本申請的一個(gè)可選實(shí)施方式中,消息生產(chǎn)者和消息消費(fèi)者為運(yùn)行在服務(wù)器上的兩個(gè)進(jìn)程或者為運(yùn)行在服務(wù)器上的一個(gè)進(jìn)程中的兩個(gè)線程。

      由上述實(shí)施例可以看出,與現(xiàn)有技術(shù)相比,本申請的優(yōu)點(diǎn)在于:

      在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中設(shè)置用于緩存消息的緩沖區(qū),在正常情況下,通過內(nèi)存訪問完成消息傳輸,保證了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。并且,通過主、備緩沖區(qū)的雙結(jié)構(gòu)設(shè)計(jì),可以實(shí)現(xiàn)在將消息生產(chǎn)者推送的消息存儲在備緩沖區(qū)的同時(shí),將消息從主緩沖區(qū)中傳遞給消息消費(fèi)者,更進(jìn)一步提高了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。另 外,還將消息生產(chǎn)者推送的消息存儲在持久化存儲區(qū)中,保證了消息的可靠性。

      此外,當(dāng)消息隊(duì)列系統(tǒng)中的備緩沖區(qū)出現(xiàn)內(nèi)存溢出問題時(shí),即,在非正常情況下,也可以從持久化存儲區(qū)中取回內(nèi)存中丟失的消息,避免了由于消息隊(duì)列系統(tǒng)中的內(nèi)存發(fā)生內(nèi)存溢出而導(dǎo)致溢出的消息無法正常地被傳遞給消息消費(fèi)者的問題。

      方法實(shí)施例

      請參閱圖6,圖6示意性地示出了根據(jù)本申請實(shí)施例的一種實(shí)現(xiàn)消息通信的方法的流程圖,例如,該方法可以由消息隊(duì)列系統(tǒng)20執(zhí)行,該方法例如可以包括以下步驟:

      步驟600:預(yù)先在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中建立第一緩沖區(qū)和第二緩沖區(qū),所述第二緩沖區(qū)包括主緩沖區(qū)和備緩沖區(qū)。

      步驟601:第一緩沖區(qū)緩存消息生產(chǎn)者推送的消息,將消息生產(chǎn)者推送的消息存儲到持久化存儲區(qū)中,以便將所述消息持久化地存儲在所述持久化存儲區(qū)中。

      步驟602:第一緩沖區(qū)將已存儲到所述持久化存儲區(qū)的消息發(fā)送給第二緩沖區(qū)。

      步驟603:備緩沖區(qū)緩存第一緩沖區(qū)發(fā)送的消息。

      步驟604:主緩沖區(qū)將位于主緩沖區(qū)的消息傳遞給消息消費(fèi)者。

      步驟605:主緩沖區(qū)在將位于所述主緩沖區(qū)的消息全部傳遞給消息消費(fèi)者之后,與備緩沖區(qū)進(jìn)行主備切換。

      如圖7所示,在本申請的一個(gè)可選實(shí)施方式中,該方法例如可以包括以下步驟:

      步驟600:預(yù)先在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中建立第一緩沖區(qū)和第二緩沖區(qū),所述第二緩沖區(qū)包括主緩沖區(qū)和備緩沖區(qū)。

      步驟601:第一緩沖區(qū)緩存消息生產(chǎn)者推送的消息,將消息生產(chǎn)者推送的消息存儲到持久化存儲區(qū)中,以便將所述消息持久化地存儲在所述持久化存儲區(qū)中。

      步驟602:第一緩沖區(qū)將已存儲到所述持久化存儲區(qū)的消息發(fā)送給第二緩沖區(qū)。

      步驟603a:備緩沖區(qū)檢查自身是否存在內(nèi)存溢出,如果存在內(nèi)存溢出,進(jìn)入步驟606,如果不存在內(nèi)存溢出,進(jìn)入步驟603。

      步驟603:備緩沖區(qū)緩存第一緩沖區(qū)發(fā)送的消息。

      步驟604:主緩沖區(qū)將位于主緩沖區(qū)的消息傳遞給消息消費(fèi)者。

      步驟605a:在將位于所述主緩沖區(qū)的消息全部傳遞給消息消費(fèi)者之后,主緩沖區(qū)檢查備緩沖區(qū)的當(dāng)前狀態(tài)是否為正常狀態(tài),如果為非正常狀態(tài),進(jìn)入步驟607,如果為正常狀態(tài),進(jìn)入步驟605。

      步驟605:主緩沖區(qū)與備緩沖區(qū)進(jìn)行主備切換,結(jié)束流程。

      步驟606:備緩沖區(qū)丟棄所述第一緩沖區(qū)發(fā)送的消息,并將自身的當(dāng)前狀態(tài)標(biāo)記為非正常狀態(tài),結(jié)束流程。

      步驟607:主緩沖區(qū)不與備緩沖區(qū)進(jìn)行主備切換,而從持久化存儲區(qū)中讀取消息,以便將讀取的消息傳遞給消息消費(fèi)者,結(jié)束流程。

      如圖8所示,在本申請的另一個(gè)可選實(shí)施方式中,該方法例如可以包括以下步驟:

      步驟600:預(yù)先在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中建立第一緩沖區(qū)和第二緩沖區(qū),所述第二緩沖區(qū)包括主緩沖區(qū)和備緩沖區(qū)。

      步驟601:第一緩沖區(qū)緩存消息生產(chǎn)者推送的消息,將消息生產(chǎn)者推送的消息存儲到持久化存儲區(qū)中,以便將所述消息持久化地存儲在所述持久化存儲區(qū)中。

      步驟602:第一緩沖區(qū)將已存儲到所述持久化存儲區(qū)的消息發(fā)送給第二緩沖區(qū)。

      步驟603a:備緩沖區(qū)檢查自身是否存在內(nèi)存溢出,如果存在內(nèi)存溢出,進(jìn)入步驟606,如果不存在內(nèi)存溢出,進(jìn)入步驟603。

      步驟603:備緩沖區(qū)緩存第一緩沖區(qū)發(fā)送的消息。

      步驟604:主緩沖區(qū)將位于主緩沖區(qū)的消息傳遞給消息消費(fèi)者。

      步驟605a:在將位于所述主緩沖區(qū)的消息全部傳遞給消息消費(fèi)者之后,主緩沖區(qū)檢查備緩沖區(qū)的當(dāng)前狀態(tài)是否為正常狀態(tài),如果為非正常狀態(tài),進(jìn) 入步驟607,如果為正常狀態(tài),進(jìn)入步驟605。

      步驟605:主緩沖區(qū)與備緩沖區(qū)進(jìn)行主備切換,結(jié)束流程。

      步驟606:備緩沖區(qū)丟棄所述第一緩沖區(qū)發(fā)送的消息,并將自身的當(dāng)前狀態(tài)標(biāo)記為非正常狀態(tài),結(jié)束流程。

      步驟607:主緩沖區(qū)不與備緩沖區(qū)進(jìn)行主備切換,而從持久化存儲區(qū)中讀取消息,以便將讀取的消息傳遞給消息消費(fèi)者。

      步驟608:主緩沖區(qū)判斷在備緩沖區(qū)中是否存在下一個(gè)讀取的消息,如果存在,進(jìn)入步驟609,如果不存在,進(jìn)入步驟610。

      步驟609:將所述備緩沖區(qū)的當(dāng)前狀態(tài)標(biāo)記為正常狀態(tài),結(jié)束流程。

      步驟610:維持所述備緩沖區(qū)的當(dāng)前狀態(tài),結(jié)束流程。

      在本申請的另一個(gè)可選實(shí)施方式中,所述持久化存儲區(qū)位于所述服務(wù)器外部的分布式文件系統(tǒng)中。

      在本申請的另一個(gè)可選實(shí)施方式中,所述主緩沖區(qū)和備緩沖區(qū)為同構(gòu)的緩沖區(qū)。

      在本申請的另一個(gè)可選實(shí)施方式中,所述消息生產(chǎn)者和消息消費(fèi)者為運(yùn)行在所述服務(wù)器上的兩個(gè)進(jìn)程或者為運(yùn)行在所述服務(wù)器上的一個(gè)進(jìn)程中的兩個(gè)線程。

      由上述實(shí)施例可以看出,與現(xiàn)有技術(shù)相比,本申請的優(yōu)點(diǎn)在于:

      在消息生產(chǎn)者和消息消費(fèi)者所在的服務(wù)器的內(nèi)存中設(shè)置用于緩存消息的緩沖區(qū),在正常情況下,通過內(nèi)存訪問完成消息傳輸,保證了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。并且,通過主、備緩沖區(qū)的雙結(jié)構(gòu)設(shè)計(jì),可以實(shí)現(xiàn)在將消息生產(chǎn)者推送的消息存儲在備緩沖區(qū)的同時(shí),將消息從主緩沖區(qū)中傳遞給消息消費(fèi)者,更進(jìn)一步提高了消息在消息隊(duì)列系統(tǒng)中傳輸?shù)膶?shí)時(shí)性。另外,還將消息生產(chǎn)者推送的消息存儲在持久化存儲區(qū)中,保證了消息的可靠性。

      此外,當(dāng)消息隊(duì)列系統(tǒng)中的備緩沖區(qū)出現(xiàn)內(nèi)存溢出問題時(shí),即,在非正常情況下,也可以從持久化存儲區(qū)中取回內(nèi)存中丟失的消息,避免了由于消息隊(duì)列系統(tǒng)中的內(nèi)存發(fā)生內(nèi)存溢出而導(dǎo)致溢出的消息無法正常地被傳遞給消息消費(fèi)者的問題。

      所述領(lǐng)域的技術(shù)人員可以清楚地了解到,為了描述的方便和簡潔,上述描述的系統(tǒng)、裝置和單元的具體工作過程,可以參考前述方法實(shí)施例中的對應(yīng)過程,在此不再贅述。

      在本申請所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng)、裝置和方法,可以通過其它的方式實(shí)現(xiàn)。例如,以上所描述到的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性、機(jī)械或其它的形式。

      所述作為分離部件說明的單元可以是或者也可以是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。

      另外,在本申請各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),可以采用軟件功能單元的形式實(shí)現(xiàn)。

      需要說明的是,本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過計(jì)算機(jī)程序來指令相關(guān)的硬件來完成,所述的程序可存儲于一計(jì)算機(jī)可讀取存儲介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(read-onlymemory,rom)或隨機(jī)存儲記憶體(randomaccessmemory,ram)等。

      以上對本申請所提供的消息隊(duì)列系統(tǒng)以及實(shí)現(xiàn)消息通信的方法進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體實(shí)施例對本申請的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請的方法及其核心思想;同時(shí),對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在具體實(shí)施方式及應(yīng)用范圍 上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。

      當(dāng)前第1頁1 2 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
      1