基于SMGP协议短信发送速度问题

短信网关在处理SP接入的同时,他还有个很重要的作用就是流控,以防止第三方突然提交大量的短信而导致整个短信平台出现异常增加的流量,导致系统不稳定。为了实现对于客户端过来的请求进行流控,由于无法判断SP提交的短信实时速度,短信网关需要将实时提交的短信进行分时(类似高数里面的微积分的概念),并根据细小的分时来统计当前的流量,对于超过流控的流量进行过滤。这句话不大好理解,我们可以简单举个例子:假设网关开给你的流量是10条/秒,那个网关就给你准备10个杯子,你在1秒内往10个杯子倒水,网关并不是实时进行清空,1秒后网关就会一次清空这10个杯子。这里会出现两种情况,一种是你没有倒满10个杯子,那么你的流量就没到10条/秒,这样就没有问题,如果1秒内你倒了12个杯子,其中有2杯子的水没有地方盛放,那么那两个杯子的水就倒到外面了,也就是被流控了。当然网关分时可能比这1秒的时间更短。这个例子说明两个问题:一、在细小的时间间隔内,网关进行的流控,所以提交的短信并不是按照几分钟内的提交速度,虽然你可能1分钟提交的短信总量按照每秒换算并未超过流控,但是你在中间某几秒提交的速度过快,也会导致被流控。二、虽然你可能按照严格的流量进行满打满算的发送,但有可能节奏上与短信网关存在差异,也可能导致偶尔有几条短信被流控。

     明白了流控的概念以后,你可能会发现你使用SMGP协议进行发送的时候远达不到网关给你的流控速度。这其中的原因并不是网关流控出现问题。在SMGP协议中,一个完整的短信发送过程包括SP端发起Submit,网关返回Submit_Resp,问题的关键在于Submit_Resp与Submit存在延时。这个延时无法避免,而且并不是网关流控造成的。因为Submit到了网关以后,网关需要将短信通过ISMAP协议送ISMP鉴权,鉴权通过后送转换成SMPP协议的Submit提交给短信中心,短信中心接收后返回SMPP协议的Submit_Resp,网关处理后转换成SMGP协议的Submit_resp,可以看到一个短信提交后会经过ISMP和短信中心,这中间的延时并不是网关本身能够控制的。整个流程如下图:


     明白了Submit与Submit_Resp延时的原因,我们也明白了这个延时不可避免。那如何提高发送速度。其中主要有三种方式。1)如果内容都相同,可以使用SMGP的群发方式来发送。2)可以并发多个连接进行发送,能否并发的连接数取决于网关的配置。3)提交Submit消息后不等待Submit_resp。前两种方法比较简单,这里不细说了。
   
     采用第三方方式我们需要解决一个问题,就是如何知道短信是否发送成功,由于不等待Submit_resp意味着提交Submit以后我们无法知道这条短信是否通过ISMP鉴权,是否提交短信中心,提交以后MsgID是多少。我们通过SMGP协议分析可以得出结论:Submit与Submit_resp由SequenceID进行关联,SequenceID存在于SMGP_Header,而Submit_resp如果发送成功还会返回MsgID,如果我们的短信需要状态报告的时候,状态报告还需要与Submit_resp中的MsgID进行关联。这中间的编程实现这里就不再说明。

发表于 @ 2009年12月21日 11:00:00 | 评论( 20 ) | 举报| 收藏

旧一篇:CDMA长短信问题 | 新一篇:SMGP Server模拟器

richal_158 发表于Sat Dec 26 2009 21:22:29 GMT+0800 (China Standard Time)   举报 回复
林兄的博文,解答我流控和msgid的一些疑问。
silent_hacker 发表于Tue Jan 12 2010 18:30:06 GMT+0800 (China Standard Time)   举报 回复
如果发送任务较多。会返回-1或者Submit_resp错误,有时还会try login。这个如何解决?现在暂时是sleep延时。
dowellhz 发表于Tue Jan 12 2010 20:43:29 GMT+0800 (China Standard Time)   举报 回复
回复 silent_hacker: -1的话是socket断开了,这个你程序最好sleep 5-10秒再重发 尽量不要发送速度超过网关给你的设置,超过的话网关不响应或者直接断开是网关自身胡保护机制,你没法控制的。
silent_hacker 发表于Thu Jan 14 2010 18:34:47 GMT+0800 (China Standard Time)   举报 回复
回复 dowellhz: 原来朋友姓林 林兄您好 是不是client.setSpeed(10)设置后。就不用再发送时再Thread.SLEEP了? 还有用你的api包 是不是只需要程序启动时初始化一次与电信的连接就行。移动的API总是过段时间断开连接,我只能在发送时初始化,发完了关闭,相当别扭。
dowellhz 发表于Thu Jan 14 2010 21:23:30 GMT+0800 (China Standard Time)   举报 回复
回复 silent_hacker:设置setSpeed以后无须sleep,api自己会做流控,api一次连接以后,如果中间有其他原因断网.api会自动重连.另外有人测试下来有些网关要很长时间发一个activeTest,程序会超时。程序作了修正,不过ClientEvnet我没有打包到新的jar上,你需要到http://smgp.googlecode.com/svn/trunk/smgp/smgpapi/src/cn/com/zjtelecom/smgp/connect/PConnectEvent.java 下面下载
silent_hacker 发表于Sun Jan 17 2010 13:47:12 GMT+0800 (China Standard Time)   举报 回复
回复 dowellhz: 这个setSpeed不错,我会使用下看看。 至于电信的回执怎么接收?比如对方收到没,对方是不是停机了。Submit_resp就是回执吗?
dowellhz 发表于Sun Jan 17 2010 20:43:05 GMT+0800 (China Standard Time)   举报 回复
回复 silent_hacker:Submit_resp不是回执,如果result是0表示通过ismp鉴权并提交短信中心.状态报告是isreport为1的一条deliver消息
silent_hacker 发表于Tue Jan 19 2010 16:56:23 GMT+0800 (China Standard Time)   举报 回复
回复 dowellhz: 林兄留个在线联系方式吧,MSN QQ皆可。一起讨论下
dowellhz 发表于Tue Jan 19 2010 22:57:24 GMT+0800 (China Standard Time)   举报 回复
回复 silent_hacker:有问题,google group, https://groups.google.com/group/smgpapi 不方便留qq和msn,不然估计我没法正常上班了。
silent_hacker 发表于Tue Jan 19 2010 17:02:29 GMT+0800 (China Standard Time)   举报 回复
电信接收短信和接收回执都是用onDeliver方法吗?这样岂不是效率很低。
dowellhz 发表于Tue Jan 19 2010 22:59:22 GMT+0800 (China Standard Time)   举报 回复
回复 silent_hacker:回执是短信中心生成的,只能deliver,不要说电信,米国也只能用deliver,我觉得你还是多看看协议吧,这样问问题我也吃不消.
silent_hacker 发表于Mon Jan 25 2010 20:40:27 GMT+0800 (China Standard Time)   举报 回复
回复 dowellhz:不好意思。  昨晚又仔细看了下协议,稍微了解了些。总觉得电信的东西比较麻烦,不如移动MAS开发来得方便。还有个关于兄弟API的问题, 这个回执怎么是乱码?怎么解决 MsgContent:id:Sa#WY楽 sub:000 dlvrd:000 submit date:1001230257 done date:1001230258 stat:DELIVRD err:000 text: 还有我的电信协议里并没有关于回执返回状态的说明 err:000是对方是否接收成功的状态代码么?
dowellhz 发表于Sat Jun 26 2010 14:11:25 GMT+0800 (China Standard Time)   举报 回复
回复 silent_hacker:回执这个是标准的smpp协议,电信移动联通都一样,id:后面是msgid,乱码因为他的编码方式是bcd编码,只要把后面10个字节转换成16进制显示就可以。api对这个有封装,直接用Deliver.ReportMsgID就可以读取。 另外MAS跟短信网关协议不是一个概念,mas已经在网关的协议上进行了二次封装,短信网关方式更灵活,mas方式更简单。
silent_hacker 发表于Mon Jan 25 2010 20:46:04 GMT+0800 (China Standard Time)   举报 回复
找到了。 000 成功 001 用户不能通信 005 代表用户在黑名单中 
linxinzheng 发表于Fri Jun 18 2010 13:06:41 GMT+0800 (China Standard Time)   举报 回复
林兄 问你个问题,电信可以发送免提短信吗?是把dcs设为0x18就可以了吗?
dowellhz 发表于Sat Jun 19 2010 00:46:12 GMT+0800 (China Standard Time)   举报 回复
回复 linxinzheng:dcs?是指msgformat吧?如果msgformat设为0x18,华为的网关会认为msgformat非法。
linxinzheng 发表于Mon Jun 21 2010 09:29:28 GMT+0800 (China Standard Time)   举报 回复
回复 dowellhz:那是使用了中兴网关的省份才可以发免提短信吗?
dowellhz 发表于Sat Jun 26 2010 14:07:26 GMT+0800 (China Standard Time)   举报 回复
回复 linxinzheng:这个我不清楚,没测试过。估计多数厂家没有考虑msgformat的问题。因为常用的就英文、ucs-2,gbk这几种
gqj88958620 发表于Sat Nov 20 2010 23:12:41 GMT+0800 (China Standard Time)   举报 回复
看了源码,有个疑问, 作者为什么不用基于mina,netty之类的nio 框架来对每个request 和response 进行异步操作,SequenceID,MsgID 可以放到缓存,用于更新返回的状态报告。目前这套源码能支持多少并发(如果短信中心不做限制?
zqqhmily 发表于Wed Dec 08 2010 16:55:14 GMT+0800 (China Standard Time)   举报 回复
林兄请教一个问题,如果某SP需要实时往50个号码上发短信,要求在很短的时间内发完,同时50个号码收到短信后,会马上回复SP一条短信,总共回复50条。在实际的操作中我开两个线程一个线程一直发短信,一个线程一直收短信,但是还是很容易漏掉一些上行短信。请问这种情况下要如何调节收发速度

你可能感兴趣的:(Date,api,Mina,sun,电信,2010)