2015-10-01 19 views
10

Wiele czytałem na temat websockets i już je wdrożyłem w ramach mojego systemu. To pytanie dotyczy prawidłowego ich wykorzystania. Chcę zaimplementować system powiadomień i czat we właściwy sposób.Websockets Notification-/Chat-System

Dla powiadomień mam kanał "powiadomienia/kanał" i dla czatów mam kanał "czaty/kanał".

Czy te dwa kanały nie są zbyt "globalne"? Powiedzmy, że jeśli witryna ma 1.000.000 użytkowników, oznaczałoby to, że wszyscy użytkownicy byliby na tych dwóch kanałach. Gdy jedno powiadomienie zostanie wysłane do innego określonego użytkownika, oznacza to, że wiadomość zostanie wysłana przez kanał, na którym subskrybuje 1.000.000 użytkowników.

To samo z wiadomościami na czacie. Załóżmy, że użytkownik chce rozmawiać z innym użytkownikiem. Każda wiadomość przekazałaby kanał, w którym wszyscy subskrybowali i na końcu, tylko docelowy użytkownik otrzyma wiadomość z powodu przekazanego receiver_id.

Jak prawidłowo obsługiwać kanały powiadomień i "prywatne" kanały czatu?

byłoby bardziej wydajnych i bezpiecznych stworzyć dla każdego Użytkownika do kanału „sub” (czaty grupowe i powiadomień, np „powiadomienia/kanał/user1”), albo po prostu niech wszystkich użytkowników w jednym dużym kanale?

+0

Brak pomysłów? Myślę, że jest to coś, o czym każdy powinien pomyśleć, jeśli chodzi o sieci internetowe, więc musi być zalecany sposób, aby to zrobić. – user3746259

+0

Czy naprawdę chcesz, aby wszyscy 1m użytkownicy czatowali w tej samej grupie? W przeciwnym razie oczywiście musisz podzielić rzeczy na podgrupy. To samo dotyczy powiadomień. Oprócz wpływu na wydajność, nie wszyscy użytkownicy powinni otrzymywać wszystkie powiadomienia z powodów związanych z prywatnością. – gzost

+0

Nie miałem na myśli rozmów ani wysyłania powiadomień w jednej dużej grupie - miałem na myśli jeden duży kanał i adresowałem go do konkretnych użytkowników. – user3746259

Odpowiedz

1

Osobiście sposób chciałbym rozwiązać ten jest następujący:

Każdy użytkownik ma 1 przyłącze websocket. To połączenie będzie używane do przekazywania wszystkich danych. Używałbym formatu json do przekazywania danych tam iz powrotem. Chciałbym użyć pola w strukturze json, aby wskazać rodzaj wiadomości i inne informacje, takie jak identyfikator pokoju rozmów. Tak więc, jeśli chciałem wysłać powiadomienie, to może być coś jak to (naprawdę prosty przykład):

{ 
    "type":"notification", 
    "message":"New Mail" 
} 

wiadomość czatu byłoby coś takiego:

{ 
    "type":"chat", 
    "chatID":4756, 
    "message":"Hello, world!" 
} 

po stronie klienta JavaScript logika określał rodzaj wiadomości i co z nią zrobić. Logika po stronie serwera określałaby, czy użytkownik jest "zasubskrybowany" w określonym pokoju czatu, aby wiedział, jakie wiadomości czatu mają być wysyłane do użytkownika. Pozwoli to zachować bezpieczeństwo, więc nie będziesz wysyłać wiadomości na czacie do użytkowników, którzy nie zasubskrybowali identyfikatora pokoju.

Daj mi znać, jeśli potrzebujesz wyjaśnienia na temat tej metody.

+0

Przyjemne podejście, ale jak czytałem powyżej, doszedłem do wniosku, aby utworzyć kanały dla poszczególnych użytkowników dla powiadomień i prywatnych kanałów czatu, w których określone grupy użytkowników mogą czatować. To jest, myślę, lepiej podzielony model. – user3746259

+0

* To różni się od Twojego, ponieważ masz tylko jeden kanał na użytkownika i nie ma oddzielnych kanałów czatu. Kontrola bezpieczeństwa może być również wykonana po stronie serwera w momencie, gdy użytkownik spróbuje zasubskrybować jeden kanał – user3746259

+0

** i nie można użyć tego podejścia do wysyłania wiadomości bezpośrednio od klienta do klienta za pomocą js - ale myślę, że to nie jest Tak źle, ponieważ kontrole po stronie serwera muszą być zawsze wykonywane zawsze. – user3746259