Blogg

Håll chatten igång när en telefon somnar

Mythex-agenten kan arbeta i minuter på en enda förfrågan, och du kanske tittar på från en telefon, som låser sig, byter appar och byter nätverk medan den arbetar. Två buggar fick det att gå fel. I den ena behandlade chatten varje signal om att sidan blivit synlig igen som bevis för att dess anslutning dött, och loopade tills den satt fast på „Ansluter…”. I den andra kom en telefon som sovit igenom det första svaret i en ny chatt tillbaka och såg bara de första bitarna av det, tills man uppdaterade manuellt. Båda är fixade.

Så följer chatten en pågående tur

Medan agenten arbetar håller chatten en ström öppen från våra servrar: varje steg, en tanke, ett verktygsanrop, en bit av svaret, kommer som en händelse. Om strömmen bryts återansluter chatten, och servern spelar upp de senaste händelserna från en buffert som håller de senaste 120 sekunderna. När turen är klar frågar chatten också servern efter den sparade historiken och stämmer av det den visat mot det som lagrats. Det sista steget fångar allt som strömmen missat.

För att skilja en levande anslutning från en död medan inget händer skickar servern en liten „ping” var 15:e sekund.

Bugg 1: att vakna dödade en frisk ström

Webbläsare meddelar en sida när den blir synlig igen: efter en flikväxling, efter att skärmen låsts upp. Vi använde det som en signal att kontrollera anslutningen, och i praktiken att avbryta strömmen och återansluta, i antagandet att den dött medan sidan var dold.

På telefoner och i inbäddade webbläsare händer dessa händelser mycket oftare än strömmar dör: vid varje flikväxling, varje upplåsning, och i vissa inbäddade webbläsare ungefär vartannat par sekunder. Varje sådan avbröt en helt frisk ström. Chatten återanslöt, spelade upp, avbröts igen, och hamnade på „Ansluter…”. Sedan sa den att turen var slut medan agenten fortfarande arbetade.

Lösningen: bedöm strömmen efter om den pratar

Chatten registrerar nu när varje projekts ström senast tog emot något alls, händelser och 15-sekundersping lika mycket. En „synlig igen”-signal avbryter bara en ström som varit tyst i 25 sekunder: längre än pingintervallet plus en långsam nätverkshopp, så en levande ström kvalificerar sig aldrig. Tester kontrollerar att en ping räknas som livstecken, och att en ström som precis pingat inte behandlas som död.

Regeln vi tog med oss: en sidas synlighet säger något om sidan, inte om nätverksanslutningen. Fråga anslutningen.

Bugg 2: halva svaret efter att telefonen vaknat

Den här kunde vi återskapa varje gång i iOS-simulatorn:

  1. Starta en ny chatt och skicka en förfrågan som tar en stund.
  2. Låt telefonen somna under bygget.
  3. Kom tillbaka efter att turen är klar och tvåminutersbufferten för uppspelning gått ut.

Chatten visade de första blocken av svaret, markerade som klara, och stannade så tills du uppdaterade sidan.

Varför

En ny chatt har ingen tråd, den sparade konversationen, förrän det första meddelandet skapar en. Det sker inne i sändfunktionen, efter att send redan fångat avstämningssteget, som fortfarande trodde att det inte fanns någon tråd. Så i slutet av första turen i en ny chatt såg avstämningen ingen tråd och återvände tyst utan att begära något.

Oftast märkte ingen det, eftersom strömmen ändå levererat hela turen. Men en telefon som sovit igenom turen och kom tillbaka efter att 120-sekundersbufferten gått ut kunde inte få de saknade händelserna från strömmen, och avstämningen som skulle fylla luckan hade aldrig körts.

Lösningen

  • Sändningen talar om för avstämningen vilken tråd turen tillhör, så att en ny chatts första tur avstäms som alla andra. Om du öppnat en annan chatt när svaret kommer tillbaka släpps resultatet i stället för att visas på fel plats.
  • En misslyckad avstämning görs om. En telefon som vaknar på en dålig anslutning kan upptäcka att turen är över men sedan misslyckas med att hämta den. Det minns nu, och chatten frågar igen när fliken visas igen eller nätverket kommer tillbaka.
  • „Arbetade i” är ärligt. Varje svar visar hur länge agenten arbetade. Om fliken aldrig såg serverns meddelande om att turen var slut fyllde den i det från sin egen klocka, som gick från det att man skickade tills telefonen vaknade, med tiden borta inräknad. Den siffran är nu markerad som en uppskattning, och ersätts av den lagrade varaktigheten när historiken kommer.

Vad vi tog med oss

  • Testa på den enhet folk faktiskt använder, på det sätt de använder den. Båda buggarna fanns i gapet mellan „en ström som fungerar” och „en telefon i fickan”.
  • En reservlösning som aldrig körs är ingen reservlösning. Avstämningssteget fanns just för att fånga det här fallet, och hoppade tyst över det.
  • Gör om återhämtningen också. Ögonblicket en telefon vaknar är ofta när dess anslutning är som sämst.
  • Visa inte en gissning som ett faktum. En varaktighet från fel klocka är värre än ingen alls; märk den eller ersätt den.

Samma arbete städade också några saker du ser när en tur körs: shellsteg märks med kommandot som gör jobbet i stället för cd, skärmbilder i chatten behåller sidans övre vänstra hörn och passar kolumnen, och ett nytt projekt får sitt genererade namn utan uppdatering.

Om du bygger en egen app för telefoner täcker våra guider om hur du bygger en mobilvänlig webbapp och native-appar kontra progressiva webbappar grunderna. Mer om chatten i sig finns i chattdokumentationen.

Mythex · Pricing · Bygg vad som helst med AI · Mallar för webbplatser och appar · Mythex jämfört · Ordlista för apputveckling med AI · Gratis verktyg för apputveckling med AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)