2013-06-03 4 views
7

W przykładzie czatu websocket tornada, uczestnicy są zapisani w zestawie (link), jest to wygodne w przypadku pojedynczego serwera. Ale jeśli uruchamiasz wiele instancji aplikacji i nginx jako load balancer, jak w tym przypadku lepiej przechowywać uczestników?skalowalność tornado websocket czat

+0

Powiedziałbym, że nie ma różnicy, jeśli uruchamiasz wiele instancji. W końcu każde wystąpienie będzie miało własny zestaw(). Jeśli martwisz się mechanizmem równoważenia obciążenia, aby przełączać użytkowników między instancjami, nie sądzę, że będzie działać podczas czatu, ale mogę się mylić. Nie można użyć wszystkich instancji do korzystania z tej samej listy użytkowników, którą można uznać za małą bazę danych lub magazyn kluczy. – pypat

+0

Jak rozumiem, każda instancja zachowa połączenie tylko z ich uczestnikami, różne instancje będą miały inną listę użytkowników. Ale w jaki sposób druga instancja zostanie powiadomiona o nowych wiadomościach na czacie? on – saniaxxx26

+0

Ponieważ 'set' należy tylko do jednej instancji Pythona i nie można uzyskać do niego dostępu z innych instancji, musisz utworzyć, jak wspomniany @pypat, wspólny i FAST magazyn wartości klucz-wartość, do którego można uzyskać dostęp przez wszystkie instancje (np. Memcached Redis itp.). Jedną z metod jest wykorzystanie systemu Pub/Sub firmy Redis do powiadamiania o wszystkich wystąpieniach zaktualizowanych informacji. Mam nadzieję, że moja odpowiedź poniżej trochę pomaga. –

Odpowiedz

4

Możesz rozważyć użycie funkcji Redis w wersji pubsub. (link)

Edit:

Kiedy klienci zalogować się do czatu, mogą subscribe do kanału, powiedzmy chatroom. Nie ma znaczenia, z jakich przykładów tornado korzystają. Korzystając z this module możesz słuchać asynchronicznie kanału.

Jeśli inny klient wyśle ​​wiadomość na twój czat (czyli publikuje wiadomość na kanale chatroom), wszystkie instancje tornado automatycznie wyślą wiadomości do tych, którzy zasubskrybowali kanał. Następnie możesz wysłać wiadomość przez websocket.

Możesz obejrzeć ten przykład demo.