Chat ostaje živ kad telefon zaspi
Mythexov agent može raditi minutama na jednom zahtjevu, a vi ga možda pratite s telefona, koji se zaključava, mijenja aplikacije i mrežu dok on radi. Dvije greške su to pokvarile. U jednoj je chat svaku poruku „stranica je opet vidljiva” shvaćao kao dokaz da je veza umrla i ciklički se ponavljao dok ne bi zastao na „Connecting…”. U drugoj je telefon koji je prespavao prvi odgovor novog chata po povratku prikazao samo prvih nekoliko dijelova, sve dok ručno ne biste osvježili stranicu. Obje su popravljene.
Kako chat prati pokrenuti korak
Dok agent radi, chat drži otvoren stream s naših servera: svaki korak, misao, poziv alata, dio odgovora stiže kao događaj. Ako se stream prekine, chat se ponovno spaja, a server ponavlja nedavne događaje iz međuspremnika koji čuva posljednjih 120 sekundi. Kad korak završi, chat također traži od servera spremljenu povijest i usklađuje ono što je prikazao s onim što je spremljeno. Taj zadnji korak hvata sve što je stream propustio.
Da bi razlikovao živu vezu od mrtve dok se ništa ne događa, server šalje mali „ping” svakih 15 sekundi.
Greška 1: buđenje je ubijalo zdrav stream
Preglednici javljaju stranici kad ponovno postane vidljiva: nakon promjene kartice, nakon otključavanja ekrana. Mi smo to koristili kao poticaj da provjerimo vezu, a u praksi da prekinemo stream i ponovno se spojimo, pretpostavljajući da je umro dok je bio skriven.
Na telefonima i ugrađenim preglednicima ti se događaji pojavljuju mnogo češće nego što streamovi umiru: pri svakoj promjeni kartice, svakom otključavanju, a u nekim ugrađenim preglednicima svakih nekoliko sekundi. Svaki je prekidao sasvim zdrav stream. Chat se ponovno spajao, ponovno primao povijest, ponovno bio prekinut i na kraju je zastao na „Connecting…”. Zatim je rekao da je korak završio dok agent još radi.
Popravak: sudi o streamu po tome govori li
Chat sada bilježi kada je stream svakog projekta zadnji put nešto primio, i događaje i 15-sekundne pingove. Signal „ponovno vidljivo” prekida stream samo ako je bio tih 25 sekundi: duže od intervala pinga plus sporiji mrežni skok, pa živi stream nikad ne ispunjava uvjet. Testovi provjeravaju da ping broji kao znak života i da stream koji je upravo pingao nije tretiran kao mrtav.
Pravilo koje smo iz toga izvukli: vidljivost stranice govori nešto o stranici, a ne o mrežnoj vezi. Pitajte vezu.
Greška 2: pola odgovora nakon buđenja telefona
Ovu smo mogli reproducirati svaki put u iOS simulatoru:
- Započnite novi chat i pošaljite zahtjev koji traje.
- Pustite telefon da spava kroz build.
- Vratite se nakon što je korak završio i kad je 2-minutni međuspremnik ponavljanja istekao.
Chat je prikazao prvih nekoliko blokova odgovora, označenih kao završenih, i tako je ostao dok ne osvježite stranicu.
Zašto
Novi chat nema nit, tj. spremljeni razgovor, dok prva poruka ne stvori jednu. To se dogodi unutar funkcije slanja, nakon što je slanje već zabilježilo korak usklađivanja, koji je još mislio da niti nema. Pa je na kraju prvog koraka u novom chatu usklađivanje vidjelo da niti nema i tiho se vratilo bez traženja ičega.
Obično to nitko nije primijetio, jer je stream ionako isporučio cijeli korak. Ali telefon koji je prespavao korak i vratio se nakon što je 120-sekundni međuspremnik istekao nije mogao dobiti propuštene događaje iz streama, a usklađivanje koje je trebalo popuniti rupu nikad nije bilo pokrenuto.
Popravak
- Slanje javlja usklađivanju kojoj niti korak pripada, pa se prvi korak novog chata usklađuje kao i svaki drugi. Ako ste do dolaska odgovora otvorili drugi chat, rezultat se odbacuje umjesto da se prikaže na krivom mjestu.
- Neuspjelo usklađivanje se ponovi. Telefon koji se budi na lošoj vezi može zateći korak završenim, a zatim ne uspjeti dohvatiti ga. To se sada pamti, pa chat pita ponovno kad se kartica ponovno prikaže ili se mreža vrati.
- „Worked for” je iskreno. Svaki odgovor prikazuje koliko je agent radio. Ako kartica nikad nije vidjela serverovu poruku o završetku koraka, prije je to popunjavala vlastitim satom, koji je tekao od Send do buđenja telefona, uključujući vrijeme odsutnosti. Ta brojka je sada označena kao procjena i zamjenjuje je spremljeno trajanje čim stigne povijest.
Što smo iz toga izvukli
- Testirajte na uređaju koji ljudi stvarno koriste, na način na koji ga koriste. Obje greške živjele su u jazu između „streama koji radi” i „telefona u džepu”.
- Rezervni mehanizam koji se nikad ne pokrene nije rezervni mehanizam. Usklađivanje je postojalo upravo za ovaj slučaj i tiho ga je preskakalo.
- I oporavak treba ponovno pokušati. Trenutak kad se telefon probudi često je trenutak kad mu je veza najlošija.
- Ne prikazujte pretpostavku kao činjenicu. Trajanje izmjereno pogrešnim satom gore je od ikakvog; označite ga ili zamijenite.
Isti rad je i sredio nekoliko stvari koje ćete vidjeti dok korak radi: koraci u shellu označeni su naredbom koja obavlja posao, a ne cd; snimke zaslona u chatu zadržavaju gornji lijevi dio stranice i stanu u stupac; novi projekt preuzme svoje generirano ime bez osvježavanja.
Ako gradite vlastitu aplikaciju za telefone, naši vodiči o izradi web aplikacije prilagođene mobitelu i native aplikacijama naspram progresivnih web aplikacija pokrivaju osnove. Više o samom chatu nalazi se u dokumentaciji za chat.