Czat AI dla 50 tysięcy użytkowników, któremu zrywa się połączenie
Wasz asystent AI ma 50 tys. aktywnych użytkowników dziennie, wielu na mobilnym internecie. Odpowiedzi trwają do 60 sekund. Zgłoszenia mówią: „odpowiedź urywa się w połowie i trzeba pytać od nowa”, co kosztuje też tokeny modelu. Zaproponuj, jak sprawić, żeby zerwanie połączenia nie oznaczało utraty odpowiedzi.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy oddzielasz generowanie odpowiedzi od połączenia, które ją dostarcza
- Czy znasz mechanizm wznawiania SSE (id zdarzeń, Last-Event-ID)
- Czy myślisz o koszcie, skali i stanie po stronie serwera
- Czy wiesz, jak to pokazać w UI
Odpowiedź seniora
Kluczowa decyzja: generowanie nie może żyć w połączeniu HTTP. Serwer zapisuje fragmenty odpowiedzi do bufora (Redis Streams albo tabela z numerem fragmentu) pod id wiadomości, a połączenie SSE tylko je czyta. Każde zdarzenie ma id: <messageId>:<seq>.
Po zerwaniu klient łączy się ponownie z nagłówkiem Last-Event-ID (natywny EventSource robi to sam, przy fetch dodaję go ręcznie) i dostaje fragmenty od miejsca przerwania. Jeśli generowanie już się skończyło, dostaje resztę z bufora i zdarzenie done. Bufor ma TTL, np. 10 minut. Reconnect z exponential backoff i jitterem, żeby po awarii sieci 50 tys. klientów nie wróciło w tej samej sekundzie.
W UI zostawiam to, co już przyszło, pokazuję „wznawiam…” zamiast błędu, a dopiero po kilku nieudanych próbach przycisk „Ponów”. Metryki: odsetek przerwanych strumieni, liczba wznowień, czas do pierwszego tokenu i ile tokenów zaoszczędziliśmy dzięki wznawianiu.
Typowe wpadki
- Odpowiedź „dodam retry, które wyśle pytanie jeszcze raz”
- Trzymanie stanu generowania w pamięci jednego procesu Node bez sticky sessions
- Reconnect bez jittera, który po awarii robi atak na własny serwer
Dopytają o
- Co zrobisz, gdy użytkownik kliknie stop, a generowanie trwa na serwerze?
- Jak to zadziała za load balancerem z wieloma instancjami?
- Jak przetestujesz zrywanie połączenia w CI?