У нас есть значительно сложное приложение Django, которое в настоящее время обслуживается apache/mod_wsgi и развернуто на нескольких экземплярах AWS EC2 за балансировщиком нагрузки AWS AWS. Клиентские приложения взаимодействуют с сервером с использованием AJAX. Они также периодически опросают сервер для получения уведомлений и обновляют их состояние. Мы хотим удалить опрос и заменить его «push», используя сетевые розетки.Как интегрировать сетевые сокеты с django wsgi
Поскольку произвольные экземпляры обрабатывать веб-сокетов запросов от клиентов и держать на этих веб-сокетов, и потому, что мы хотим, чтобы передавать данные на клиентов, которые не могут быть в одном экземпляре, который обеспечивает источник данные для толчка, мы нужен способ маршрутизации данных в соответствующий экземпляр , а затем из этого экземпляра в соответствующий клиентский веб-узел .
Мы понимаем, что апач/mod_wsgi не играют хорошо с веб-сокеты и план, чтобы заменить эти компоненты с Nginx/gunicorn и использовать GEvent-WebSocket работника. Однако, если один из нескольких рабочих процессов получает запросы от клиентов, чтобы установить веб-сокет, а если срок службы рабочих процессов контролируется основным процессом пушки-стрелка , неясно, как другие рабочие обрабатывают, или фактически процессы без пушки могут отправлять данные в эти сетевые сокеты.
Конкретный случай это: Пользователь, который выдает запрос на HTTP является направлен в одну EC2 экземпляра (хост) и желаемое поведение является то, что данные для отправки другого пользователя, который имеет веб-сокет открыт в полностью различных экземпляров. Можно легко представить систему, в которой брокером (например, rabbitmq), запущенным на каждом экземпляре, может быть отправлено сообщение , содержащее данные, которые должны быть отправлены через веб-сокеты, к клиенту, подключенному к этому экземпляру, подключенному . Но как обработчик этих сообщений может получить доступ к веб-сокете, который был получен в рабочем процессе с пушкой? Объекты веб-сокета высокого уровня python, созданные gevent-websocket и , которые доступны для работника, не могут быть маринованными (они являются экземплярами методов без поддержки травления), поэтому их невозможно легко разделить рабочим процессом на некоторое время - внешний, внешний процесс.
В самом деле, корень этого вопроса сводится к тому, как можно веб-сокеты , которые инициируются посредством HTTP-запросами от клиентов и обрабатываются WSGI обработчиков в серверах, такие как gunicorn доступа внешних процессов? Не кажется правым, что рабочие рабочих-пулеметчиков, , которые предназначены для обработки запросов HTTP, будут запускать длинные потоки , чтобы вставлять их в веб-сокеты и поддерживать обработку сообщений от других процессов для отправки сообщений в веб-сокеты, которые прилагается через эти рабочие процессы.
Может ли кто-нибудь объяснить, как веб-сокеты и HTTP-запрос на основе WSGI могут взаимодействовать с обработчиками в среде, которую я описал?
Спасибо.
Если в результате обработки одного HTTP-запроса серверу необходимо отправить push-уведомление по веб-расписанию, которое другой пользователь подключил к другому рабочему процессу на одном и том же хосте или другом хосте, отправляющий рабочий должен поставить в очередь сообщение (где-то, но, возможно, на сервер AMQP, на который подписаны каждый работник), и получающий работник (тот, кто держит веб-кластер от целевого клиента) должен будет прочитать сообщение из очереди и отправить его по сети разъем. Это похоже на разумную архитектуру? – eswenson
Мне не понравилось использование рабочих процессов для «другой работы», чем обработка запросов/ответов, но вы, кажется, говорите, что нет причин, по которым они не могли. Правильно? – eswenson
Хорошо, что websocket больше не выполняет простую обработку запроса/ответа, не так ли? Теперь это полнодуплексный дуплексный канал. Вы могли бы связать сетевые соединения с отдельными пулами работников, если хотите. Да, то, что вы предложили, похоже на нормальную арку. мне. :) – Ivo