摘要:本文主要說明一個用來支持高吞吐量彩票交易的消息服務子系統的設計與實現過程。該子系統提供基于Socket的簡單消息服務,屏蔽了Socket通信細節,提供高效的同步及異步請求/響應消息服務。文中對該子系統的流程進行了分析,并對調用其服務的過程進行了詳細的描述。
關鍵詞:高吞吐量;彩票交易;同步請求/響應;異步請求/響應
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)15-20ppp-0c
The Design and Development of Message Service Subsystem Supporting High Throughput Lottery Trading
CHEN Wei-wei
(Computer Academy,National University of Defense Technology,Changsha 410073,China)
Abstract:This paper illuminates the design and development procedure of a message service subsystem which supports high throughput lottery trading on Internet. The subsystem offers a message request/response service based on Socket. During the use of the subsystem, you don't have to deal with any Socket communication detail and can get high speed communication service. There are detailed analysis of this subsystem’s working process and detailed usage of this subsystem’s message service in this paper.
Key words:High throughput;Lottery trade;Synchronous request/response;Asynchronous request/response
1 引言
對于兩個遠程通信的程序來說,可以采用的大多數常見方法在底層都是基于Socket來通信的,由于這些方法都需要做一些額外的處理,所以最快速的通信方式就是直接采取Socket通信。對于一個要求高吞吐量的彩票系統來說,采用Socket通信是一個合適的選擇。但是由于Socket通信有一些底層細節需要處理,而且大多數普通開發者都很少接觸Socket編程。因此,如果能夠在Socket之上做一個簡單封裝,屏蔽掉Socket編程細節,又將對效率的影響控制在很小的范圍內,那么這樣的產品對于開發高吞吐量的彩票系統而言,具有很大的好處。我們將上面所述的這樣一直服務稱為基于Socket的簡單消息服務,簡稱SMS-BOS。
本文首先提出SMS-BOS的建設目標,然后討論如何設計與實現這樣一個服務,并在第4部分提供了一個基于Java NIO的實現原型。通過我們在開發高吞吐量系統的過程來看,SMS-BOS包括以下內容:
1)封裝所有Socket通信的底層細節;
2)實現同步的請求/響應消息交互模型;
3)實現異步的請求/響應消息交互模型;
4)分別提供一個服務端的API包和一個客戶端的API包供程序調用。
2 系統流程分析
2.1 同步請求/響應模型
當請求方調用SMS-BOS的發送消息的API時,當前線程會一直阻塞到接收到響應方的響應消息為止;在接受到響應消息以后,當前線程會回調請求時傳入的某個實現了處理響應消息接口的類的實例,執行完之后返回到發起請求處,接著執行后面的代碼。
響應方在收到請求消息之后,會自動調用在配置文件中配置的處理請求消息的指定類的處理響應消息的方法。該類實現了SMS-BOS子系統中提供的處理請求消息的接口。
詳細的過程如圖1所示。


2.2 異步請求/響應模型
當請求方調用SMS-BOS的發送消息的API時,當前線程在發送完消息之后就直接返回執行后面的代碼;在接收到響應消息之后,系統會自動新開啟一個線程,回調請求時傳入的某個實現了處理響應消息接口的類的實例。
響應方在收到請求消息之后,會自動調用在配置文件中配置的處理請求消息的指定類的處理響應消息的方法。該類實現了與同步模型中同樣的接口。
具體流程如圖2所示。
3 消息請求/響應過程
SMS-BOS數據傳輸服務的使用者無需區分服務端與客戶端,在通信兩端所使用的消息處理接口是完全一致的。在下文中,使用請求方與響應方來表示一個消息請求/響應過程的參與雙方。下面詳細描述消息請求/響應過程的每一步。
1)發送請求消息
// 獲得通道
SmsChannel channel = SmsProvider.getSmsChannel(channelID);
if (channel != 1) {
try {
channel.sendMessage(msg,回調對象);
} catch (SmsTimeoutException e) {
e.printStackTrace();
}
}
發送方首先通過通道的ID獲得需要的通道channel,然后調用channel.sendMessage()方法來發送消息。需要傳入一個實現了ISmsResponseDealor接口的類的對象來接受回調。
發送消息代碼如下:
byte[] msgByte = msg.getBytes();
ByteBuffer buffer=ByteBuffer.allocate(msgByte.length);
buffer.clear();
buffer.put(msgByte);
buffer.flip();
channel.write(buffer);
2)接受請求消息
SMS-BOS為每個通道開啟一個線程,然后用Java NIO的方式讀取數據,通道線程內讀數據的過程如下:創建緩沖區、打開Selector,然后注冊NIO的Channel的讀事件到Selector中去;然后就是等待讀數據了,當讀到一個消息數據后,新啟動一個線程,由該線程負責處理該消息。
3)處理請求
ISmsRequestDealor是處理請求消息的接口,我們首先定義一個實現該接口的類SmsRequestDealor,然后在配置文件中指定response-class屬性值為該類,這樣當收到請求消息時,首先創建一個指定類的實例:
ISmsRequestDealor dealor = (ISmsRequestDealor) Class.forName(
channel.getRequestDealor()).newInstance();
return dealor.dealRequestMsg(msg);
然后調用該類的dealRequestMsg()方法來處理消息。
4)返回響應消息
SMS-BOS會將第3步中的dealRequestMsg()方法的返回值發送給請求方。
發送消息的代碼與第1步中一樣。
5)接受響應消息
接受響應消息的代碼與第3步中接受請求消息的一樣。
6)處理響應消息
第1步中的dealResponseMsg()就是用來處理響應消息的。
4 結束語
通過以上的分析、設計及部分代碼實現,我們可以比較清晰的看出SMS-BOS服務的結構及調用方法,通過我們的測試工作得知該系統較好的實現了預期目標:提供了一個屏蔽了通信細節的支持同步、異步兩種請求/響應模型的高效通信服務,為構建高吞吐量系統提供了必要的支持。
參考文獻:
[1]杜成龍,龍紹軍.分布式系統開發優化策略[J].電腦知識與技術:學術交流,2007(18).
[2]George Coulouris,Jeam Dollimore,Tim Kindberg.分布式系統概念與設計[M].金蓓弘,譯.機械工業出版社,2006:1-2.
[3]Herber Schildt.Java2:The Complete Reference[M].4th Edition.2002.
[4]李卓恒,翟華.LINUX網絡編程[M].北京:機械工業出版社,2000.
[5]劉彥明.JAVA語言及其程序實現[M].西安電子科技大學出版社,1997.
收稿日期:2008-03-09
作者簡介:陳衛衛(1978-),男,江蘇如東人,軟件架構師,軟件工程碩士,研究方向:大型網絡應用系統架構,J2EE技術。