在工作人员之间发送Aiohttp Websocket消息

时间:2018-05-24 04:57:43

标签: python-3.x websocket web-worker aiohttp

Aiohttp有很棒的websocket支持:

# dictionary where the keys are user's ids, and the values are websocket connections
users_websock = {}

class WebSocket(web.View):
async def get(self):
    # creating websocket instance
    ws = web.WebSocketResponse()
    await ws.prepare(self.request)
    users_websock['some_user_id'] = ws
    async for msg in ws:
        # handle incoming messages

现在当我需要向特殊用户发送消息时:

# using ws.send_str() to send data via websocket connection
ws = users_websock['user_id']
ws.send_str('Some data')

只要我只有一名服务器工作人员,那就很好。但在生产中我们总是有多个工人。当然,每个工人都有自己不同的users_websock字典。

因此,当我们需要从 worker 1 向连接到 worker 2 的某个用户发送消息时,会出现实际问题。

问题是我应该如何以及在何处存储websocket连接列表,以便每个工作人员都能获得必要的连接?

也许我可以在DB中存储一些连接id或者什么来创建websocket实例?

或者还有另一种方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

aiohttp不提供进程间/节点间通信通道,它是另一个与HTTP处理本身无关的大而有趣的区域。

您需要工人之间的渠道。它可以是Redis pubsub,RabiitMQ甚至websockets - 取决于您的库。 或者像https://crossbar.io/

这样的工具

没有一种解决方案可以涵盖所有可能的情况。