蘇翠玲
石家莊計(jì)算機(jī)職業(yè)學(xué)院,河北 石家莊 050061
C#是微軟公司發(fā)布的一種新的面向?qū)ο缶幊陶Z言。它是微軟公司研究員Anders Hejlsberg的最新成果。作為.NET開發(fā)平臺(tái)中最重要的一門語言,越來越受到廣大程序員的青睞。由C和C++衍生出來的,繼承了C和C++強(qiáng)大功能,同時(shí)去掉了一些復(fù)雜特性。C#綜合了VB簡單的可視化操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET開發(fā)的首選語言。
Visual Studio是微軟公司推出的目前最流行的Windows平臺(tái)應(yīng)用程序開發(fā)環(huán)境,可以用來創(chuàng)建 Windows平臺(tái)下的應(yīng)用程序和網(wǎng)絡(luò)應(yīng)用程序,也可以用來創(chuàng)建網(wǎng)絡(luò)服務(wù)、智能設(shè)備應(yīng)用程序和 Office插件。
在很多消息發(fā)送服務(wù)中都涉及到數(shù)據(jù)轉(zhuǎn)發(fā),常見的IM工具,比如QQ、MSN等等,企業(yè)用的特定數(shù)據(jù)轉(zhuǎn)發(fā)服務(wù),比如GPS實(shí)時(shí)定位等。在數(shù)據(jù)量小的情況下一般不會(huì)有什么問題,但如果數(shù)據(jù)大,又對(duì)實(shí)時(shí)性要求比較高,如果處理不好則會(huì)出現(xiàn)性能問題。
對(duì)轉(zhuǎn)發(fā)服務(wù)一般性要求:
1)同時(shí)接收多個(gè)來源的數(shù)據(jù)連接;
2)同時(shí)連接多個(gè)目標(biāo)的數(shù)據(jù)連接;
3)實(shí)時(shí)轉(zhuǎn)發(fā);
4)保證數(shù)據(jù)轉(zhuǎn)發(fā)順序與接收順序一致;
5)本地保留數(shù)據(jù)副本
首先,對(duì)于實(shí)時(shí)轉(zhuǎn)發(fā),就要求在收到數(shù)據(jù)后立刻寫入目標(biāo)客戶端連接,然后保存副本到本地?cái)?shù)據(jù)庫。在客戶端連接正常的情況下,一般不會(huì)有什么問題,但internet網(wǎng)絡(luò)的暢通性一般情況下是無法保證的,如果一旦在收到源數(shù)據(jù)后,而對(duì)應(yīng)客戶端又暫時(shí)連接不上,就會(huì)出現(xiàn)需要暫存數(shù)據(jù)的要求。
對(duì)于暫存數(shù)據(jù),一般情況下是保存到本地?cái)?shù)據(jù)庫中,等客戶端連接后再一條一條查詢出對(duì)應(yīng)數(shù)據(jù)后發(fā)送,這樣可以實(shí)現(xiàn)此要求,但如果某個(gè)客戶端斷線很長時(shí)間,在本地暫存數(shù)據(jù)達(dá)到上千上萬記錄,如果這樣處理,勢必會(huì)影響發(fā)送速度,甚至可能會(huì)出現(xiàn)發(fā)送速度比接收速度還慢,那就會(huì)數(shù)據(jù)越積累越多,永遠(yuǎn)發(fā)送不完。
除了上述問題,還有另一種情況,就是在客戶端頻繁短時(shí)間斷線,這種情況會(huì)出現(xiàn)對(duì)暫存數(shù)據(jù)庫的頻繁更新,對(duì)性能影響也很大。
對(duì)于前面的問題,我們現(xiàn)在可設(shè)計(jì)一個(gè)內(nèi)存隊(duì)列池,每個(gè)客戶端如果需要暫存數(shù)據(jù),則先在此內(nèi)存隊(duì)列池中創(chuàng)建一個(gè)內(nèi)存隊(duì)列,將暫存數(shù)據(jù)保存到對(duì)應(yīng)隊(duì)列中,如果暫存數(shù)據(jù)量大于指定的某個(gè)值(根據(jù)內(nèi)存大小及實(shí)際需要指定),則將后續(xù)暫存數(shù)據(jù)持久到暫存數(shù)據(jù)庫,這樣,對(duì)于長時(shí)間斷線的客戶端產(chǎn)生的大量暫存數(shù)據(jù)的性能有一定緩解,對(duì)于頻繁短時(shí)間斷線的客戶端所產(chǎn)生的頻繁更新暫存數(shù)據(jù)庫的情況則可以完全避免。
隊(duì)列池設(shè)計(jì),分為隊(duì)列 和 池。對(duì)于池的設(shè)計(jì)比較簡單,主要實(shí)現(xiàn)包括:
1)內(nèi)部隊(duì)列緩存集合;
2)初始化(指定隊(duì)列數(shù)據(jù)最大大小、加載上次隊(duì)列關(guān)閉時(shí)持久的隊(duì)列);
3)數(shù)據(jù)入隊(duì)(調(diào)用客戶端對(duì)應(yīng)隊(duì)列的入隊(duì));
4)數(shù)據(jù)出隊(duì)(調(diào)用客戶端對(duì)應(yīng)隊(duì)列的出隊(duì));
5)關(guān)閉(持久化隊(duì)列)
隊(duì)列的設(shè)計(jì),主要包括:
1)初始化(實(shí)例化一個(gè)簡單的先進(jìn)現(xiàn)出隊(duì)列、加載上次隊(duì)列關(guān)閉時(shí)持久的數(shù)據(jù))
2)數(shù)據(jù)入隊(duì)
先同步隊(duì)列鎖,防止入隊(duì)和出隊(duì)的線程并發(fā)操作,然后判斷暫存數(shù)據(jù)是否超過隊(duì)列大小限制,如果超過則持久化到數(shù)據(jù)庫中(附加功能,發(fā)送電子郵件到指定郵箱,提醒數(shù)據(jù)出現(xiàn)問題),否則添加到隊(duì)列。
3)數(shù)據(jù)出隊(duì)
先同步隊(duì)列鎖,防止入隊(duì)和出隊(duì)的線程并發(fā)操作,然后判斷當(dāng)前隊(duì)列容量是否等于隊(duì)列最大容量,如果是,則有可能暫存數(shù)據(jù)庫中有暫存數(shù)據(jù),刪除之并對(duì)數(shù)據(jù)出隊(duì),否則直接對(duì)數(shù)據(jù)出隊(duì)。
4)關(guān)閉(持久化隊(duì)列中數(shù)據(jù))。
該Socket數(shù)據(jù)緩沖隊(duì)列設(shè)計(jì)具有一定的實(shí)用性,通過優(yōu)化設(shè)計(jì),此方案應(yīng)對(duì)大多數(shù)數(shù)據(jù)轉(zhuǎn)發(fā)場景已經(jīng)基本夠用,達(dá)到了預(yù)期的效果。
[1]李敏波編.C#高級(jí)編程[M].清華大學(xué)出版社.
[2]邱郁惠編.visual studio 2010和UML黃金法則[M].機(jī)械工業(yè)出版社.