2011-10-16 2 views
1

편집 확인 장고보기와 대화하는 자바 스크립트에서 긴 폴링이 있습니다. 보기는 다음과 같습니다. 채널에있는 redis 클라이언트에서 게시 한 일부 메시지가 손실됩니다. 또한 모든 요청에 ​​대해 redis에 연결해서는 안됩니다. (아마도 redis 변수는 세션에 저장할 수 있습니까?) 누군가가 변경 사항을 지적 할 수 있으면이 포럼을 긴 폴링으로 작동시키는 데 필요합니다. 고맙습니다! redis 수신 대기중인 웹 URL 만들기 pubsub 게시 된 메시지

def listen (request): 
     if request.session: 
      logger.info('request session: %s' %(request.session)) 
     channel = request.GET.get('channel', None) 
     if channel: 
      logger.info('not in cache - first time - constructing redis object') 
      r = redis.Redis(host='localhost', port=6379, db=0) 
      p = r.pubsub() 
      logger.info('subscribing to channel: %s' %(channel)) 
      p.psubscribe(channel) 
      logger.info('subscribed to channel: %s' %(channel)) 
      message = p.listen().next() 
      logger.info('got msg %s' %(message)) 

      return HttpResponse(json.dumps(message)); 

     return HttpResponse('') 

---- 원래의 질문 --- 내가 (장고, 파이썬을 사용) 채팅 응용 프로그램을 만들려고하고 폴링 메커니즘을 피하기 위해 노력하고 있습니다. 나는 지금 이걸로 고투하고있다 - 그래서 어떤 포인터 정말 감사하겠습니다!

웹 소켓은 대부분의 브라우저에서 지원되지 않으므로 긴 폴링이 올바른 선택이라고 생각합니다. 바로 지금은 일반 폴링보다 잘 확장되고 Python django 스택과 쉽게 통합 할 수있는 무언가를 찾고 있습니다. 이 개발을 마치면 다른 파이썬 프레임 워크 (토네이도 트위스터, gevent 등)를 염두에 둡니다.

나는 약간의 연구를했고 redis pubsub 메커니즘을 좋아했습니다. 채팅 메시지는 두 사용자가 이미 구독 한 채널에 게시됩니다. 롱 폴링은 곧 프로세스/스레드 한계로 실행하는 것이기 때문에 내가 이해에서

  1. 는 아파치 잘 확장되지 것입니다 : 다음은 내 질문입니다. 따라서 나는 nginx로 전환하기로 결정했습니다. 이 이론적 근거가 맞습니까? 또한 내가 걱정하는 nginx에 관련된 모든 문제가 있습니까? 특히, 블로그 게시글 http://www.letseehere.com/reverse-proxy-web-sockets에서 언급 한 것처럼 프록시 통과에 대한 http 1.1을 지원하지 않는 최신 버전이 걱정됩니까?

  2. 브라우저 쪽에서 메시지 구독의 클라이언트 부분을 어떻게 만듭니 까? 내 마음 속에, 그것은 javascript 코드가 "long poll"하는 url이 될 것입니다. 자바 스크립트 레벨에서 클라이언트는 서버 측에서 "비 차단 방식"으로 "차단"되는 URL을 폴링합니다. 결과 (이 경우 새 채팅 메시지)가 나타나면 서버는 결과를 반환합니다. Javascript는 같은 URL을 폴링하고 다시 폴링해야합니다. 이 생각이 맞습니까? 자바 스크립트 루프가 일시 중지되는 간격 사이에 어떤 일이 발생합니까? 서버 측에서 모든 메시지를 잃어 버릴 수 있습니다. 그것을 나중에 통합이 용이 - 또한 레디 스 - CLI를 사용할 수 있습니다 (

    레디 스에서
    1. , I는 채널 "foo는"에 메시지를 게시 :

    은 본질적으로, 나는 다음과 같은 만들려면 python/django에서)

  3. 같은 js 코드를 사용하여 두 개의 브라우저 창에 동일한 메시지를 표시하려고합니다. 브라우저 코드가 테스트 용 채널 이름을 알고 있다고 가정합니다.

  4. 다시 두 개의 브라우저 창에 나타나는 두 번째 메시지를 게시합니다.

실시간 응용 프로그램에 익숙하지 않으므로 이해가되지 않는 질문에 사과드립니다.

감사합니다.

답변

0

질문에 부분적으로 대답하고 많은 옵션 중 하나만 언급하면 ​​: 비동기 작업자 클래스와 함께 사용되는 Gunicorn은 설치가 쉽고 긴 폴링/비 차단 요청에 대한 솔루션입니다!

+0

thanx! 나는 간단히 gunicorn을 읽었다. 나는 그것을 다시 읽고있다. 위에서 언급 한 것처럼 "메시지 수신"요청의 http 끝 부분에있는 부분을 작성하는 경우 어떻게 장고 코드가 생깁니 까? 그것은 이미 작성된 다른 장고 코드에 어떤 영향을 미칩니 까? –

관련 문제