Zeromq自连接错误
(金庆的专栏)
Zeromq消息中间件开发的服务器和客户端不必按顺序启动,客户端可以在服务器开启之前启动。这是Zmq特别好用的一大特性。利用该特性,网游各功能服务器可以任意重启,实现出错自动重启,不停服升级等功能。
而按传统网络连接方式,网游服务器组内部担任内部服务器的进程重启,必须同时重启其客户端进程,不然他们之间的TCP连接将保持断开状态。例如数据库代理进程是个服务进程,其他所有进程都是它的客户端进程,所以数据库代理重启时,其他进程也需要重启,数据库代理进程必须早于其他进程启动。如果没有这种顺序限制,数据库代理进程就可以任意重启,随时升级而不停服。
但是也发现因此产生一个错误。客户端进程和服务器进程在同一台机器上时,如果不开服务,先开客户端进程,过上较长一段时间后,发现客户端进程与自身建立了一个连接。netstat显示如:
tcp 127.0.0.1:34567 127.0.0.1:34567 ESTABLISHED
本地端口号和远端端口号相同,即为服务端口。并且之后启动服务器进程将会失败,因为端口已被占用。客户端将收到自己发送的数据。
这是因为客户端不断使用随机本地端口连接服务端口,连接不断失败,本地端口不断变化,直至本地端口等于服务端口。此时将产生上述自连接。
已提交建议主动断开自连接:
https://zeromq.jira.com/browse/LIBZMQ-549
连接时发现本地端口等于服务端口,就断开,换个本地端口重新连接,这样就不会有自连接了。
如果服务进程在不同机器上,就不会有自连接。或者服务端早启动也不会出错。并且随机到自连接的时间较长,一般会在这之前就启动服务。
相关文章
- 性能压测过程中常见连接错误分析
- 使用云服务器配置MariaDB环境,Navicat远程连接一直出错误代码 "2002 - Can't connect to server on '' (10060)"
- Oracle 9i的OEM连接10g的服务器,报“您必须具有SELECT ANY DICTIONARY权限才能运行此应用程序。请要求DBA为您授予此权限。”的错误
- 如何修复ZeroMQ发行者c++中的运行时错误
- 尝试上传重图片时,“连接已重置”浏览器错误
- Navicat premium连接Oracle报ORA-12545错误
- rtmp连接服务器失败(一个低级错误)
- 新建维护计划提示枚举包时出现 OLE DB 错误 0x80004005 (客户端无法建立连接)。已发出一条 SQL 语句,但已失败。
- https调用出现【基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系】错误
- Navicat Premium连接MySQL 1251错误