[短彩信]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)流控
流控实现的方法很多种,大家去搜一个下,应该能找到很多的方式,下面简单说一下,我们的方式,下面是一个主要实现方法的概要:
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 }
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的结构,短信的类似;