gpt4 book ai didi

python - ZeroMQ 可靠性?

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:00 27 4
gpt4 key购买 nike

我一直在使用 ZeroMQ 的请求/响应套接字来在 Web 应用程序和用于卸载处理的从属应用程序之间交换消息。我注意到在某些情况下,并不是所有发送的 ZMQ 消息都被另一方实际接收到。更奇怪的是,即使使用 IPC 协议(protocol)也会发生这种情况,我认为该协议(protocol)非常可靠。

发送的消息未送达但未产生任何错误的原因是什么?

这是客户端代码的示例:

# ironic
class ReliableClient(object):
def _reconnect(self):
if self.socket:
self.socket.close()
self.socket = None

self.socket = self.context.socket(zmq.REQ)
self.socket.connect(self.server_url)

# Give the server 2 sec to respond
self.socket.RCVTIMEO = 2000
self.socket.SNDTIMEO = 2000

self.socket.LINGER = 3

def __init__(self, server_url=None, server_name=None):
self.socket = None
self.server_url = server_url

if server_name is None:
self.server_name = server_url
else:
self.server_name = server_name

self.lock = threading.Lock()
self.context = zmq.Context()

self._reconnect()

def msg(self, msg):
raw_out = dumps(msg)

# send
self.lock.acquire()
try:
self.socket.send(
raw_out,
copy=True
)
except zmq.ZMQError as ex:
log.exception(ex, '%s: failed to send', self.server_name)
self.lock.release()
raise CommunicationError('failed to send')

# receive
try:
raw_in = self.socket.recv()
except zmq.ZMQError as ex:
log.exception(ex, '%s: failed to receive', self.server_name)
raise CommunicationError('failed to receive')
finally:
self.lock.release()

msg_in = loads(raw_in)

return msg_in

最佳答案

我不熟悉 IPC 协议(protocol),但我广泛使用过 ZMQ/TCP。

如果您使用得当,即使是最简单的基于 TCP 的 ZMQ REQ/REP 模式也绝不会丢弃消息。如果您的网络连接或远程端点出现故障,它可能会无限期挂起,但它永远不会无提示地失败。某些套接字在设计上会在某些情况下丢弃消息。例如,有些可能会在达到 HWM 时丢弃消息。

关于python - ZeroMQ 可靠性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18236368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com