解决SGIP1.2无心跳问题的思路
联通SGIP最后的版本是1.2。SP和SMG之间没有心跳包定义。
SP提交给SMG只能是Submit或Trace。
没有心跳,就无法实现长连接。连接不断断开->连接->断开->连接。
对MQ消费类消息发送,控制难度大。很可能刚断开,就有MQ消息待消费,导致消息发送失败,需要重试,导致消息发送产生延迟。
一、困境:
(1)SP提交给SMG只能是Submit或Trace。


(2)Trace估计在Bind LoginType==11才起作用。在LoginType=1或LoginType=2没有Trace

(3)Trace_Resp延迟较大。

SGIP协议的定义明显存着不足,如何解决?
二、解决方法:
可以考虑采用心跳机制,发送BindRequest,或BindResp,或TraceRequest,但需要验证是否可行

(1)TraceRequest:测试到还是会断开。走不通
(2)BindRequest:测试到可以,基本解决了问题。副作用:由于没有收到BindResponse,导致重发
SgipBindRequestMessage msg = new SgipBindRequestMessage();msg.setLoginType((short)1);ctx.channel().writeAndFlush(msg);
(3)BindResponse:测试到某些机器可行!!!
private AtomicLong counter = new AtomicLong(0);
SgipBindResponseMessage msg = new SgipBindResponseMessage();msg.setSequenceNo((int) counter.incrementAndGet());ctx.channel().writeAndFlush(msg);
三、结论
BindRequest一定能解决问题,就是会重发。
部分机器发送BindResponse能解决问题。部分不行。
