準備從以下幾個方面簡單的談談短多媒體訊息模組的實現:
[短多媒體訊息]C#短多媒體訊息模組開發設計(1)——架構(http://www.cnblogs.com/CopyPaster/archive/2012/12/07/2806776.html)
[短多媒體訊息]C#短多媒體訊息模組開發設計(2)——配置(http://www.cnblogs.com/CopyPaster/archive/2012/12/10/2811626.html)
[短多媒體訊息]C#短多媒體訊息模組開發設計(3)——協議(http://www.cnblogs.com/CopyPaster/archive/2012/12/12/2814918.html)
[短多媒體訊息]C#短多媒體訊息模組開發設計(4)——其他(http://www.cnblogs.com/CopyPaster/archive/2012/12/17/2821715.html)
1)流控
流控實現的方法很多種,大家去搜一個下,應該能找到很多的方式,下面簡單說一下,我們的方式,下面是一個主要實現方法的概要:
public class MtConnection { private int _maxSendCount; private readonly object _sendCountLock = new object(); private int _sendCount = 0; private DateTime _sendTime = DateTime.Now; //該條鏈路累計發送MT的時間間隔 500毫秒為一時間段 public MtConnection(int maxSendCount) { _maxSendCount = maxSendCount; } public int MaxSendCount { get { if (DateTime.Now.Millisecond >= 500) { return _maxSendCount / 2; } return _maxSendCount - (_maxSendCount / 2); } } public bool IsOverSendCount(int sendNum) { lock (_sendCountLock) { DateTime now = DateTime.Now; if ((now - _sendTime).TotalMilliseconds >= 500) { _sendTime = now; _sendCount = sendNum; } else { if (this._sendCount + sendNum > this.MaxSendCount) { return true; } _sendCount += sendNum; } return false; } } }
class Program { static void Main(string[] args) { var mtConnection = new MtConnection(10); for (int i = 0; i <= 1000000; i++) { if (mtConnection.IsOverSendCount(1)) { Console.WriteLine("發送" + i + "超流控"); Thread.Sleep(1000); } else { Console.WriteLine(i); } } } }
怎麼樣很簡單吧,當然了,在我們實際的處理之中,如果判斷某次的發送超過了流控閥值,不是簡單的sleep,而是利用
ThreadPool.RegisterWaitForSingleObject(
WaitHandle waitObject,
WaitOrTimerCallback callBack,
Object state,
int millisecondsTimeOutInterval,
bool executeOnlyOnce
)
向線程池添加一個可以定時執行的方法;(在我們的實現中對於延遲訊息實際上會發送至一個System.Collections.Queue;原則是只要超流控,就入延遲隊列;至於如何處理延遲,大家各自根據口味實現,不過要注意:一定不能丟訊息,不能說第一次延遲了,第二次就一定不延遲)
2)即時監控
關於即時監控,我們藉助Window效能計數器(Performance Counter),去即時統計發送速度、發送訊息數量、滑動視窗訊息數量、訊息積壓數、網關延遲等等資訊;由於為了使用方便,我們對於效能計數器進行了一定的封裝,這裡就不貼具體的代碼了。關於效能計數器的使用,大家可以去查一下相關的資料;總之,藉助Window效能計數器(Performance Counter)進行即時監控,對於程式本省的資源損耗很低,大家可以認為可以忽略;大家可以在run中輸入perfmon.exe開啟效能監控器;
3)聯調和工具
3.1)抓包工具:
簡訊基於CMPP協議,在聯調和排查問題的時候,往往需要先抓包,那可以使用:wireshark(wireshark支援以cmpp協議解碼):
3.2)常用Dos命令:
telnet:在檢查網路是否通暢時用此命令。
tracert:如果telnet不通,可以用此命令檢查哪一步出問題了。
netstat:檢查串連情況。
3.3)其他:
一般在本地開發過程之中需要簡單寫一個類比構造訊息的工具(的TestTool)和網關擋板(的DumyGateway),是多媒體訊息solution的結構,簡訊的類似;