2012-10-22 9 views
5

때문에 세션의 XHR 폴링 전송에 실패합니다. 그렇지 않으면 IE (등)에 대한 XHR 폴링을 강제로 해요 웹 소켓을 사용하고 있습니다.여러 노동자 나는 현재 작업자 <strong>socketio.sgunicorn.GeventSocketIOWorker</strong>를 사용하여 gunicorn 서버와 다수의 근로자에 ​​걸쳐 <a href="https://github.com/abourget/gevent-socketio" rel="nofollow">gevent-socketio</a>을 확장하기 위해 노력하고있어

XHR 폴링은 다음 폴링을 추적하기 위해 세션을 필요로하지만 한 명에서 두 명 이상의 직원으로 이동하자마자 요청이 분산되어 상태가 손실되고 모든 것이 고장납니다.

나는 다음 코드 줄 관련되어 있다고 생각 : https://github.com/abourget/gevent-socketio/blob/master/socketio/handler.py#L104-106 나는 내가 일반 pubsub-활동을 위해 사용하고 예 레디 스를 들어, 다른 스토리지 엔진을 필요로하지만 실제 라이브러리 내부에 깊은 가정합니다. 내 응용 프로그램에서 전 세계적으로 다른 백엔드 엔진에 메모리 세션 스토리지에서 가야합니까 (가 정상적으로 위의 링크에서 세션 코드를 무시합니까?) 을 라이브러리 자체를 수정하지없이 어떻게

그래서 제 질문은? Something like PHP's session directives in php.ini. 나는 이것이 매우 일반적인 파이썬 질문이라는 논쟁이있을 수 있다고 생각하지만 관련 정보를 찾는 데 어려움을 겪고 있으며이 라이브러리에서 작동하는지 확신 할 수 없습니다.

다른 방법으로, 다른 직원과 서버간에 gevent-socketio의 xhr 폴링 전송을 어떻게 사용합니까 (끈적임없이)?

감사합니다.

+0

그냥 아이디어 : 쿠키에 세션 관련 정보를 유지 하시겠습니까? REST의 일종. –

+0

@moodh이 문제를 해결 했습니까? 또한 여러 근로자가 실제로 도움이됩니까? Gevent는 이미 하나의 이벤트 루프에서 많은 호출을 처리하는 데 큰 도움이됩니다. – pors

+0

아니요, 포기하고 대신 http://pusher.com/을 사용하기 시작했습니다. 이 문제와 관련하여 gevent-socketio (https://github.com/abourget/gevent-socketio/issues/112)에 일부 티켓이 있지만 얼마나 멀리 왔는지는 알 수 없습니다. 죄송합니다 :) – moodh

답변

3

이것은 분명히 socketio의 한계입니다. 웹에서 볼 수 있듯이 세션 처리는 일반적으로 웹 서버 계층보다는 웹 프레임 워크 계층에서 수행됩니다. socketio는 자체적으로 하위 계층에서 수행하려고 시도하지만 제한된 방식으로 수행합니다. 저자는 본격적인 해결책이 과잉이라고 생각했습니다. 귀하의 경우, 그들은 틀린 것으로 판명되었습니다.

논리 변경이 필요한 제한 사항을 극복하는 방법은 런타임에 소스를 패치하고 패치하는 두 가지 방법 밖에 없습니다. 가장 좋아하는 것을 선택하십시오 (또는, 잘, 혐오감 : ^)). 두 번째 옵션의 경우 request_tokens 및/또는 같은 인터페이스를 가진 다른 엔티티로 코드를 생성하는 것이 좋습니다. 첫 번째 단락에 나와있는 이유 때문에 socketio 작성자가 제안하는 소스 처리 패치를 사용하면 외부 세션 처리 메커니즘을 사용할 수 있다고 생각합니다.

세션 정보의 표준 위치는 공유 메모리, 파일, 데이터베이스입니다. socketio가 웹 프레임 워크와 같은 메커니즘을 사용하는 것과 같은 방식으로 로직을 변경하는 것이 좋습니다. 여기 예제에서

+0

답장을 보내 주셔서 감사합니다! 그것은 해결책이 아니지만 귀하의 정보에 대해 현상금을 수여 할 것입니다. 실제 솔루션을 기다리 겠지만 귀하의 회신을 통해 문제를 더 잘 이해할 수있었습니다. 나는 여러분이 제안한 request_tokens를 대체하여 해결할 것이라고 확신합니다. 답장을 보내 주셔서 감사합니다! – moodh

+0

2moodh : "웹 프레임 워크와 동일한 메커니즘을 사용하는"픽스를 제안했습니다. 따라서이 메커니즘이 무엇인지 모른 채 작성하는 것은 불가능합니다. –

+0

저는 작업자와 서버간에 세션을 유지하기 위해 redis를 사용합니다. 플라스크 (사용하는 프레임 워크)에 대한 구체적인 것은 없습니다. Flask가 Redis를 사용하게하는 것이 가능할 수도 있지만, 아직 그것에 대해 조사하지 않았습니다. :) – moodh

0

그냥 생각으로 레디 스를 사용하는 방법을 보여줍니다; gunicorn 포크 (-w 플래그 사용) 대신 다른 포트에 gunicorn의 여러 프로세스를 생성 한 다음 을 사용하여 nginx를 사용하여 균형을 잡을 수 있습니다. 나는 이것이 Redis와 상태를 공유하지 않을 때 nodejs 구현이 worker의 다중 처리를 처리하는 방법이라고 생각합니다.