Hej. Postanowiłem spróbować swoich sił z webscoketami w rozwiązaniach webowych a właściwie ich skalowalnością. Załóżmy, że mówimy o prostej apliakcji typu czat.
Natknąłem się na jedno z możliwych rozwiązań: uzycie message brokera do dystrybucji wiadomości pomiędzy podami, ale muszę przyznać, że nie do końca go rozumiem. Już tłumaczę.
Jaki jest problem ze skalowalnością wszerz z webscoketami?
Jeżeli mamy kilka instancji (używam k8s, więc podów) to klient (np. apka w React/Angular) nie trzyma połączenia z danym podem.
Pomiędzy podami a klientem stoi tak skonfigurowany LoadBalancer w k8s
apiVersion: v1
kind: Service
metadata:
name: lct-api-service
spec:
selector:
app: lct-api
type: LoadBalancer
ports:
- protocol: TCP
port: 6008
targetPort: 80
Czego nie rozumiem?
Jak w takiej sytuacji klient powinien wysyłac wiadomości na serwer. Gdy mamy jedną instancję to wysyłam wiadomość przez otwarte połączenie ws. Jednak przy wielu isntancjach nie wchodzi to w grę, bo gdyby połączenie było trzymane z jednym konkretnym podem to nie byłoby potrzeby zaprzęgania message brokera.
- W takim razie jak wysyłać taką wiadomość zarówno z 'perpsektywy' klienta i serwera?
- Jeżeli serwer otrzyma jakoś wiadomość od klienta (przez http czy nawet bezposednio wrzuconą do message brokera) to jak dana instancja może powiadomić odpowiedniego klienta skoro połączenie nie jest utrzymane? Nawet jeżeli konkretny pod jest w stanie utrzymać połączenie to już jest bardziej SSE niż websocket.
Wstawiłem konfigurację k8s z tego względu, że być może brakuje mi jakiegoś ustawienia by takie połączenie było utrzymane i to nie jest problem ze złym zrozumieniem koncepcji co implementacji.