Holde chatten i live når en telefon sover
Mythex-agenten kan jobbe i flere minutter på én forespørsel, og du følger kanskje med fra en telefon, som låser seg, bytter app og endrer nettverk mens den jobber. To feil gjorde at det gikk galt. I den ene behandlet chatten hvert «siden er synlig igjen»-signal som bevis på at tilkoblingen var død, og gikk i en løkke til den satt fast på «Kobler til…». I den andre kom en telefon som hadde sovet gjennom det første svaret i en ny chat, tilbake med bare de første bitene av det, til en manuell oppdatering. Begge er fikset.
Slik følger chatten en kjørende tur
Mens agenten jobber, holder chatten en åpen strøm fra serverne våre. Hvert steg, en tanke, et verktøykall eller en bit av svaret, kommer som en hendelse. Hvis strømmen faller bort, kobler chatten til igjen, og serveren spiller av nylige hendelser fra en buffer som holder de siste 120 sekundene. Når turen er over, ber chatten også serveren om den lagrede historikken og avstemmer det den viste mot det som ble lagret. Det siste steget fanger opp alt strømmen gikk glipp av.
For å skille en levende tilkobling fra en død når ingenting skjer, sender serveren en liten «ping» hvert 15. sekund.
Feil 1: å våkne drepte en frisk strøm
Nettlesere forteller en side når den blir synlig igjen: etter at du har byttet fane, etter at skjermen låses opp. Vi brukte det som et signal om å sjekke tilkoblingen. I praksis avbrøt vi strømmen og koblet til på nytt, fordi vi antok at den hadde dødd mens den var skjult.
På telefoner og i innebygde nettlesere skjer disse hendelsene langt oftere enn at strømmer dør: hver fanebytte, hver opplåsing, og i noen innebygde nettlesere omtrent hvert par sekund. Hver av dem avbrøt en helt frisk strøm. Chatten koblet til igjen, spilte av på nytt, ble avbrutt igjen og endte med å sitte på «Kobler til…». Så sa den at turen var over mens agenten fortsatt jobbet.
Løsningen: døm strømmen etter om den snakker
Chatten registrerer nå når hver prosjekts strøm sist mottok noe i det hele tatt, hendelser og 15-sekunders-pingene like mye. Et «synlig igjen»-signal avbryter bare en strøm som har vært stille i 25 sekunder. Det er lenger enn ping-intervallet pluss et tregt nettverkshopp, så en levende strøm kvalifiserer aldri. Tester sjekker at en ping teller som tegn på liv, og at en strøm som nettopp pinget, ikke behandles som død.
Regelen vi tok med oss: en sides synlighet sier noe om siden, ikke om nettverksforbindelsen. Spør forbindelsen.
Feil 2: halvt svar etter at telefonen våknet
Denne kunne vi reprodusere hver gang i iOS-simulatoren:
- Start en ny chat og send en forespørsel som tar en stund.
- La telefonen sove gjennom byggingen.
- Kom tilbake etter at turen er over og avspillingsbufferen på to minutter er utløpt.
Chatten viste de første blokkene av svaret, merket som ferdige, og ble stående slik til du oppdaterte siden.
Hvorfor
En ny chat har ingen tråd, altså den lagrede samtalen, før den første meldingen oppretter en. Det skjer inne i sendefunksjonen, etter at send allerede hadde fanget avstemmingssteget, som fortsatt trodde at det ikke fantes noen tråd. Så ved slutten av den første turen i en ny chat så avstemmingen ingen tråd og returnerte stille uten å be om noe.
Vanligvis la ingen merke til det, fordi strømmen allerede hadde levert hele turen. Men en telefon som hadde sovet gjennom turen og kom tilbake etter at avspillingsbufferen på 120 sekunder var utløpt, kunne ikke hente de manglende hendelsene fra strømmen. Avstemmingen som skulle ha fylt hullet, hadde aldri kjørt.
Løsningen
- Send forteller avstemmingen hvilken tråd turen tilhører, slik at den første turen i en ny chat avstemmes som alle andre. Hvis du har åpnet en annen chat når svaret kommer, forkastes resultatet i stedet for å vises på feil sted.
- En mislykket avstemming prøves på nytt. En telefon som våkner på en dårlig forbindelse kan finne at turen er over, og så mislykkes i å hente den. Det huskes nå, og chatten spør igjen når fanen vises på nytt eller nettverket kommer tilbake.
- «Jobbet i» er ærlig. Hvert svar viser hvor lenge agenten jobbet. Hvis fanen aldri så serverens melding om slutt på turen, fylte den det ut fra sin egen klokke, som gikk fra Send til telefonen våknet, inkludert tiden borte. Det tallet er nå merket som et estimat, og erstattes av den lagrede varigheten når historikken kommer.
Det vi tok med oss
- Test på enheten folk faktisk bruker, slik de bruker den. Begge feilene lå i gapet mellom «en strøm som fungerer» og «en telefon i lomma».
- En reserveløsning som aldri kjører, er ingen reserve. Avstemmingssteget fantes nettopp for dette tilfellet, og hoppet stille over det.
- Prøv gjenopprettingen på nytt også. Øyeblikket en telefon våkner, er ofte når tilkoblingen er på sitt dårligste.
- Vis ikke en gjetning som et faktum. En varighet fra feil klokke er verre enn ingen. Merk den eller erstatt den.
Det samme arbeidet ryddet også opp i noe du vil se mens en tur kjører: skallsteg merkes med kommandoen som gjør arbeidet, i stedet for cd, skjermbilder i chatten beholder øverste venstre hjørne av siden og passer kolonnen, og et nytt prosjekt tar i bruk sitt genererte navn uten oppdatering.
Hvis du bygger din egen app for telefoner, dekker guidene våre om å bygge en mobilvennlig nettapp og native apper kontra progressive web apps grunnlaget. Mer om selve chatten finnes i chat-dokumentasjonen.