Adrian Chlubek: Czy PHP jest gotowy na websockety? Czy architektura samego języka nie stoi na przeszkodzie? Zobaczymy jakie mamy możliwości pracy z Websocketami, porównamy trzy popularne rozwiązania umożliwiające taką komunikację, a następnie odpowiemy sobie na pytanie – czy to ma sens?
12. GOS WebSocket bundle
● W sumie to Ratchet, ale opakowany w architekturę
Symfony
● Mocna integracja z mechanizmami Symfony
● Dodaje kilka dodatkowych funkcjonalności, których
nie ma w Ratchecie
13. GOS WebSocket bundle
Instalacja jest w miarę standardowa
● composer require gos/web-socket-bundle
● Dodanie bundla do kernela
● Konfiguracja w yamlu
No i uruchomienie za pomocą:
● php bin/console gos:websocket:server
14. GOS WebSocket bundle
Po takiej konfiguracji serwer oczywiście nic nie
potrafi :) W następnej kolejności należy:
● Opcjonalnie zbudować wbudowane assety z
biblioteką autobahn i integracją
● Skonfigurować serwisy RCP, zarejestrować je,
skonfigurować router, stworzyć serwisy „tematów”,
stworzyć kontrolery, skonfigurować firewall, no i
autoryzację
● I tak dalej i tak dalej...
15.
16. GOS WebSocket bundle - Plusy
● Zintegrowane z Symfony – co powoduje, że
aplikacja wygląda na spójną
● Jeśli uda się zrobić to co chcemy, zaoszczędzi nam
sporo kodowania
● Dołącza pomocne biblioteki JS, które niektórym
mogą się przydać
17. GOS WebSocket bundle - Minusy
● Niepełna, kiepska i miejscami błędna dokumentacja
● Brak dobrych przykładów bardziej skomplikowanych
aplikacji z których można podpatrzeć pewne
rozwiązania
● Jeśli będziemy chcieli zrobić coś, co nie do końca
zostało przewidziane przez autorów, możliwe, że
będziemy musieli napisać więcej kodu walcząc z
biblioteką niż napisalibyśmy pomijając ją
18. GOS WebSocket bundle - Minusy
● Implementacja jest dosyć zawiła i trudno ją
zrozumieć
● Jest bardzo zintegrowana z Symfony – kiepsko jeśli
upgrade Symfony zepsuje nasz kod
● Z jakiegoś powodu zżera CPU podczas
bezczynności
● Konfiguracja bindowania do IP pozwala tylko na
bindowanie IP, nie pozwala na bindowanie nazw
hostów, powodzenia w dockeryzacji
23. Ratchet
Czasami napisanie własnej implementacji w miarę
prostej funkcjonalności może przynieść więcej
korzyści niż użycie już gotowej, ale kiepskiej.
33. Swoole
Swoole domyślnie działa w wielu procesach, co
powoduje, że jest szybki!
Powoduje to również brak możliwości zapisywania
stanu serwera w zwykłych zmiennych :)
Można ograniczyć ilość procesów do jednego, co
pozwoli na używanie zwykłych zmiennych, jednak
wpłynie to na wydajność serwera
34. Swoole - Plusy
● Jest naprawdę szybki!
● Również pozwala na elastyczność podczas
implementacji
35. Swoole - Minusy
● Dodatek powstał w Chinach – może się to nie
podobać niektórym klientom
● Domyślne wsparcie wielu procesów potrafi
skomplikować zapisywanie stanu serwera
38. Problemy
Stateless VS Stateful
● Stateful – rozwiązanie trzymające stan serwera w
celu działania na przykład autoryzacji
Szybkie i proste, ale ciężkie w skalowaniu i
zapewnieniu ciągłości połączenia
39. Problemy
Stateless VS Stateful
● Stateless – rozwiązanie, które wymaga autoryzacji
przy każdej wiadomości
Nie wymaga ciągłości połączenia, łatwiejsze do
skalowania, ale wymaga warstwy do zapisu
niektórych informacji
46. Nadaje się czy nie?
Chyba jeszcze nie, ale są można sobie poradzić
47. Nadaje się czy nie?
Chyba jeszcze nie, ale są można sobie poradzić
● Restartować serwery co jakiś czas – ale ciężko
zapewnić, że żadna wiadomość nie zostanie
pominięta
● Można spróbować użyć SSE zamiast websocketów,
ale ciężko o dokumentację, stabilne biblioteki, a
poza tym raczej większość problemów pozostanie
48. Nadaje się czy nie?
● Można napisać serwer websocketów w innym
języku i przekazywać wiadomości do kolejki,
przetwarzać ją w php i odsyłać odpowiedzi do
kolejki, które są następnie wysyłane, ale to wpływa
na wydajność i raczej pozbawia websockety ich
głównych zalet
● No i można nadal używać zwykłych requestów
pomijając całkowicie websockety ;)