我正在RedHat / C中使用一个名为SMPP的协议构build一个networking应用程序,这个协议正被电信用来发送短信。
我正在发送消息(〜70 SMS /秒)到服务器,我必须等待几秒钟,成功的响应和删除消息,但如果消息超时,那么我必须重新发送消息到服务器。
问题是如何devise一些东西来重试过期的消息?
在SMPP规范中有一个名为sequence_number的标识符 – 对于每个请求,这应该是单调递增的,并且从服务器返回的响应将具有它所响应的请求的sequence_number。
如果你等了一会儿(也许10秒,也许更长),你没有得到你的回应,你可以重新发送请求与相同的sequence_number和服务器应该发现它是一个重复,如果它确实收到它第一次; 如果它没有收到它,那么它将把它作为一个新的请求。
服务器也可能向你的客户提出请求; 例如这里是一个送货单,或者这里是一个移动发起的消息 – 它也会有它自己的sequence_number计数器,你应该确认它的请求的响应具有相同的序列号。 你应该跟踪你看到的序列号,这样你可以告诉你是否有重复的请求。
这个属性叫做http://en.wikipedia.org/wiki/Idempotence ,如果你正在实现电信协议,你应该熟悉这个属性。
为了获得70 msgs / sec,您可能需要使用滑动窗口http://en.wikipedia.org/wiki/Flow_control_(data)#Sliding_Window建立在Idempotence之上,因此您可以有最多N(也许10)请求未决,你仍然在等待响应确认 – 除非你非常接近SMPP服务器,延迟非常低。
做正确的SMPP不是微不足道的,我会建议你阅读SMPP v3.4规范前面,然后你太过于执行。
你所要求的并不是很清楚,所以答案也可能不是很精确。
我会建议看看这是如何实施一些现有的解决方案。 我已经与kannel和mbuni(这是MMS的),我建议看一看kannel特别。
Kannel基本上是开源的短信网关,并且有SMPP的支持。
再看看这个 stackoverflow线程,这也可能有助于理解一些想法。