Jak udržet chat živý, když telefon usne
Agent Mythexu může na jednom požadavku pracovat minuty a ty ho možná sleduješ z telefonu – ten se zamyká, přepíná aplikace a mění síť. Dvě chyby to dělaly špatně. V jedné chat při každém signálu „stránka je opět viditelná“ předpokládal, že jeho spojení zemřelo, a smyčkoval, až zůstal stát na „Připojování…“. V druhé telefon, který prospal první odpověď nového chatu, po probuzení ukázal jen prvních několik kusů odpovědi, dokud se stránka ručně neobnovila. Obě jsou opravené.
Jak chat sleduje běžící běh
Zatímco agent pracuje, chat drží otevřený stream z našich serverů: každý krok – myšlenka, volání nástroje, kus odpovědi – přijde jako událost. Pokud stream spadne, chat se znovu připojí a server přehraje nedávné události z bufferu, který drží posledních 120 sekund. Když běh skončí, chat si také od serveru vyžádá uloženou historii a sladí, co zobrazil, s tím, co bylo uloženo. Tento poslední krok zachytí cokoli, co stream minul.
Aby poznal živé spojení od mrtvého, když se nic neděje, server posílá malý „ping“ každých 15 sekund.
Chyba 1: probuzení zabilo zdravý stream
Prohlížeče říkají stránce, že je zase viditelná: po přepnutí karty, po odemčení obrazovky. Používali jsme to jako podnět ke kontrole spojení – a v praxi k tomu, že jsme stream přerušili a znovu připojili, protože jsme předpokládali, že při skrytí zemřel.
Na telefonech a ve vestavěných prohlížečích tyto události přicházejí mnohem častěji, než streamy umírají – při každém přepnutí karty, každém odemčení a v některých vestavěných prohlížečích každých pár sekund. Každá z nich přerušila zcela zdravý stream. Chat se znovu připojil, přehrál, byl znovu přerušen a skončil na „Připojování…“. Pak oznámil, že běh skončil, zatímco agent ještě pracoval.
Oprava: posoudit stream podle toho, jestli mluví
Chat teď zaznamenává, kdy stream každého projektu naposledy něco přijal – události i 15sekundové pingy. Signál „opět viditelné“ přeruší stream jen tehdy, když byl 25 sekund tichý: to je déle než interval pingu plus pomalý síťový skok, takže živý stream tuhle podmínku nikdy nesplní. Testy ověřují, že ping se počítá jako známka života, a že stream, který právě pingl, se nepovažuje za mrtvý.
Pravidlo, které jsme si z toho odnesli: viditelnost stránky říká něco o stránce, ne o síťovém spojení. Zeptej se spojení.
Chyba 2: půl odpovědi po probuzení telefonu
Tuhle jsme dokázali reprodukovat pokaždé v iOS simulátoru:
- Začni nový chat a pošli požadavek, který chvíli trvá.
- Nech telefon usnout během stavění.
- Vrať se, až běh skončí a dvouminutový buffer přehrávání vyprší.
Chat ukázal první několik bloků odpovědi, označených jako dokončené – a zůstal tak, dokud jsi stránku neobnovil.
Proč
Nový chat nemá vlákno – uloženou konverzaci – dokud první zpráva nevytvoří jedno. To se stane uvnitř funkce odeslání, až poté, co odeslání už zachytilo krok smíření, který stále myslel, že žádné vlákno neexistuje. Na konci prvního běhu v novém chatu smíření tedy neviděla žádné vlákno a tiše skončila, aniž by si cokoli vyžádala.
Obvykle si toho nikdo nevšiml, protože stream doručil celý běh tak či onak. Ale telefon, který prospal běh a probudil se až po vypršení 120sekundového bufferu přehrávání, nemohl chybějící události ze streamu získat – a smíření, které mělo mezeru zaplnit, nikdy neproběhlo.
Oprava
- Odeslání řekne smíření, ke kterému vláknu běh patří, takže první běh nového chatu se smíří jako každý jiný. Pokud mezitím otevřeš jiný chat, výsledek se zahodí, místo aby se zobrazil ve špatném chatu.
- Neúspěšné smíření se zkusí znovu. Telefon, který se probudí na špatném připojení, může zjistit, že běh skončil, a pak se nepodaří ho stáhnout. To si teď chat pamatuje a znovu se zeptá, když se karta znovu ukáže nebo se síť vrátí.
- „Zpracováno“ je poctivé. Každá odpověď ukazuje, jak dlouho agent pracoval. Pokud karta nikdy neviděla koncovou zprávu běhu od serveru, dříve to doplnila z vlastních hodin, které běžely od odeslání až do probuzení telefonu – včetně času pryč. Tento údaj je teď označen jako odhad a nahradí ho uložená délka, jakmile dorazí historie.
Co jsme si z toho odnesli
- Testuj na zařízení, které lidé skutečně používají, tak, jak ho používají. Obě chyby žily v mezeře mezi „stream, který funguje“ a „telefon v kapse“.
- Záložní postup, který se nikdy nespustí, není záloha. Krok smíření existoval přesně kvůli tomuto případu a tiše ho přeskakoval.
- Zkus znovu i obnovu. Okamžik, kdy se telefon probudí, bývá často moment, kdy je jeho spojení nejhorší.
- Nezobrazuj odhad jako fakt. Délka z chybných hodin je horší než žádná; označ ji, nebo ji nahraď.
Tatáž práce také uklidila několik věcí, které uvidíš, když běh běží: kroky shellu se označují podle příkazu, který vykonává práci, místo cd; snímky obrazovky v chatu si zachovávají levý horní roh stránky a vejdou se do sloupce; a nový projekt dostane vygenerovaný název bez obnovení stránky.
Pokud stavíš vlastní aplikaci pro telefony, naše průvodce jak postavit webovou aplikaci přátelskou k mobilům a nativní aplikace vs progresivní webové aplikace pokrývají základy. Víc o samotném chatu je v dokumentaci k chatu.