[短多媒體訊息]C#短多媒體訊息模組開發設計(4)——其他

來源:互聯網
上載者:User

準備從以下幾個方面簡單的談談短多媒體訊息模組的實現:

[短多媒體訊息]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的結構,簡訊的類似;

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.