Blog

A chat életben tartása, amikor a telefon elalszik

A Mythex ügynöke percekig dolgozhat egyetlen kérésen, és lehet, hogy telefonról nézed, amely közben zárolódik, appot vált és hálózatot cserél. Két hiba rontotta el ezt. Az egyik miatt a chat minden „a lap újra látható” jelzést azzal magyarázott, hogy a kapcsolat megszakadt, és addig ismételte a újracsatlakozást, amíg a „Csatlakozás…” felirat ki nem ragadt. A másik miatt egy új chat első válaszát elaludt telefon csak az első pár darabbal mutatta, amíg kézzel nem frissítetted. Mindkettőt javítottuk.

Hogyan követi a chat a futó kört

Amíg az ügynök dolgozik, a chat nyitva tart egy streamet a szervereinkről: minden lépés — egy gondolat, egy eszközhívás, a válasz egy darabja — eseményként érkezik. Ha a stream megszakad, a chat újracsatlakozik, a szerver pedig visszajátssza a legutóbbi eseményeket egy pufferből, amely az utolsó 120 másodpercet tartja meg. A kör végén a chat a szervertől is kéri a mentett előzményt, és egyezteti a látottat a tároltal. Ez az utolsó lépés elkapja, amit a stream kihagyott.

Hogy tétlenül is meg lehessen különböztetni az élő kapcsolatot a holttól, a szerver 15 másodpercenként egy kis „pinget” küld.

1. hiba: az ébredés megölt egy egészséges streamet

A böngészők szólnak az oldalnak, amikor újra látható lesz: fülváltás után, a képernyő feloldásakor. Ezt egy jelzésnek vettük, hogy ellenőrizzük a kapcsolatot — a gyakorlatban megszakítottuk a streamet és újracsatlakoztunk, mert feltételeztük, hogy a rejtett állapotban elhalt.

Telefonokon és beágyazott böngészőkben ezek az események sokkal gyakrabban jönnek, mint ahányszor a streamek elhalnak — minden fülváltásnál, feloldásnál, és egyes beágyazott böngészőkben kb. kétmásodpercenként. Mindegyik megszakított egy egészséges streamet. A chat újracsatlakozott, visszajátszást kapott, megint megszakadt, és végül a „Csatlakozás…” feliratnál ragadt. Aztán azt közölte, hogy a körnek vége, miközben az ügynök még dolgozott.

A javítás: a stream abból ítélve, beszél-e

A chat most minden projekthez rögzíti, mikor kapott utoljára bármit a stream — eseményt és a 15 másodperces pinget egyaránt. Egy „újra látható” jelzés csak olyan streamet szakít meg, amely 25 másodperce néma: ez hosszabb a pinglésnél és egy lassú hálózati ugrásnál, így egy élő stream soha nem minősül holtnak. Tesztek ellenőrzik, hogy egy ping életjelnek számít, és hogy az épp pingelő stream nem minősül holtnak.

A tanulság: a lap láthatósága a lapról mond valamit, nem a hálózati kapcsolatról. A kapcsolatot kell megkérdezni.

2. hiba: fél válasz a telefon felébredése után

Ezt minden alkalommal újra tudtuk reprodukálni az iOS-szimulátorban:

  1. Indíts egy új chatet, és küldj egy olyan kérést, amely eltart egy ideig.
  2. Hagyd, hogy a telefon átaludja az építést.
  3. Gyere vissza, amikor a kör már véget ért, és a két perces visszajátszó puffer lejárt.

A chat a válasz első néhány blokkját mutatta, befejezettként jelölve — és így maradt, amíg frissítetted az oldalt.

Az ok

Az új chatnek nincs szála — tárolt beszélgetése — addig, amíg az első üzenet létre nem hozza. Ez a küldés függvényén belül történik, miután a küldés már rögzítette az egyeztetési lépést, amely még azt hitte, nincs szál. Így egy új chat első körének végén az egyeztetés nem látott szálat, és csendben visszatért anélkül, hogy bármit kért volna.

Ezt általában senki nem vette észre, mert a stream a teljes kört úgyis kézbesítette. De a telefon, amely átaludta a kört, és a 120 másodperces visszajátszó puffer lejárta után ébredt, nem kérhette vissza a hiányzó eseményeket a streamből — az egyeztetés pedig, amelynek be kellett volna töltenie a rést, sosem futott le.

A javítás

  • A küldés megmondja az egyeztetésnek, melyik szálhoz tartozik a kör, így egy új chat első köre ugyanúgy egyeztetődik, mint bármely más. Ha közben másik chatet nyitottál, mire a válasz megérkezik, az eredményt eldobjuk, nem a rossz helyen jelenítjük meg.
  • A sikertelen egyeztetést újrapróbáljuk. Egy rossz kapcsolaton ébredő telefon azt találhatja, hogy a kör már véget ért, de a lekérés nem sikerül. Ezt most megjegyezzük, és a chat újra kéri, amikor a lap újra látható lesz, vagy visszajön a hálózat.
  • A „Dolgozott” idő őszinte. Minden válasz megmutatja, mennyit dolgozott az ügynök. Ha a lap sosem látta a szerver körvégi üzenetét, régen a saját órájából pótolta ezt: a küldéstől a telefon felébredéséig mért időt, az idővel együtt, amíg távol voltál. Ezt az értéket most becslésként jelöljük, és amint az előzmény megérkezik, a tárolt időtartam váltja fel.

Mit vittünk ebből magunkkal

  • Teszteld azon az eszközön, amelyet az emberek ténylegesen használnak, úgy, ahogy használják. Mindkét hiba a „működő stream” és a „zsebben lévő telefon” közötti résben élt.
  • Az a tartalék, amely sosem fut le, nem tartalék. Az egyeztetés pont erre az esetre létezett, és csendben kihagyta.
  • A helyreállítást is újra kell próbálni. Az ébredés pillanata gyakran az, amikor a kapcsolat a legrosszabb állapotban van.
  • Ne mutass tippet tényként. Egy rossz órából mért időtartam rosszabb, mint semmi; jelöld, vagy cseréld le.

Az ugyanebben a munkában elvégzett finomítások közül egy-két dolgot látni fogsz a kör futása közben is: a shell-lépéseket az őket végző paranccsal jelöljük, nem cd-vel; a chatben a képernyőképek megtartják az oldal bal felső sarkát, és beleférnek az oszlopba; egy új projekt újratöltés nélkül megkapja a generált nevét.

Ha saját appot építesz telefonokra, hogyan építs mobilbarát webappot és natív appok vs. progresszív webappok útmutatóink az alapokat fedik le. A chatről magáról a chat dokumentációban olvashatsz.

Mythex · Pricing · Építs bármit AI-val · Weboldal- és alkalmazássablonok · A Mythex összehasonlítva · AI-alapú alkalmazásépítési szószedet · Ingyenes eszközök AI-alapú alkalmazásépítéshez · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Հայերեն 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 Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)