Każdy nowoczesny serwer jest w stanie obsłużyć jednocześnie tysiące klientów . Jego oprogramowanie serwera HTTP musi być po prostu zorientowane na zdarzenia (IOCP) (nie jesteśmy już w starym Apache jedno połączenie = jedno równanie wątku / procesu). Nawet serwer HTTP wbudowany w Windows (http.sys) jest zorientowany na IOCP i bardzo wydajny (działa w trybie jądra). Z tego punktu widzenia nie będzie dużej różnicy w skalowaniu między WebSockets a zwykłym połączeniem HTTP. Jedno połączenie TCP / IP zużywa trochę zasobów (znacznie mniej niż wątek), a nowoczesny system operacyjny jest zoptymalizowany do obsługi wielu równoczesnych połączeń: WebSockets i HTTP to tylko protokoły warstwy aplikacji OSI 7, dziedziczące po specyfikacjach TCP / IP.
Ale z eksperymentu widziałem dwa główne problemy z WebSockets:
- Nie obsługują CDN;
- Mają potencjalne problemy z bezpieczeństwem.
Dlatego dla każdego projektu polecam:
- Używaj WebSockets tylko do powiadomień klientów (z mechanizmem awaryjnym do długiego sondowania - w pobliżu jest mnóstwo bibliotek);
- Użyj RESTful / JSON dla wszystkich innych danych, używając CDN lub serwerów proxy do pamięci podręcznej.
W praktyce pełne aplikacje WebSockets nie skalują się dobrze. Po prostu używaj WebSockets do tego, do czego zostały zaprojektowane: powiadomienia push z serwera do klienta.
O potencjalnych problemach związanych z używaniem WebSockets:
1. Rozważ użycie CDN
Obecnie (prawie 4 lata później) skalowanie sieci Web obejmuje korzystanie z interfejsów sieci dostarczania treści (CDN), nie tylko w przypadku zawartości statycznej (html, css, js), ale także danych aplikacji (JSON) .
Oczywiście nie umieścisz wszystkich danych w pamięci podręcznej CDN, ale w praktyce wiele typowych treści nie będzie się często zmieniać. Podejrzewam, że 80% zasobów REST może być zapisanych w pamięci podręcznej ... Nawet minuta (lub 30 sekund) wygaśnięcia CDN może wystarczyć, aby dać serwerowi centralnemu nowe życie i znacznie poprawić responsywność aplikacji, ponieważ CDN może być dostosowanym geograficznie ...
O ile mi wiadomo, w CDN nie ma jeszcze obsługi WebSockets i podejrzewam, że nigdy by tak nie było. WebSockets są pełne, podczas gdy HTTP jest bezstanowe, więc można je łatwo buforować. W rzeczywistości, aby usługa WebSockets była przyjazna dla CDN, może być konieczne przełączenie się na bezstanowe podejście RESTful ... które nie byłoby już WebSockets.
2. Kwestie bezpieczeństwa
WebSockets mają potencjalne problemy z bezpieczeństwem, szczególnie w przypadku ataków DOS. Aby zapoznać się z nowymi lukami w zabezpieczeniach, zobacz ten zestaw slajdów i ten bilet do zestawu internetowego .
WebSockets unikają jakiejkolwiek szansy na kontrolę pakietów na poziomie warstwy aplikacji OSI 7, która jest obecnie dość standardem w każdym zabezpieczeniu biznesowym. W rzeczywistości WebSockets sprawia, że transmisja jest zaciemniona, więc może to być poważne naruszenie bezpieczeństwa.