通信工程獲獎(jiǎng)?wù)撐?2)
通信工程獲獎(jiǎng)?wù)撐?/p>
通信工程獲獎(jiǎng)?wù)撐钠?
淺談消息隊(duì)列技術(shù)在短信通信中的應(yīng)用
1 概述
短消息服務(wù)以簡(jiǎn)單方便的使用功能受到大眾的歡迎,除了大量使用的手機(jī)用戶到手機(jī)用戶的短信業(yè)務(wù)之外,從信息平臺(tái)到手機(jī)用戶的短消息服務(wù)也在快速發(fā)展,該類業(yè)務(wù)已成為廣大用戶獲取信息的一種重要手段。
由于歷史原因,舊版的農(nóng)信通業(yè)務(wù)在短信發(fā)送和接收過程中,采用了同步通信機(jī)制。當(dāng)消息發(fā)送時(shí),需要等待接收方響應(yīng),此時(shí)發(fā)送進(jìn)程被阻塞。如果接收方響應(yīng)不及時(shí),勢(shì)必會(huì)影響發(fā)送方的發(fā)送速度。在通信量較小的情況,此種通信機(jī)制完全能滿足業(yè)務(wù)的需求。然而,當(dāng)通信量達(dá)到每天幾百萬需求時(shí),這樣的通信機(jī)制顯得捉襟見肘了,出現(xiàn)信息送達(dá)延時(shí)、信息積壓、記錄鎖等問題,嚴(yán)重影響到業(yè)務(wù)的發(fā)展。通過筆者對(duì)消息隊(duì)列的研究和學(xué)習(xí),在農(nóng)信通系統(tǒng)中引入了消息隊(duì)列技術(shù)。實(shí)現(xiàn)原理是:消息的發(fā)送者把自己想要發(fā)送的消息放入一個(gè)容器中,然后把它保存在系統(tǒng)公用空間的消息隊(duì)列中,本地或者是異地消息接收程序再?gòu)脑撓㈥?duì)列中取出它的消息進(jìn)行處理。
2 技術(shù)方案
2.1 消息隊(duì)列模塊
依照中國(guó)移動(dòng)點(diǎn)對(duì)點(diǎn)CMPP3.0協(xié)議,結(jié)合短信業(yè)務(wù)的個(gè)性化需求,設(shè)計(jì)了四個(gè)消息隊(duì)列,分別是:①發(fā)送消息隊(duì)列:保存由數(shù)據(jù)操作模塊提供的數(shù)據(jù),供短信發(fā)送模塊使用。
?、赗esponse消息隊(duì)列:當(dāng)短信發(fā)送模塊將信息發(fā)送
得到響應(yīng)后,將該消息放入發(fā)送日志隊(duì)列中,由數(shù)據(jù)操作模塊處理。
?、蹱顟B(tài)報(bào)告隊(duì)列:當(dāng)接收到用戶狀態(tài)報(bào)告時(shí),將此狀態(tài)報(bào)告放入狀態(tài)報(bào)告隊(duì)列中,由數(shù)據(jù)操作模塊處理。
?、躆O消息隊(duì)列:當(dāng)接收到用戶上行到短信網(wǎng)關(guān)的業(yè)務(wù)指令時(shí),將業(yè)務(wù)指令信息放入MO隊(duì)列,由數(shù)據(jù)操作模塊處理。
2.2 數(shù)據(jù)操作模塊
在本實(shí)施方案中,此模塊主要進(jìn)行兩部分操作:
2.2.1 從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)
負(fù)責(zé)從數(shù)據(jù)庫(kù)中批量讀取系統(tǒng)中待發(fā)送的消息數(shù)據(jù),放入待發(fā)送消息隊(duì)列中,數(shù)據(jù)取出的同時(shí)從數(shù)據(jù)庫(kù)中刪除已取出的數(shù)據(jù),避免重復(fù)讀取。
讀取數(shù)據(jù)采用實(shí)時(shí)或是間隔某個(gè)微小時(shí)間,判斷發(fā)送消息隊(duì)列中的消息量,當(dāng)發(fā)送消息隊(duì)列中消息量小于某個(gè)閥值時(shí),主線程觸發(fā)讀取數(shù)據(jù)操作。
2.2.2 從Response消息隊(duì)列、狀態(tài)報(bào)告消息隊(duì)列、MO消息隊(duì)列取數(shù)據(jù)寫入數(shù)據(jù)庫(kù)
采用多線程方式,處理Response消息隊(duì)列、狀態(tài)報(bào)告消息隊(duì)列、MO消息隊(duì)列中的數(shù)據(jù)。消息隊(duì)列中的數(shù)據(jù)根據(jù)其性質(zhì)可以設(shè)置不同的優(yōu)先級(jí),為了保證用戶上行指令的及時(shí)性,MO消息隊(duì)列的優(yōu)先級(jí)高于Response隊(duì)列和狀態(tài)報(bào)告消息隊(duì)列。
Response消息隊(duì)列:從短信網(wǎng)關(guān)接收到的響應(yīng)包,當(dāng)response為0時(shí),表示短信網(wǎng)關(guān)正確接收消息,記錄消息的發(fā)送日志。當(dāng)response非0,表示短信網(wǎng)關(guān)接收數(shù)據(jù)失敗,一般這樣的情況給予3次發(fā)送機(jī)會(huì),如果發(fā)送次數(shù)小于閥值,則該條消息的發(fā)送次數(shù)加1后重新寫入數(shù)據(jù)庫(kù)的待發(fā)送隊(duì)列中。
2.3 短信發(fā)送模塊
短信發(fā)送模塊主要作用是將待發(fā)送隊(duì)列中的信息發(fā)送到短信網(wǎng)關(guān),并接收網(wǎng)關(guān)返回的響應(yīng)信息、狀態(tài)報(bào)告以及MO信息,原理如下:①創(chuàng)建多個(gè)發(fā)送線程,每一個(gè)線程創(chuàng)建一個(gè)與短信網(wǎng)關(guān)通信的socket連接,同時(shí)創(chuàng)建相應(yīng)的多個(gè)接收線程和多個(gè)滑動(dòng)窗口監(jiān)控線程。
②每個(gè)發(fā)送線程首先判斷滑動(dòng)窗口容器中數(shù)據(jù)量,當(dāng)數(shù)據(jù)量小于滑動(dòng)窗口閥值時(shí),從發(fā)送消息隊(duì)列中取得待發(fā)送數(shù)據(jù)向短信網(wǎng)關(guān)發(fā)送,發(fā)送成功后將該信息置入滑動(dòng)窗口容器中,并將全局計(jì)數(shù)器加1,否則該線程進(jìn)行短暫的休息。
?、劢邮站€程實(shí)時(shí)接收短信網(wǎng)關(guān)傳送過來的數(shù)據(jù),接收線程接收到數(shù)據(jù)后,如果是Response響應(yīng),則根據(jù)消息內(nèi)容與滑動(dòng)窗口容器中數(shù)據(jù)進(jìn)行匹配,如果匹配到,則將滑動(dòng)窗口容器中該數(shù)據(jù)刪除,放入Response消息隊(duì)列,由數(shù)據(jù)處理模塊進(jìn)行處理。如果匹配失敗則拋棄該數(shù)據(jù);接收線程接收到狀態(tài)報(bào)告,將信息存入狀態(tài)報(bào)告消息隊(duì)列中;接收線程接收到用戶MO信息,將該信息存入MO消息隊(duì)列中。Response消息隊(duì)列、狀態(tài)報(bào)告消息隊(duì)列、MO消息隊(duì)列由數(shù)據(jù)操作模塊進(jìn)行處理。
?、芑瑒?dòng)窗口容器監(jiān)控線程間隔性檢測(cè)該容器中數(shù)據(jù)是否超時(shí),如果超時(shí),則該數(shù)據(jù)刪除并放入發(fā)送日志隊(duì)列同時(shí)為該數(shù)據(jù)置超時(shí)標(biāo)志。
3 實(shí)施效果與優(yōu)勢(shì)
通過引入消息隊(duì)列技術(shù),在短信業(yè)務(wù)的數(shù)據(jù)通信中,每個(gè)連接的發(fā)送速度達(dá)到每秒60條左右。如果短信網(wǎng)關(guān)給一個(gè)短信類業(yè)務(wù)分配4個(gè)連接通道,那么業(yè)務(wù)的發(fā)送速度將達(dá)到每秒240條。完全能滿足日發(fā)送600萬(8*3600*
240,一天按8小時(shí)計(jì)算)的業(yè)務(wù)量需求。消息隊(duì)列技術(shù)不僅能提高通信速度,還具備以下優(yōu)勢(shì):
?、費(fèi)SMQ是一種分布式的開放技術(shù),可以在服務(wù)端離線情況下工作,將消息臨時(shí)保存在發(fā)送方的消息隊(duì)列中,以后聯(lián)機(jī)時(shí)再發(fā)送到接收方處理,避免了由于通信中斷導(dǎo)致數(shù)據(jù)丟失現(xiàn)象,提高了通信的可靠性。
?、谟捎谑钱惒酵ㄐ艡C(jī)制,無論是發(fā)送方還是接收方,都不用等待對(duì)方返回成功消息,就可以執(zhí)行余下的代碼,大大提高了事務(wù)處理能力。
4 結(jié)束語
本文討論了微軟消息隊(duì)列在短信業(yè)務(wù)中的應(yīng)用,農(nóng)信通系統(tǒng)通過利用微軟消息隊(duì)列解決了業(yè)務(wù)信息發(fā)送中遇到的發(fā)送瓶頸問題,對(duì)于類似需要大量發(fā)送短信的系統(tǒng)平臺(tái)設(shè)計(jì)具有很好的參考意義。