zoukankan      html  css  js  c++  java
  • C#短彩信模块开发设计

    准备从以下几个方面简单的谈谈短彩信模块的实现:

    [短彩信]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的结构,短信的类似;

     
     
    标签: S/MMS
  • 相关阅读:
    java和.NET的比较
    联想笔记本不能无线上网
    js根据给定的日期计算当月有多少天
    jQuery中live()变更
    C#操作xml文件
    SQL server的with的用法(一)
    jquery拖拽实现UI设计组件
    自定义弹出框
    第一个超级简单Node.js实例
    windows 下使用redis
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2822015.html
Copyright © 2011-2022 走看看