2013-02-28 1 views
8

현재 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 요청 처리기가 내가 설명한 환경에서 어떻게 상호 작용할 수 있는지 설명 할 수 있습니까?

감사합니다.

답변

0

그것은 웹 소켓에 메시지를 보낼 웹 소켓과 다른 프로세스의 지원 처리 메시지에 응답하지 스레드 장기 실행 산란 것이다 HTTP 요청을 처리하기위한 것입니다 작업자 프로세스를 gunicorn 권리를 보이지 않는 이러한 작업자 프로세스를 통해 연결되었습니다.

왜 안 되니? 이것은 결국 장기 실행 연결입니다. 그러한 연결을 처리하는 장기 실행 스레드는 나에게 절대적으로 자연 스러울 것 같습니다.

종종 이러한 상황에서 쓰기는 읽기와 별도로 처리됩니다.

현재 웹 소켓 연결을 처리하고있는 작업자는 관련 메시지가 메시징 서버에서 내려 와서 websocket을 전달할 때까지 기다릴 것입니다.

원하는 경우 geent의 비동기식 대기열을 사용하여 코드 내 메시지 전달을 처리 할 수도 있습니다.

+0

하나의 HTTP 요청을 처리 한 결과 서버가 다른 사용자가 동일한 호스트 또는 다른 호스트의 다른 작업자 프로세스에 연결 한 websocket 아래로 푸시 알림을 보내야하는 경우 보내는 작업자는 메시지 (어딘가에 있지만 각 작업자가 가입 한 AMQP 서버)와 수신 작업자 (대상 클라이언트로부터 websocket을 잡고있는 사람)는 대기열에서 메시지를 읽고이를 웹으로 보내야합니다 소켓. 이 아키텍처는 합리적인 아키텍처로 보이나? – eswenson

+0

요청/응답 처리보다 "다른 작업"을 위해 작업자 프로세스를 사용하는 것에 익숙하지 않았지만 사용자가 요청할 수없는 이유가 없다고 말하는 것 같습니다. 권리? – eswenson

+0

WebSocket은 더 이상 간단한 요청/응답 처리를 수행하지 않습니다. 이제 완전한 이중 채널이되었습니다. 마음에 드시면 websocket 연결을 별도의 근로자 풀에 넘길 수 있습니다. 예, 당신이 제안한 것은 정상적인 아치처럼 보입니다. 나에게. :) – Ivo

1

나는 mod_wsgi + websockets가 엉뚱한 조합임을 올바른 평가라고 생각한다.

웹 소켓으로 인해 모든 wsgi 작업자가 눈에 띄고 작업자 풀의 크기를 대폭 늘리려고하면 메모리 사용량 및 컨텍스트 전환으로 인해 서버가 중단 될 수 있습니다.

동기식 wsgi 작업자 아키텍처 (gevent, twisted, tornado 등으로 구현 된 반작용 접근 방식과 반대)를 좋아한다면 uWSGI를 응용 프로그램 서버로 조사하는 것이 좋습니다. 최근 버전에서는 이전 URL에서 일부 URL을 처리 할 수 ​​있습니다 (예 : 기존 장고보기는 이전과 동일하게 작동 함). 다른 URL을 비동기 websocket 처리기로 라우팅합니다. 이는 비교적 원활한 마이그레이션 경로 일 수 있습니다.

+0

우리는 HTTP 프록시로 NGINX를 사용하고 gunicorn (django) 또는 nodejs를 프록시로 사용하는 모델로 전환했습니다. nodejs 앱이 웹 소켓을 처리합니다. 우리는 곧 gunicorn에서 벗어나 uWSGI를 시도 할 수 있습니다. 성능이 더 좋아질 것으로 믿기 때문입니다. 우리가 파이썬/장고로 웹 소켓 지원을 되돌릴 지 여부는 우리가 실제로 그렇게하는 것이 많은 이점이 있다고 생각하는지 여부에 달려 있습니다. Nodejs 지금이 websocket 연결을 처리하는 것 같습니다. – eswenson

관련 문제