• [短彩信]C#短彩信模块开发设计(4)——其他


    [短彩信]C#短彩信模块开发设计(1)——架构(http://www.cnblogs.com/QLJ1314/archive/2012/12/17/2821965.html
    [短彩信]C#短彩信模块开发设计(2)——配置(http://www.cnblogs.com/QLJ1314/archive/2012/12/17/2821978.html
    [短彩信]C#短彩信模块开发设计(3)——协议(http://www.cnblogs.com/QLJ1314/archive/2012/12/17/2821988.html
    [短彩信]C#短彩信模块开发设计(4)——其他(http://www.cnblogs.com/QLJ1314/archive/2012/12/17/2821993.html

    1)流控

        流控实现的方法很多种,大家去搜一个下,应该能找到很多的方式,下面简单说一下,我们的方式,下面是一个主要实现方法的概要:

    View Code
     1 public class MtConnection
     2     {
     3         private int _maxSendCount;
     4         private readonly object _sendCountLock = new object();
     5         private int _sendCount = 0;  
     6         private DateTime _sendTime = DateTime.Now;      //该条链路累计发送MT的时间间隔 500毫秒为一时间段
     7 
     8         public MtConnection(int maxSendCount)
     9         {
    10             _maxSendCount = maxSendCount;
    11         }
    12 
    13         public int MaxSendCount
    14         {
    15             get
    16             {
    17                 if (DateTime.Now.Millisecond >= 500)
    18                 {
    19                     return _maxSendCount / 2;
    20                 }
    21 
    22                 return _maxSendCount - (_maxSendCount / 2);
    23             }
    24         }
    25 
    26         public bool IsOverSendCount(int sendNum)
    27         {
    28             lock (_sendCountLock)
    29             {
    30                 DateTime now = DateTime.Now;
    31                 if ((now - _sendTime).TotalMilliseconds >= 500)
    32                 {
    33                     _sendTime = now;
    34                     _sendCount = sendNum;
    35                 }
    36                 else
    37                 {
    38                     if (this._sendCount + sendNum > this.MaxSendCount)
    39                     {
    40                         return true;
    41                     }
    42 
    43                     _sendCount += sendNum;
    44                 }
    45 
    46                 return false;
    47             }
    48         }
    49     }
    View Code
     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             var mtConnection = new MtConnection(10);
     6             for (int i = 0; i <= 1000000; i++)
     7             {
     8                 if (mtConnection.IsOverSendCount(1))
     9                 {
    10                     Console.WriteLine("发送" + i + "超流控");
    11                     Thread.Sleep(1000);
    12                 }
    13                 else
    14                 {
    15                     Console.WriteLine(i);
    16                 }
    17             }
    18         }
    19     }

    怎么样很简单吧,当然了,在我们实际的处理之中,如果判断某次的发送超过了流控阀值,不是简单的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的结构,短信的类似;

  • 相关阅读:
    [转] 使用Git进行小项目代码管理
    [转] Linux抓包工具tcpdump详解
    几天都是气温骤降,感冒了还没有收获
    1128进入自学实习培训路
    hdu 4952
    hdu 4937 2014 Multi-University Training Contest 7 1003
    hdu 4941 2014 Multi-University Training Contest 7 1007
    hdu 4939 2014 Multi-University Training Contest 7 1005
    hdu 4932 BestCoder Round #4 1002
    POJ 2362
  • 原文地址:https://www.cnblogs.com/QLJ1314/p/2821993.html
Copyright © 2020-2023  润新知