[短彩信]C#短彩信模块开发设计(2)——配置
准备从以下几个方面简单的谈谈短彩信模块的实现:
[短彩信]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)
现在来说说配置,其实短彩信服务,抛开协议和通讯方式的差异外,整个处理过程是相似的,或者说基本一样(当时在写彩信服务的时候一度想把二者通过接口抽象 写到一个服务里去,不过从服务应职责单一原则和维护的角度来讲,最终还是分开为好)。所以,这里以我在一个项目中短信模块的配置来作为示例。本文的目的仅仅是希望大家通过配置的角度去看短彩信服务应该包括那些功能,另外一点就是跟前一次Blog去做一些具体的呼应。大家不用去一一关注我这里示范的所有配置(毕竟有些特定业务相关),可以根据自己实际情况参考和取舍,当然大家对于遗漏进行补充。
下面现先看看配置(为了不依赖数据库,索性全部基于xml,从多套服务共同部署运行的角度来讲,一些配置节点集合写入一个全局数据库其实更合理;至于程序中如何将xml和相应对象的互相转化,做法太多,第三方的、根据一定规则反射的……,这里不介绍了):
1 <SMSAConfig> 2 <SysConfigItem ServiceCode="CSMA" RemotingServerPort="8085" MachineID="1" ResendTimeout="30000" ResendCount="3" ActiveTestPeriod="20" DefaultIsmgID="CN.cq.1." MoToAmqThreadCount="3" MtRespToAmqThreadCount="3" MtReplyToAmqThreadCount="3" AmqRetrySecond="60" MobileSplitString="," ServiceIntervalSecond="45"/> 3 <AmqConnectionConfigItems> 4 <Item QueueServerCode="QueueServer1" UserID="u1" Password="w1" SleepSecond="10" ConnectionCount="5" BrokerUri="tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0&maxInactivityDurationInitalDelay=30000&connection.AsyncSend=false"/> 5 </AmqConnectionConfigItems> 6 <AmqQueueConfigItems> 7 <Item QueueType="ResultMediaTask" QueueName="result.mediatask"/> 8 <Item QueueType="ResultSendReport" QueueName="result.sendreport"/> 9 <Item QueueType="MoQueue" QueueName="mo.queue"/> 10 </AmqQueueConfigItems> 11 <ApplicationConfigItems> 12 <Item AppCode="MultiPush.1." AppQueueName="mt.multipush1" BeginReceiveTime="08" EndRecevieTime="22" /> 13 <Item AppCode="MultiPush.2." AppQueueName="mt.multipush2" BeginReceiveTime="08" EndRecevieTime="22" /> 14 <Item AppCode="MultiPush.3." AppQueueName="mt.multipush3" BeginReceiveTime="08" EndRecevieTime="22" /> 15 <Item AppCode="SendTask." AppQueueName="mt.sendtask" BeginReceiveTime="00" EndRecevieTime="24"/> 16 </ApplicationConfigItems> 17 <IsmgServerConfigItems> 18 <Item ID="CN.hn.1." IpAddress="127.0.0.1" Port="7890" SpCode="916086" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 19 <Item ID="CN.js.1." IpAddress="127.0.0.1" Port="7890" SpCode="910680" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 20 <Item ID="CN.hb.1." IpAddress="127.0.0.1" Port="7890" SpCode="917339" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 21 <Item ID="CN.cq.1." IpAddress="127.0.0.1" Port="7890" SpCode="922198" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 22 <Item ID="CN.sx.1." IpAddress="127.0.0.1" Port="7890" SpCode="926536" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 23 <Item ID="CN.gd.1." IpAddress="127.0.0.1" Port="7890" SpCode="419901" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 24 <Item ID="CN.nm.1." IpAddress="127.0.0.1" Port="7890" SpCode="905331" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/> 25 </IsmgServerConfigItems> 26 <MachineConfigItems> 27 <Item MachineID="1" IP="127.0.0.1" Port="8085"/> 28 <Item MachineID="2" IP="192.168.1.10" Port="8085"/> 29 </MachineConfigItems> 30 <RegionIsmgMappingConfigItems> 31 <Item ID="1" RegionCode="CN.hn." IsmgID="CN.hn.1." /> 32 <Item ID="2" RegionCode="CN.js." IsmgID="CN.js.1." /> 33 <Item ID="3" RegionCode="CN.hb." IsmgID="CN.hb.1." /> 34 <Item ID="4" RegionCode="CN.cq." IsmgID="CN.cq.1." /> 35 <Item ID="5" RegionCode="CN.sx." IsmgID="CN.sx.1." /> 36 <Item ID="6" RegionCode="CN.gd." IsmgID="CN.gd.1." /> 37 <Item ID="7" RegionCode="CN.nm." IsmgID="CN.nm.1." /> 38 </RegionIsmgMappingConfigItems> 39 <RegionConfigItems> 40 <Item RegionID="594463261" RegionCode="CN.hn." /> 41 <Item RegionID="594463294" RegionCode="CN.js." /> 42 <Item RegionID="594463243" RegionCode="CN.hb." /> 43 <Item RegionID="1168" RegionCode="CN.cq." /> 44 <Item RegionID="1177" RegionCode="CN.sx." /> 45 <Item RegionID="86564469" RegionCode="CN.gd." /> 46 <Item RegionID="1172" RegionCode="CN.nm." /> 47 </RegionConfigItems> 48 </SMSAConfig>
SysConfigItem
ServiceCode:服务代码,日志分类、监控信息等需要用到;
RemotingServerPort:Remoting监听端口;
《[短彩信]C#短彩信模块开发设计(1)——架构》里说过,如果分省接入,然后配置又不是每套服务都能处理所有网关,就需要消息跨机跳转;这里用的
的.net remoting,当然了比较老气,改为RPC的方式更好;
MachineID:当前服务部署机器的ID,在跨机的时候也需要用到;
ResendTimeout:超时重发时间;
ResendCount:最大重发次数;
ActiveTestPeriod:与网关的心跳间隔(单位:秒)
DefaultIsmgID:默认网关ID;如果分省接入的时候,如果某个消息对应不到网关,则发给某认网关,一般配置为一级网关;
MoToAmqThreadCount:上行写入Amq队列线程数;《[短彩信]C#短彩信模块开发设计(1)——架构》里说过Amq的收发原则;
MtRespToAmqThreadCount:下行写入Amq队列线程数;
MtReplyToAmqThreadCount:状态报告写入Amq队列线程数;
AmqRetrySecond:Amq失败重连间隔(当某个连接坏了的时候,自动重连时间间隔)
MobileSplitString:短信群发,手机号分隔符号(实际从cmpp2.1之后兼容了短信群发,协议中接收手机号码是支持数组的,不过我们在项目中没有使用,即使上层应用传过来的群发手机号,实际的处理也是split成了N条消息给网关的);
ServiceIntervalSecond:服务定时间隔(主要是配合监控系统使用,一到这个配置时间,服务会给监控服务发送心跳);
AmqConnectionConfigItems (Amq连接配置)
主要来配置Amq队列的连接信息,从上面大家应该能看出:
1)我们使用了需要用户名/密码的方式去连接;
2)采用同步方式收发消息;
SleepSecond:如果队列消息收空了,休眠时间;
AmqQueueConfigItems(Amq队列配置集)
代码中定义了一个QueueType的枚举,根据此枚举确定将回执/状态报告/上行发送到Amq的哪个队列之中;
QueueType:队列类型;
QueueName:Amq队列名称;
ApplicationConfigItems(下行应用配置集)
业务中需要将某些消息在某些时间段内不发送,AmqLisenter如果发现某个队列的配置不在规定时间之前,则停止接收消息,通过这样的方式控制,不向网关发送消息;
AppCode:应用名称;
AppQueueName:应用Amq队列名称;
BeginReceiveTime:开始接受时间;
EndRecevieTime:结束接收时间;
IsmgServerConfigItems(网关配置集)
ID:网关ID(本地MSMQ队列会根据此命名和自动创建)
IpAddress:网关IP;
Port:网关端口;
SpCode:连接鉴权用户名(网关用SpCode来区分接入的Sp,一般在连接鉴权时的用户名字/密码,用户名都用spcode,所以配置名称干脆做成了SpCode);
SharedSecret:连接鉴权密码;
MoConnectionCount:上行连接数;
MtConnectionCount:下行连接数;
CanWappush:是否支持Wappush;(wappush实际就是一种特殊短信)
ComputerWorker:这里其实就是配置是否所有服务能跑所有网关了;逗号切分;
MaxSendCount:单连接的最大发送速度;
IntelligentSlowing:是否智能降速(如果配置为true,则不根据MaxSendCount进行流控;);
备注:
1)之所以要流控,就是因为如果发送过快,会把网关“压 跨”,往往的结果就是网关表现越差,发送约慢,而且这个慢一般非线性,是种激增;但是有时候高于网关给的流控阀值,网关也没有表现出差,所以如何充分利用 网关性能提高发送速度呢?智能降速就是一种方法。所谓智能降速就是,只要网关表现好,我就发;一旦网关表现不好(其实就是看下行延迟),我就降低速度;关 于流控和智能降速,打算在第4次来说([短彩信]C#短彩信模块开发设计(4)——其他);之前大家很关心的如何提高短彩信发送速度,这就是一种优化方案。
2)如果分省接的话,可能会遇到有些省同一个端口不同时支持 上行和下行(现在华为,东软,亚信,深讯啥的都做个一些省的网关;像深讯就是这样用端口区分上下行);所以在配置网关的时候,有些省可能需要配置2条信 息;处理上行的把MtConnectionCount配成0(一般是7910) ,只处理下行的把MoConnectionCount配成0就可以了(一般是7890)。ID可以配置成CN.xx.1.\CN.xx.2.
MachineConfigItems
就是配置机器ID、IP、端口了没啥好说(跨机的时候需要使用此配置)
RegionIsmgMappingConfigItems/RegionConfigItems
这两个配置集,主要是我们项目中,上层应用传过来的省代码是数字(RegionID),短信服务需要配置本地MSMQ使用,程序会自动创建和使用各 个队列,那么用数字显然可读性不高,所以用RegionCode比较直观(RegionCode也是本地MSMQ队列名称的一部 分);RegionIsmgMappingConfigItems则是把省和网关对应起来;