현재 apache/mod_wsgi에서 제공되는 상당히 복잡한 Django 애플리케이션이 있으며 AWS ELB로드 밸런서 뒤에 여러 AWS EC2 인스턴스에 배포되었습니다. 클라이언트 응용 프로그램은 AJAX를 사용하여 서버와 상호 작용합니다. 또한 서버를 주기적으로 폴링하여 알림 을 검색하고 상태를 업데이트합니다. 폴링을 제거하고 웹 소켓을 사용하여 을 "밀어 넣기"로 바꿔야합니다.웹 소켓을 장고 wsgi와 통합하는 방법
임의의 인스턴스가 클라이언트 에서 웹 소켓 요청을 처리하고 해당 웹 소켓에 보유하고 있기 때문에 우리는 푸시의 소스를 데이터를 제공하는 동일한 인스턴스에하지 않을 수 있습니다 클라이언트에 데이터를 푸시 할 때문에, 우리 데이터를 적절한 인스턴스로 라우팅 한 다음 해당 인스턴스에서 적절한 클라이언트 웹 소켓으로 라우팅하는 방법이 필요합니다.
아파치/mod_wsgi가 웹 소켓과 잘 작동하지 않으며 이러한 구성 요소를 nginx/gunicorn으로 교체하고 gevent-websocket worker를 사용할 계획입니다. 그러나 여러 작업자 프로세스 중 하나 인 이 클라이언트로부터 웹 소켓을 설정하라는 요청을 수신하고 작업자 프로세스의 수명이 프로세스에 의해 제어되는 경우 다른 작업자 프로세스 또는 실제로 비 gunicorn 프로세스는 이러한 웹 소켓에 데이터를 보낼 수 있습니다. 데이터가 오픈 웹 소켓이 다른 사용자에게 전송 될 되어있는 HTTP 요청이 하나의 EC2 인스턴스 (호스트)와 원하는 동작에 관한 것이다 발행 사용자 :
특정 사건이 하나입니다 완전히 다른 인스턴스. 각 인스턴스에서 실행중인 메시지 브로커 (예 : rabbitmq)에 메시지를 보낼 수있는 시스템을 쉽게 상상할 수 있습니다. 웹 소켓을 통해 클라이언트에 연결된 데이터가 포함되어 에 연결됩니다. 그러나이 메시지의 처리기가 어떻게 gunicorn의 작업자 프로세스에서 수신 된 웹 소켓 에 액세스 할 수 있습니까? gevent-websocket 및 작업자가 사용할 수있게 만든 상위 수준의 파이썬 웹 소켓 객체는 절이 될 수 없습니다 (절편을 지원하지 않는 인스턴스 메쏘드). 따라서 작업자 프로세스에서 어느 정도 길게 공유 할 수 없습니다 - 실행, 외부 프로세스.
사실,이 문제의 뿌리는 같은 서버에 핸들러를 클라이언트에서 HTTP 요청에 의해 시작하고 WSGI에 의해 처리하는 웹 소켓 외부 프로세스가 액세스 할 gunicorn 수있는 방법에 온다? 오른쪽 그 gunicorn 작업자 프로세스는 HTTP 요청을 처리하기 위해 의도 된 것입니다. 스레드가 웹 소켓에 걸려 있고 메시지 처리를 지원합니다. 다른 프로세스가있는 웹 소켓에 메시지를 보내려면 다른 프로세스가 필요합니다. 해당 작업자 프로세스를 통해 연결된 입니다.
웹 소켓과 WSGI 기반 HTTP 요청 처리기가 내가 설명한 환경에서 어떻게 상호 작용할 수 있는지 설명 할 수 있습니까?
감사합니다.
하나의 HTTP 요청을 처리 한 결과 서버가 다른 사용자가 동일한 호스트 또는 다른 호스트의 다른 작업자 프로세스에 연결 한 websocket 아래로 푸시 알림을 보내야하는 경우 보내는 작업자는 메시지 (어딘가에 있지만 각 작업자가 가입 한 AMQP 서버)와 수신 작업자 (대상 클라이언트로부터 websocket을 잡고있는 사람)는 대기열에서 메시지를 읽고이를 웹으로 보내야합니다 소켓. 이 아키텍처는 합리적인 아키텍처로 보이나? – eswenson
요청/응답 처리보다 "다른 작업"을 위해 작업자 프로세스를 사용하는 것에 익숙하지 않았지만 사용자가 요청할 수없는 이유가 없다고 말하는 것 같습니다. 권리? – eswenson
WebSocket은 더 이상 간단한 요청/응답 처리를 수행하지 않습니다. 이제 완전한 이중 채널이되었습니다. 마음에 드시면 websocket 연결을 별도의 근로자 풀에 넘길 수 있습니다. 예, 당신이 제안한 것은 정상적인 아치처럼 보입니다. 나에게. :) – Ivo