我是否需要祈祷没有两个独立的应用程序在通信RabbitMQ的同时使用相同的通道以防止"管道错误"? (或者说线程与两个或多个独立的应用程序不同?)
我已经编写了一些应用程序,其中一个(io-server)从我的其他应用程序的角度来看就像服务器一样,从RabbitMQ服务器的角度来看就像客户端一样。
现在,一切都按预期工作了大约10分钟。然后,我的io-server崩溃了。这是追溯的最后一部分:
File "/usr/local/lib/python2.7/dist-packages/amqp-1.4.2-py2.7.egg/amqp/transport.py", line 163, in write_frame
frame_type, channel, size, payload, 0xce,
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 32] Broken pipe
以下是RabbitMQ日志的相关部分:
=ERROR REPORT==== 31-Mar-2014::12:29:53 ===
AMQP connection <0.22183.0> (running), channel 1 - error:
{amqp_error,unexpected_frame,
"expected content header for class 60, got non content header frame instead",
'basic.publish'}
=INFO REPORT==== 31-Mar-2014::12:30:23 ===
closing AMQP connection <0.22183.0> (127.0.0.1:43367 -> 127.0.0.1:5672)
就我可以搜索网络而言,最有希望的答案是here:
...
So yes, RabbitMQ closes the connection due to a connection-level error
with frame interleaving.
...
* Avoid publishing on *the same* channel from multiple threads
* Synchronize publishing in your own code
我可以让我的应用程序同步发布。但是,如何保证我的所有应用程序同步运行?我真的需要吗?
答案 0 :(得分:0)
我是否需要为没有两个独立的应用程序使用相同的应用程序而祈祷 频道
不。此处的“通道”表示您共享的链接表示共享的Channel
对象。如果不同的应用程序(进程)不共享内存,则每个应用程序(进程)将始终具有不同的通道。
线程不同于拥有两个或多个独立线程 应用程序?
是的。您使用的amqp库不是线程安全的。如果您在“ IO服务器”中的不同线程之间共享Channel()
对象,则会出现问题。但是,如果您的服务器是单线程的并且您运行许多并行实例,这将不是问题。
我建议您保持简单,不要在服务器应用程序中使用线程。假设您的IO服务器接受其他应用程序的HTTP连接;依靠nginx + uwsgi接受并行请求。
答案 1 :(得分:0)
我已经遇到了这个确切的问题,并且(如@istepaniuk)指出这与线程相关。您不能在多个线程中重用同一连接,您必须为每个线程打开1个连接。