当前位置: 首页 > news >正文

[短彩信]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和相应对象的互相转化,做法太多,第三方的、根据一定规则反射的……,这里不介绍了):

View Code
 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&amp;maxInactivityDurationInitalDelay=30000&amp;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则是把省和网关对应起来;

转载于:https://www.cnblogs.com/QLJ1314/archive/2012/12/17/2821978.html

相关文章:

  • Java里面CompletableFuture详解
  • 10个最受欢迎的Java类
  • 国内 CDN 产品发展历史和现状整理
  • [译] 用 Java 创造你的第一个区块链-第一部分
  • vi
  • 文件上传下载
  • Flex与后台交互 鼠标忙时状态
  • 18.Azure备份(MARS)代理(下)
  • 5个能够有效帮助你快速创建超棒CSS3动画效果的类库
  • 用js实现页面跳转的几种方式
  • Bzoj1758: [Wc2010]重建计划
  • 图像编码介绍mark
  • redis集群部署及踩过的坑
  • 解决编译apache出现的问题:configure: error: APR not found . Please read the documentation
  • 找出OData service出错根源的小技巧
  • @angular/forms 源码解析之双向绑定
  • 《深入 React 技术栈》
  • 【个人向】《HTTP图解》阅后小结
  • echarts花样作死的坑
  • HTTP 简介
  • HTTP--网络协议分层,http历史(二)
  • ng6--错误信息小结(持续更新)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Yii源码解读-服务定位器(Service Locator)
  • 坑!为什么View.startAnimation不起作用?
  • 前端技术周刊 2019-02-11 Serverless
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用SAX解析XML
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)二分查找 超详细
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Java数据结构)ArrayList
  • (LeetCode C++)盛最多水的容器
  • (编译到47%失败)to be deleted
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Reactor简单使用教程
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET学习教程二——.net基础定义+VS常用设置
  • @JsonFormat与@DateTimeFormat注解的使用
  • @RequestBody与@ModelAttribute
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 第一章] JavaScript 简史
  • [1204 寻找子串位置] 解题报告
  • [20190416]完善shared latch测试脚本2.txt