首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ZeroMQ:即使在设置HWM和bufsize之后也会丢失数据包

ZeroMQ:即使在设置HWM和bufsize之后也会丢失数据包
EN

Stack Overflow用户
提问于 2017-05-03 23:56:52
回答 1查看 1.1K关注 0票数 2

我们在ZeroMQ中使用的是一种ZeroMQ可扩展的正式通信模式。发送者应用程序共发送30,000条消息,每个10 of。有很多数据丢失,因此我们在发送方设置了以下内容:

代码语言:javascript
复制
zmq_socket = context.socket(zmq.PUSH)
zmq_socket.setsockopt(zmq.SNDBUF, 10240)
zmq_socket.setsockopt(zmq.SNDHWM, 1)
zmq_socket.bind("tcp://127.0.0.1:4999")

在接收方:

代码语言:javascript
复制
zmq_socket = context.socket(zmq.PULL)
zmqSocket.setReceiveBufferSize(10240);
zmqSocket.setRcvHWM(1);
zmq_socket.connect("tcp://127.0.0.1:4999")

仍然有数据丢失。不知道如何才能避免数据包被悄悄丢弃。

编辑1:

Python的发件人代码:

代码语言:javascript
复制
context = zmq.Context()
zmq_socket = context.socket(zmq.PUSH)
zmq_socket.setsockopt(zmq.SNDBUF, 10240)
zmq_socket.setsockopt(zmq.SNDHWM, 1)
zmq_socket.bind("tcp://127.0.0.1:4999")

for file_name in list_of_files:              # Reads data from a list of files:
    while True:                              #       data from a file_name
          with open(os.path.join(self.local_base_dir,file_name), 'r') as sf:
               socket_data = sf.read(5120)
               if socket_data == '':
                  sf.close()
                  break                      #       until EoF

               ret = zmq_socket.send(socket_data)

               if ret == 0:
                  return True

               if ret == -1:
                  print zmq_errno()

接收机代码

代码语言:javascript
复制
    private ZMQ.Socket zmqSocket = zmqContext.socket(ZMQ.PULL);       
    zmqSocket.setReceiveBufferSize(10240);
    zmqSocket.setRcvHWM(1);
    zmqSocket.connect(socketEndpoint);
    String message = new String(zmqSocket.recv());
    messages.add(message);
EN

回答 1

Stack Overflow用户

发布于 2017-05-09 11:53:54

使用ZMQ_IMMEDIATE标志可以防止在没有已完成连接的管道中排队的消息丢失。

来自http://api.zeromq.org/4-2:zmq-setsockopt#toc21

只发送到已完成连接的ZMQ_IMMEDIATE**:队列消息** 默认情况下,即使连接尚未完成,队列也会填充传出连接。这可能导致在具有循环路由(REQPUSHDEALER)的套接字上“丢失”消息。如果此选项设置为1,则消息将只在已完成的连接上排队。如果没有其他连接,这将导致套接字阻塞,但将防止队列在等待连接的管道上填充。选项值类型int选项值单位布尔默认值0 (false)适用的套接字类型全部,只适用于面向连接的传输。

代码语言:javascript
复制
zmq_socket.setsockopt(zmq.ZMQ_IMMEDIATE, 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43771830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档