我正在使用与Flask-SocketIO集成的zmq应用程序。该应用程序的基本前提是Flask-SocketIO Web服务器接收zmq消息,然后将该zmq消息转换为SocketIO消息,该消息将被发送到客户端(浏览器)。我有应用程序工作,但不完全是我希望它工作的方式。
zmq事件侦听器需要位于与主服务器进程不同的进程上。我能够将Redis和RabbitMQ都用作message queue for facilitating SocketIO emits from non-server processes。太好了。那有什么问题?
问题是我真的想将zmq用作消息队列而不是Redis或RabbitMQ,因为我已经在我的应用程序中集成了zmq。所以我在Flask-SocketIO文档中读到Kombu是支持其他类型消息队列的机制。好的。但后来我注意到zmq作为传输已从the latest release of Kombu中删除。据我所知,这只是一个传输选项,如Kombu 3.0.37中所示。
我的第一种方法是尝试通过Kombu 3.0.37将zmq作为消息传输,但这不起作用。我仍在努力确定原因。但是在看了the source code之后我现在最好的猜测是,多个进程正在尝试在同一个端口上打开一个PULL套接字,即使在一个简单的独立示例中也是如此。这是有道理的。在这方面,我的下一步是独立于zmq传输代码手动创建一个PULL套接字,并以某种方式将其作为一种单独的类型传递给zmq传输代码使用。
我正在使用的另一种方法是让zmq作为Hello World Kombu example中的传输工作。我用zmq+tcp://localhost
替换了示例代码中的连接字符串。这就是我不明白如何使用zmq作为消息队列传输的地方。如果我运行发布者代码,我可以发送消息。但是当我几秒钟后运行客户端代码时,它说队列是空的。这让我觉得为了让zmq作为传输工作,我可能需要某种外部zmq消息代理,我假设我需要自己组装。但我还没有理解这将如何发挥作用。
有什么建议吗?试图追求zmq作为交通工具是浪费时间,还是应该继续走这条路? Miguel Grinberg(Flask-SocketIO的作者)慷慨地提供了some direction,但我想稍微分析一下,看看是否还有其他人对此事有所了解。