Tērzēšanas uzturēšana, kad tālrunis guļ
Mythex aģents vienam pieprasījumam var strādāt vairākas minūtes, un tu, iespējams, skaties no tālruņa — tas bloķējas, pārslēdz lietotnes un maina tīklu, kamēr strādā. Divas kļūdas to padarīja sliktu. Vienā tērzēšana katru signālu „lapa atkal redzama” uzskatīja par pierādījumu, ka savienojums ir nomiris, un cikla līdz tam, kamēr tā iestrēga uz „Connecting…”. Otrā tālrunis, kas nogulēja jaunas tērzēšanas pirmo atbildi, atgriezās tikai ar dažiem pirmajiem tās gabaliem, līdz manuāli atsvaidzināja lapu. Abas ir novērstas.
Kā tērzēšana seko darbojošamies gājienam
Kamēr aģents strādā, tērzēšana uztur atvērtu straumi no mūsu serveriem: katrs solis — domas, rīka izsaukums, atbildes gabals — ierodas kā notikums. Ja straume pārtrūkst, tērzēšana atkal savienojas, un serveris atkārto nesenos notikumus no bufera, kas glabā pēdējās 120 sekundes. Kad gājiens beidzas, tērzēšana arī pieprasa serverim saglabāto vēsturi un saskaņo to ar to, ko rādīja. Šis pēdējais solis noķer visu, ko straume palaida garām.
Lai atšķirtu dzīvu savienojumu no miruša, kad nekas nenotiek, serveris katras 15 sekundes nosūta mazu „ping”.
1. kļūda: pamošanās nogalināja veselīgu straumi
Pārlūkprogrammas paziņo lapai, kad tā atkal kļūst redzama: pēc cilnes pārslēgšanas, pēc ekrāna atbloķēšanas. Mēs to izmantojām kā iemeslu pārbaudīt savienojumu — praksē, lai pārtrauktu straumi un savienotos atkal, pieņemot, ka tā bija nomirusi, kamēr lapa bija paslēpta.
Tālruņos un iebūvētās pārlūkprogrammās šie notikumi notiek daudz biežāk nekā straumes mirst — katrā cilnes pārslēgšanā, katrā atbloķēšanā, un dažās iebūvētās pārlūkprogrammās ik pēc pāris sekundēm. Katrs no tiem pārtrauca veselīgu straumi. Tērzēšana atkal savienojās, atkārtoja, tika pārtraukta vēlreiz un galu galā iestrēga uz „Connecting…”. Tad tā paziņoja, ka gājiens ir beidzies, kamēr aģents vēl strādāja.
Risinājums: spried par straumi pēc tā, vai tā runā
Tērzēšana tagad reģistrē, kad katras projekta straume pēdējo reizi kaut ko saņēma — gan notikumus, gan 15 sekunžu ping. Signāls „atkal redzams” pārtrauc straumi tikai tad, ja tā ir klusējusi 25 sekundes: ilgāk nekā ping intervāls plus lēns tīkla lēciens, tātad dzīva straume nekad neatbilst. Testi pārbauda, ka ping skaitās kā dzīvības pazīme un ka straume, kas tikko pingoja, netiek uzskatīta par mirušu.
Noteikums, ko no tā ņēmām: lapas redzamība kaut ko pasaka par lapu, nevis par tīkla savienojumu. Jautā savienojumam.
2. kļūda: puse atbildes pēc tam, kad tālrunis pamodās
Šo mēs varējām reproducēt katru reizi iOS simulatorā:
- Sāc jaunu tērzēšanu un nosūti pieprasījumu, kam vajag laiku.
- Ļauj tālrunim gulēt visu laiku, kamēr notiek veidošana.
- Atgriezies pēc tam, kad gājiens ir beidzies un divu minūšu atkārtošanas buferis ir nolaidies.
Tērzēšana parādīja pirmos atbildes blokus, atzīmētus kā pabeigtus, un tā palika, līdz atsvaidzināji lapu.
Kāpēc
Jaunai tērzēšanai nav pavediena — saglabātās sarunas — līdz pirmais ziņojums to izveido. Tas notiek sūtīšanas funkcijā, pēc tam, kad sūtīšana jau bija pārņēmusi saskaņošanas soli, kas joprojām domāja, ka pavediena nav. Tāpēc pirmā gājiena beigās jaunā tērzēšanā saskaņošana neredzēja pavedienu un klusi atgriezās, neko neprasot.
Parasti neviens to nepamanīja, jo straume jau bija piegādājusi visu gājienu. Bet tālrunis, kas nogulēja gājienu un atgriezās pēc tam, kad 120 sekunžu atkārtošanas buferis bija izbeidzies, nevarēja iegūt trūkstošos notikumus no straumes — un saskaņošana, kas būtu aizpildījusi tukšumu, nekad nebija darbojusies.
Risinājums
- Sūtīšana pasaka saskaņošanai, kuram pavedienam gājiens pieder, tāpēc jaunas tērzēšanas pirmais gājiens tiek saskaņots kā jebkurš cits. Ja līdz atbildes atgriešanai esi atvēris citu tērzēšanu, rezultāts tiek atmests, nevis parādīts nepareizā vietā.
- Neizdevusies saskaņošana tiek mēģināta vēlreiz. Tālrunis, kas pamostas sliktā savienojumā, var atrast, ka gājiens ir beidzies, un tad neizdodas to iegūt. Tas tagad tiek atcerēts, un tērzēšana jautā vēlreiz, kad cilne atkal tiek rādīta vai tīkls atgriežas.
- „Worked for” ir godīgs. Katra atbilde rāda, cik ilgi aģents strādāja. Ja cilne nekad neredzēja servera beigu ziņojumu, tā agrāk aizpildīja to ar savu pulksteni — kas skaitīja no Send līdz brīdim, kad tālrunis pamodās, ieskaitot prombūtnes laiku. Šis skaitlis tagad ir atzīmēts kā aptuvens un aizstāts ar saglabāto ilgumu, kad vēsture atnāk.
Ko no tā guvām
- Testē uz ierīces, ko cilvēki tiešām izmanto, tā, kā viņi to izmanto. Abas kļūdas dzīvoja plaisā starp „straumi, kas darbojas” un „tālruni kabatā”.
- Rezerves risinājums, kas nekad nedarbojas, nav rezerves risinājums. Saskaņošanas solis pastāvēja tieši šim gadījumam un klusi to izlaida.
- Atkārto arī atkopšanos. Brīdis, kad tālrunis pamostas, bieži ir brīdis, kad tā savienojums ir vissliktākajā stāvoklī.
- Nerādi minējumu kā faktu. Ilgums no nepareizā pulksteņa ir sliktāks par nekādu; atzīmē to vai aizstāj.
Tas pats darbs arī sakārtoja dažas lietas, ko redzēsi, kamēr gājiens darbojas: čaulas soļi tiek apzīmēti ar komandu, kas patiesi veic darbu, nevis ar cd; ekrānuzņēmumi tērzēšanā saglabā lapas augšējo kreiso stūri un ietilpst kolonnā; un jauns projekts uzreiz saņem savu ģenerēto nosaukumu bez atsvaidzināšanas.
Ja veido savu lietotni tālruņiem, mūsu ceļveži par mobilām draudzīgas tīmekļa lietotnes veidošanu un native pret progresīvām tīmekļa lietotnēm aptver pamatus. Vairāk par pašu tērzēšanu ir tērzēšanas dokumentācijā.