Есть ли в python -socketio клиент socketio для подключения к поддерживаемым брокерам сообщений? - PullRequest
1 голос
/ 29 марта 2020

Думаю, я искал один из всех модулей python socketio. Затем, когда я начал использовать брокер сообщений с socketio, документация хорошо продемонстрировала использование redis. Однако я нахожу странным, что клиент python -socketio не показал, как подключиться к брокеру сообщений. Это намерение и передать его сторонникам проекта?

Мне пришлось положиться только на python redis, чтобы увидеть, как python -socketio соединяется с redis, при условии, что ему дано дб с адресом. Более того, я обнаружил, что socket.io является каналом по умолчанию для всего этого и выдает больше информации, чем я ожидал.

Ожидается: {'foo': 'bar'}

Observed: { 'method': 'emit', 'event': 'event', 'data': {'foo': 'bar'}, 'namespace': '/ learning_it', 'room': None, 'skip_sid': None , 'callback': Нет, 'host_id': ''}

С этой точки использования модуля, мы должны работать так, как нам нравится?

Спасибо, Мигель Гринберг, от поклонника.

1 Ответ

8 голосов
/ 29 марта 2020

Вы неправильно понимаете роль очереди сообщений.

Давайте на минутку забудем об очереди. У нас есть один или несколько клиентов и только один сервер. Клиенты подключаются к серверу либо через длинный опрос, либо через веб-сокет. Я предполагаю, что это все ясно.

client1 ---+
           |
client2 ---+--- server
           |
client3 ---+

Теперь предположим, что вы хотите масштабировать свой сервер, потому что у вас слишком много клиентов, настолько много, что ваш единственный сервер не может обработать их всех.

Решение состоит в том, чтобы запустить несколько серверов за балансировщиком нагрузки:

client1 ---+                     +--- server1
           |                     |
client2 ---+--- load balancer ---+
           |                     |
client3 ---+                     +--- server2

Пока все хорошо? Проблема с этим решением состоит в том, что каждый из серверов знает только о подмножестве клиентов, поэтому невозможно передать событие всем клиентам. Даже невозможно отправить событие в комнату, так как участники этой комнаты, вероятно, будут случайным образом распределены по разным серверам.

Итак, как я решил эту проблему? Я добавил очередь сообщений, которую все серверы используют для координации рассылок:

client1 ---+                     +--- server1 ---+
           |                     |               |
client2 ---+--- load balancer ---+               +--- pub/sub queue
           |                     |               |
client3 ---+                     +--- server2 ---+

При таком дизайне сервер может отправлять рассылку, отправляя событие подмножеству клиентов, о которых он знает, а затем попросить другие серверы сделать то же самое, опубликовав запрос в очереди.

Полезные нагрузки, которые вы видите на своем сервере Redis, являются внутренними и предназначены для использования серверами, которые являются частью кластера. Очередь не имеет прямого контакта с клиентами.

Надеюсь, это поможет!

...