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



該Socket數據緩沖隊列設計具有一定的實用性,通過優(yōu)化設計,此方案應對大多數數據轉發(fā)場景已經基本夠用,達到了預期的效果。
[1]李敏波編.C#高級編程[M].清華大學出版社.
[2]邱郁惠編.visual studio 2010和UML黃金法則[M].機械工業(yè)出版社.