ZMQ 在 aiohttp 网络服务中崩溃 "randomly"

ZMQ crashes "randomly" in aiohttp web service

我们有一个基于 aiohttp 的 Web 服务,它使用 ZMQ 将工作发送给工作人员并等待结果。我们当然正在使用 ZMQ 事件循环,所以我们可以等待 ZMQ 套接字。 "Sometimes" 进程崩溃,我们得到这个堆栈跟踪:

...
await socket.send(z, flags=flags)
File "/usr/local/lib/python3.5/dist-packages/zmq/eventloop/future.py", line 165, in send
kwargs=dict(flags=flags, copy=copy, track=track),
File "/usr/local/lib/python3.5/dist-packages/zmq/eventloop/future.py", line 276, in _add_send_event
timeout_ms = self._shadow_sock.sndtimeo
File "/usr/local/lib/python3.5/dist-packages/zmq/sugar/attrsettr.py", line 45, in _getattr_
return self._get_attr_opt(upper_key, opt)
File "/usr/local/lib/python3.5/dist-packages/zmq/sugar/attrsettr.py", line 49, in _get_attr_opt
return self.get(opt)
File "zmq/backend/cython/socket.pyx", line 449, in zmq.backend.cython.socket.Socket.get (zmq/backend/cython/socket.c:4920)
File "zmq/backend/cython/socket.pyx", line 221, in zmq.backend.cython.socket._getsockopt (zmq/backend/cython/socket.c:2860)

"Sometimes" 意味着,代码工作正常,如果我只是 运行 它在我的测试机器上。在使用 docker 容器时,我们在极少数情况下遇到了这个问题,但从未能够以可靠的方式重现它。自从我们将容器移至 Kubernetes 集群后,这种情况发生的频率就更高了。有谁知道,上面堆栈跟踪的来源是什么?

aiohttp 不适用于 vanilla pyzmq。 请改用 aiozmq 无循环流。

另见 https://github.com/zeromq/pyzmq/issues/894 and https://github.com/aio-libs/aiozmq/blob/master/README.rst