2012-10-22 8 views
5

Obecnie próbuję skalować gevent-socketio w wielu robotników z serwerem gunicorn pomocą pracownika socketio.sgunicorn.GeventSocketIOWorker. Używam websockets gdy istnieje inaczej wymuszam XHR-polling (dla IE itp.).Wiele pracownicy gevent-socketio nie z transportem XHR-wyborczym z powodu sesji

Ankieta XHR wymaga sesji, w której można śledzić następujące ankiety, ale gdy tylko przejdę od jednego do dwóch lub więcej pracowników, prośby zaczynają się rozprzestrzeniać między sobą, co oznacza, że ​​państwo zostaje utracone, a wszystko zepsuje się.

myślę następujące linie kodu jest istotne: https://github.com/abourget/gevent-socketio/blob/master/socketio/handler.py#L104-106 Chyba potrzebuję trochę inny silnik składowania, na przykład REDiS którego używam do regularnych PubSub-działań, ale jest to głęboko wewnątrz rzeczywistej biblioteki.

Więc moje pytanie brzmi: w jaki sposób przejść od w pamięci przechowywania sesji na innym silniku backend globalnie w mojej aplikacji (czy to z wdziękiem nadpisać kod sesji w linku powyżej?) bez konieczności modyfikowania samej biblioteki? Something like PHP's session directives in php.ini. Przypuszczam, że można argumentować, że jest to bardzo ogólne pytanie pythonowe, ale mam problem ze znalezieniem odpowiednich informacji, a także nie jestem pewien, czy zadziała w tej bibliotece.

lub alternatywnie, w jaki sposób korzystać z transportu XHR-odpytywania gevent-socketio w poprzek różnych pracowników i serwerów (bez stickyness)?

Dzięki!

+0

Pomysł: zachować informacje o sesji w plikach cookie? Rodzaj REST. –

+0

@moodh Czy kiedykolwiek rozwiązałeś to? Co więcej, czy wielu pracowników naprawdę pomaga? Sam Gevent świetnie sobie radzi z obsługą wielu połączeń w jednej pętli zdarzeń. – pors

+0

Nie, zrezygnowałem i zacząłem używać http://pusher.com/. Jest kilka biletów w gevent-socketio (https://github.com/abourget/gevent-socketio/issues/112) w związku z tym problemem, ale nie wiem, jak daleko zaszły. Przepraszam :) – moodh

Odpowiedz

3

Jest to oczywiście ograniczenie socketio. Z tego, co widzę w Internecie, obsługa sesji jest zwykle wykonywana na warstwie struktury sieci Web, a nie na serwerze WWW. socketio próbuje zrobić to na własnej, niższej warstwie i robi to w ograniczony sposób. Sądzę, że autorzy uważali, że pełne rozwiązanie byłoby przesadą. W twoim przypadku okazały się błędne.

Istnieją tylko dwa sposoby na pokonanie ograniczeń, które wymagają zmiany logicznych: łatanie łatanie i źródła w środowisku wykonawczym. Wybierz to, co ci się najbardziej podoba (lub, cóż, odrazę najmniej: ^)). Dla drugiej opcji sugeruję zastąpić request_tokens i/lub kod, który tworzy go z innym obiektem z tym samym interfejsem. Z powodów wymienionych w pierwszym akapicie, naprawdę myślę, że autorzy socketio prawdopodobnie zaakceptują łatę źródłową, która pozwoliłaby jej wykorzystać zewnętrzne mechanizmy obsługi sesji, jeśli je zaproponujesz.

standardowe lokalizacje dla informacji o sesji są: wspólna pamięć, pliki, bazy danych. Proponuję zmienić logikę w taki sposób, aby socketio korzystał z tego samego mechanizmu, co robi twoja struktura sieciowa (lub cokolwiek, co komponuje twoje strony).

+0

Dziękuję za odpowiedź! Chociaż to nie jest rozwiązanie, nadal przyznam nagrodę za twoje informacje. Będę czekać na rzeczywiste rozwiązanie, ale twoja odpowiedź pomogła mi jeszcze lepiej zrozumieć problem. Jestem prawie pewien, że w końcu uda nam się go rozwiązać, zastępując request_tokens, tak jak sugerowałeś. Dzięki za odpowiedź! – moodh

+0

2moodh: Zasugerowałem, aby poprawka "korzystała z tego samego mechanizmu co struktura sieciowa". Więc nie da się pisać bez znajomości tego mechanizmu. –

+0

Używam redis do utrzymywania sesji pomiędzy pracownikami i serwerami, nic konkretnego dla kolby (framework, którego używam). Możliwe, że Flask użyje Redis, ale jeszcze na to nie spojrzałam. :) – moodh

0

tylko myśl, jak mam ten sam problem; zamiast pozwolić gunicornowi widelcowi (z flagą -w), być może mógłbyś odrodzić wiele procesów gunicorn na różnych portach, a następnie użyć nginx, aby zrównoważyć je za pomocą "upstream" block with "sticky" session. Uważam, że w ten sposób implementacja nodejs radzi sobie z wieloprocesowymi robotami, kiedy nie dzielą się państwami z Redis.

Powiązane problemy