ZMQ中的重连机制

zmq中以TCP方式传输,会有各种中断情况。

Zmq的connect就会自动重连,所以不需要关心连接的问题。

这里说的连接断开是正常的断开,有4次挥手的断开,也就是说通信双方都知道连接断开了。

但有时,并非如此。在复杂的网络环境中,通信双方大概率会经过NAT等网络设备,它们会悄无声息地关闭连接。并且,在长连接长时间无数据时,通信双方根本无法知晓。

很简单,为了保持网络连接,增加心跳即可。应用层的心跳也简单,但根据ZMQ文档,最好使用TCP的keepalive。

// 创建上下文环境
ZContext context = new ZContext(1);
// 以订阅模式创建套接字
ZMQ.Socket socket = context.createSocket(SocketType.SUB);
// 开启TCP保活机制,防止网络连接因长时间无数据而中断
socket.setTCPKeepAlive(1);
// 网络连接空闲2min, 即发送保活包
socket.setTCPKeepAliveIdle(120L);

TCP keepalive属性就是要保持TCP连接的活动性。对于一个已经建立的tcp连接。如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 keepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有收到应答,则发送rst包关闭连接。若收到应答,则将计时器清零。

如果tcp连接的另一端突然掉线,或者重启断电,这个时候我们并不知道网络已经关闭。而此时,如果有发送数据失败,tcp会自动进行重传。重传包的优先级高于keepalive,那就意味着,我们的keepalive总是不能发送出去。 而此时,我们也并不知道该连接已经出错而中断。在较长时间的重传失败之后,我们才会知道。

但如果对端又启动了,接收端还在发重传包,此时则不会重连,导致数据丢失。

// 设置发送ZMTP心跳的时间间隔, 单位:ms
socket.setHeartbeatIvl(5 * 60 * 1000);
// 设置ZMTP心跳的超时时间, 单位:ms
socket.setHeartbeatTimeout(60 * 1000);
// 设置ZMTP心跳的TTL值, 单位:ms
socket.setHeartbeatTtl(10 * 60 * 1000);

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值