[短彩信]C#短彩信模塊開發設計(4)——其他


准備從以下幾個方面簡單的談談短彩信模塊的實現:

[短彩信]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的結構,短信的類似;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM