Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 零MQ可靠性?_Python_Zeromq - Fatal编程技术网

Python 零MQ可靠性?

Python 零MQ可靠性?,python,zeromq,Python,Zeromq,我一直在使用ZeroMQ的请求/响应套接字,以便在web应用程序和用于卸载处理的从属应用程序之间交换消息。我注意到,在少数情况下,并非所有发送的ZMQ消息都被对方接收。更奇怪的是,即使使用了IPC协议,这种情况也会发生,我认为这是非常可靠的 在不产生任何错误的情况下,发送的消息未被传递的原因是什么 以下是客户端代码的示例: 是什么原因导致发送的消息无法传递, 而不产生任何错误 如果您正在使用ROUTERsockets将消息从服务器传递到zmq工作进程,默认情况下,ROUTERs将删除任何无法传递

我一直在使用ZeroMQ的请求/响应套接字,以便在web应用程序和用于卸载处理的从属应用程序之间交换消息。我注意到,在少数情况下,并非所有发送的ZMQ消息都被对方接收。更奇怪的是,即使使用了IPC协议,这种情况也会发生,我认为这是非常可靠的

在不产生任何错误的情况下,发送的消息未被传递的原因是什么

以下是客户端代码的示例:

是什么原因导致发送的消息无法传递, 而不产生任何错误

如果您正在使用
ROUTER
sockets将消息从服务器传递到zmq工作进程,默认情况下,
ROUTER
s将删除任何无法传递的出站消息。“不能交付”是什么意思?路由器维护客户端身份到客户端连接的内部映射,并且由于路由器上的所有消息都有一个由客户端提供或由路由器自动分配的身份,因此任何没有相应的路由连接的出站消息都将被无声地丢弃

您可以通过告诉路由器报告无法传递的消息来确定这种情况何时发生,换句话说,路由器在无法传递消息时会生成错误。在Java中,方法是
routerSocket.setRouterMandatory(true)
,您只需要找到与此对应的python(我不是py人,哈哈)

如果您确定路由器正在丢弃消息,那么问题就变成了为什么?在我的例子中,我有一个zmq客户机,它在不同的线程上发送和接收服务器消息,而接收线程的连接速度不够快,无法从服务器获得初始的“Ok”响应,因此这只是客户机中的一个时间问题

希望有帮助

是什么原因导致发送的消息无法传递, 而不产生任何错误

如果您正在使用
ROUTER
sockets将消息从服务器传递到zmq工作进程,默认情况下,
ROUTER
s将删除任何无法传递的出站消息。“不能交付”是什么意思?路由器维护客户端身份到客户端连接的内部映射,并且由于路由器上的所有消息都有一个由客户端提供或由路由器自动分配的身份,因此任何没有相应的路由连接的出站消息都将被无声地丢弃

您可以通过告诉路由器报告无法传递的消息来确定这种情况何时发生,换句话说,路由器在无法传递消息时会生成错误。在Java中,方法是
routerSocket.setRouterMandatory(true)
,您只需要找到与此对应的python(我不是py人,哈哈)

如果您确定路由器正在丢弃消息,那么问题就变成了为什么?在我的例子中,我有一个zmq客户机,它在不同的线程上发送和接收服务器消息,而接收线程的连接速度不够快,无法从服务器获得初始的“Ok”响应,因此这只是客户机中的一个时间问题


希望这有帮助

我不熟悉IPC协议,但我已经广泛使用了ZMQ/TCP


如果正确使用,即使是TCP上最简单的ZMQ REQ/REP模式也不会丢弃消息。如果您的网络连接或远程端点发生故障,它可能会无限期挂起,但它永远不会自动失败。在某些情况下,某些套接字在设计上会丢弃消息。例如,一些可能在到达HWM时丢弃消息。

我不熟悉IPC协议,但我已经广泛使用ZMQ/TCP


如果正确使用,即使是TCP上最简单的ZMQ REQ/REP模式也不会丢弃消息。如果您的网络连接或远程端点发生故障,它可能会无限期挂起,但它永远不会自动失败。在某些情况下,某些套接字在设计上会丢弃消息。例如,当到达HWM时,一些可能会丢弃消息。

如果保证两个系统始终处于活动状态(24X7),或者只有在两个系统处于活动状态时才应发送消息,则ZeroMQ可以作为一种很好的方式在系统之间传输小事件,作为一种很好的选项

由于订户速度较慢,ZeroMQ发布子模式在发送大量消息时出现问题,并且在中间开始丢失消息。 后来,我们转向ActiveMQ嵌入式代理模式,该模式将消息保存在内存中,直到消费者使用它们。ZeroMQ的好处是,即使并没有发布服务器,或者发布服务器稍后会出现,也可以启动订阅服务器


活动MQ的限制,在生产者创建队列之前,无法启动使用者从队列读取。它显然会抛出异常。我们还可以同时使用这两个库并充分利用它们。

如果保证两个系统始终处于活动状态(24X7),或者只有在两个系统处于活动状态时才应发送消息,则ZeroMQ可以作为一种很好的方式在系统之间传输小事件,作为一种很好的选择

由于订户速度较慢,ZeroMQ发布子模式在发送大量消息时出现问题,并且在中间开始丢失消息。 后来,我们转向ActiveMQ嵌入式代理模式,该模式将消息保存在内存中,直到消费者使用它们。ZeroMQ的好处是,即使并没有发布服务器,或者发布服务器稍后会出现,也可以启动订阅服务器


活动MQ的限制,在生产者创建队列之前,无法启动使用者从队列读取。它显然会抛出异常。我们也可以同时使用这两个库并充分利用它们。

我并不是说这个问题离题了。但在任何产品中使用zmq之前,您确实应该至少阅读本手册的前五章
# 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