Kako čet ostaje aktivan kada telefon spava
Agent Mythexa može da radi minutima na jednom zahtevu, a vi možda gledate sa telefona koji se zaključava, prelazi između aplikacija i menja mrežu dok radi. Dve greške su tu stvarale problem. U prvoj, čet je svaki signal „stranica je ponovo vidljiva” shvatao kao dokaz da je veza pukla, pa je ponavljao ponovno povezivanje dok ne bi ostao na „Connecting…”. U drugoj, telefon koji je prespavao prvi odgovor novog četa vraćao se samo sa prvih nekoliko delova odgovora, sve dok se stranica ručno ne osveži. Obe su popravljene.
Kako čet prati radnju koja traje
Dok agent radi, čet drži otvoren stream sa naših servera: svaki korak, misao, poziv alata ili deo odgovora stiže kao događaj. Ako se stream prekine, čet se ponovo povezuje, a server ponavlja nedavne događaje iz bafera koji čuva poslednjih 120 sekundi. Kada se radnja završi, čet takođe traži od servera sačuvanu istoriju i usklađuje ono što je prikazao sa onim što je sačuvano. Ovaj poslednji korak hvata ono što je stream propustio.
Da bi razlikovao živu vezu od mrtve kada se ništa ne dešava, server šalje mali „ping” na svakih 15 sekundi.
Greška 1: buđenje je ubijalo ispravan stream
Pregledači javljaju stranici kada ponovo postane vidljiva: posle prebacivanja taba, posle otključavanja ekrana. Mi smo to koristili kao signal da proverimo vezu, a u praksi da prekinemo stream i ponovo se povežemo, pod pretpostavkom da je pukao dok je bila sakrivena.
Na telefonima i u ugrađenim pregledačima ovi događaji se dešavaju mnogo češće nego što streamovi pucaju: pri svakom prebacivanju taba, svakom otključavanju, a u nekim ugrađenim pregledačima na svakih nekoliko sekundi. Svaki od njih je prekidao ispravan stream. Čet se ponovo povezivao, dobijao ponavljanje, opet bio prekinut i na kraju ostajao na „Connecting…”. Zatim je javljao da je radnja završena dok agent još radi.
Ispravka: stream se procenjuje po tome da li šalje podatke
Čet sada beleži kada je stream svakog projekta poslednji put nešto primio, i događaje i pingove na 15 sekundi. Signal „ponovo vidljivo” prekida stream samo ako je bio tih 25 sekundi: duže od intervala pinga plus sporiji mrežni skok, tako da živ stream nikada ne ispadne iz toga. Testovi proveravaju da ping računa kao znak života, i da stream koji je upravo pingovao ne bude 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 posle buđenja telefona
Ovu smo mogli da ponovimo svaki put u iOS simulatoru:
- Pokrenite nov čet i pošaljite zahtev koji traje.
- Pustite telefon da prespava pravljenje.
- Vratite se kada se radnja završi i kada istekne bafer za ponavljanje od dva minuta.
Čet je prikazao prvih nekoliko blokova odgovora, označenih kao završeni, i tako ostao dok ne osvežite stranicu.
Zašto
Novi čet nema nit, odnosno sačuvan razgovor, dok prva poruka ne napravi jednu. To se dešava unutar funkcije za slanje, posle toga što je slanje već zabeležilo korak usklađivanja, koji je i dalje mislio da niti nema. Zato je na kraju prve radnje u novom četu usklađivanje videlo da niti nema i tiho se vratilo bez traženja.
Obično to niko nije primetio, jer je stream ionako isporučio celu radnju. Ali telefon koji je prespavao radnju i vratio se posle isteka bafera od 120 sekundi nije mogao da dobije nedostajuće događaje iz streama, a usklađivanje koje je trebalo da popuni prazninu nikada nije bilo pokrenuto.
Ispravka
- Slanje govori usklađivanju kojoj niti radnja pripada, pa se prva radnja novog četa usklađuje kao i svaka druga. Ako ste do dolaska odgovora otvorili drugi čet, rezultat se odbacuje umesto da se prikaže na pogrešnom mestu.
- Neuspelo usklađivanje se ponavlja. Telefon koji se budi na lošoj vezi može da zatekne da je radnja završena, a da ne uspe da je preuzme. To se sada pamti, i čet pita ponovo kada se tab ponovo prikaže ili se mreža vrati.
- „Radio je” je iskren. Svaki odgovor pokazuje koliko je agent radio. Ako tab nikada nije video serverovu poruku o kraju radnje, ranije je to popunjavao sopstvenim satom, koji je merio od trenutka slanja do buđenja telefona, uključujući vreme odsustva. Taj podatak se sada označava kao procena, a zamenjuje ga sačuvano trajanje čim stigne istorija.
Šta smo izvukli iz ovoga
- Testirajte na uređaju koji ljudi stvarno koriste, na način na koji ga koriste. Obe greške su živele u procepu između „stream koji radi” i „telefon u džepu”.
- Rezervni mehanizam koji nikada ne radi nije rezervni. Usklađivanje je postojalo upravo da uhvati ovaj slučaj, a tiho ga je preskakalo.
- I oporavak treba ponoviti. Trenutak kada se telefon probudi je često kada je veza najlošija.
- Ne prikazujte pretpostavku kao činjenicu. Trajanje izmereno pogrešnim satom gore je od ikakvog. Označite ga ili ga zamenite.
Ista rad je takođe sredio nekoliko stvari koje ćete videti dok radnja traje: koraci sa shell komandama se označavaju prema komandi koja obavlja posao, a ne cd. Snimci ekrana u četu zadržavaju gornji levi ugao stranice i staju u kolonu, a novi projekat preuzima generisano ime bez osvežavanja.
Ako pravite sopstvenu aplikaciju za telefone, naši vodiči o pravljenju web aplikacije prilagođene telefonu i nativnim aplikacijama i progresivnim web aplikacijama pokrivaju osnove. Više o samom četu nalazi se u dokumentaciji o četu.