Отправка сообщений Aiohttp Websocket между работниками - PullRequest
0 голосов
/ 24 мая 2018

Aiohttp имеет отличную поддержку веб-сокетов:

# 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 везде?

Или есть другой способ приблизиться к этому?

1 Ответ

0 голосов
/ 24 мая 2018

aiohttp не предоставляет каналы связи между процессами и междоузлиями, это еще одна большая и интересная область, не связанная с самой обработкой HTTP.

Вам нужны каналы между вашими работниками.Это может быть Redis Pubsub, RabiitMQ или даже веб-сокеты - в зависимости от вашей библиотеки.Или такие инструменты, как https://crossbar.io/

Не существует единого решения, охватывающего все возможные случаи.

...