准備從以下幾個方面簡單的談談短彩信模塊的實現:
[短彩信]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的結構,短信的類似;

