Tinklaraštis

Pokalbis išlieka gyvas, kai telefonas miega

Mythex agentas gali dirbti minutes su viena užklausa, o jūs galbūt stebite iš telefono – jis užrakinamas, persijungia programas ir keičia tinklus, kol dirba. Dvi klaidos tai sugadindavo. Viena – pokalbis kiekvieną signalą „puslapis vėl matomas“ laikė įrodymu, kad jo ryšys nutrūko, ir kartojo ciklą, kol užstrigdavo ties „Connecting…“. Kita – telefonas, pramiegojęs pirmąjį naujo pokalbio atsakymą, grįžęs rodydavo tik kelis pirmuosius to atsakymo gabalėlius, kol nebus atnaujintas puslapis rankiniu būdu. Abi ištaisytos.

Kaip pokalbis seka veikiantį ėjimą

Agentui dirbant, pokalbis palaiko srautą iš mūsų serverių: kiekvienas žingsnis – mintis, įrankio iškvietimas, atsakymo dalis – atkeliauja kaip įvykis. Jei srautas nutrūksta, pokalbis prisijungia iš naujo, o serveris pakartoja neseniausius įvykius iš buferio, kuris laiko paskutines 120 sekundžių. Kai ėjimas baigiasi, pokalbis taip pat paprašo serverio išsaugotos istorijos ir suderina tai, ką rodė, su tuo, kas įrašyta. Šis paskutinis žingsnis pagauna tai, ką srautas praleido.

Kad atskirtų gyvą ryšį nuo nutrūkusio, kai nieko nevyksta, serveris kas 15 sekundžių siunčia trumpą „ping“.

1 klaida: pabudimas nužudė sveiką srautą

Naršyklės praneša puslapiui, kai jis vėl tampa matomas: po skirtuko perjungimo, po ekrano atrakinimo. Mes tai naudojome kaip signalą patikrinti ryšį – iš tikrųjų nutraukti srautą ir prisijungti iš naujo, manydami, kad jis nutrūko, kol buvo paslėptas.

Telefonuose ir įterptose naršyklėse šie įvykiai pasitaiko daug dažniau nei srautai nutrūksta – kiekvieną skirtuko perjungimą, kiekvieną atrakinimą, o kai kuriose įterptose naršyklėse kas kelias sekundes. Kiekvienas jų nutraukdavo sveiką srautą. Pokalbis prisijungdavo iš naujo, pakartodavo, vėl būdavo nutrauktas ir galiausiai sėdėdavo ties „Connecting…“. Tada pranešdavo, kad ėjimas baigėsi, nors agentas dar dirbo.

Pataisymas: vertinti srautą pagal tai, ar jis kalba

Pokalbis dabar įrašo, kada kiekvieno projekto srautas paskutinį kartą ką nors gavo – ir įvykius, ir 15 sekundžių ping. Signalas „vėl matomas“ nutraukia srautą tik tuomet, jei jis tylėjo 25 sekundes: ilgiau nei ping intervalas plius lėtas tinklo šuolis, todėl gyvas srautas niekada neatitinka sąlygos. Testai patikrina, kad ping laikomas gyvybės ženklu, o srautas, ką tik gavęs ping, nelaikomas negyvu.

Principas, kurį iš to pasiėmėme: puslapio matomumas nieko nesako apie tinklo ryšį, o paklausti reikia pačio ryšio.

2 klaida: pusė atsakymo po to, kai telefonas pabudo

Šią klaidą pavykdavo atkartoti kiekvieną kartą iOS simuliatoriuje:

  1. Pradėkite naują pokalbį ir išsiųskite užklausą, kuri užtrunka.
  2. Leiskite telefonui užmigti per statymą.
  3. Grįžkite, kai ėjimas jau baigtas ir dviejų minučių pakartojimo buferis išsibaigė.

Pokalbis rodydavo pirmus kelis atsakymo blokus, pažymėtus kaip baigtus – ir taip liktų, kol nebūtų atnaujintas puslapis.

Kodėl

Naujas pokalbis neturi gijos (thread) – išsaugoto pokalbio – kol pirma žinutė jos nesukuria. Tai įvyksta siuntimo funkcijoje, po to, kai siuntimas jau buvo užfiksavęs suderinimo žingsnį, kuris vis dar manė, kad gijos nėra. Taigi pirmo ėjimo pabaigoje naujame pokalbyje suderinimas nematė gijos ir tyliai grįždavo, nieko neprašydamas.

Paprastai to niekas nepastebėdavo, nes srautas vis tiek būdavo perdavęs visą ėjimą. Bet telefonas, pramiegojęs ėjimą ir grįžęs jau pasibaigus 120 sekundžių pakartojimo buferiui, negalėdavo gauti trūkstamų įvykių iš srauto – o suderinimas, kuris turėjo užpildyti spragą, niekada nebuvo paleistas.

Pataisymas

  • Siuntimas pasako suderinimui, kuriai gijai priklauso ėjimas, todėl pirmas naujo pokalbio ėjimas suderinamas kaip bet kuris kitas. Jei iki atsakymo atėjimo atidarėte kitą pokalbį, rezultatas atmetamas, o ne rodomas ne tame vietoje.
  • Nepavykęs suderinimas bandomas dar kartą. Telefonas, pabudęs prastame ryšyje, gali rasti ėjimą jau baigtą ir tada nepavykti jo gauti. Tai dabar įsimenama, ir pokalbis vėl klausia, kai skirtukas vėl rodomas arba grįžta tinklas.
  • „Dirbo“ rodomas sąžiningai. Kiekvienas atsakymas rodo, kiek laiko dirbo agentas. Jei skirtukas nebuvo gavęs serverio ėjimo pabaigos žinutės, jis anksčiau užpildydavo tai pagal savo laikrodį – kuris skaičiavo nuo siuntimo iki telefono pabudimo, įskaitant laiką, kai telefonas buvo išjungtas. Dabar tas skaičius pažymėtas kaip įvertinimas ir pakeičiamas įrašyta trukme, kai atvyksta istorija.

Ką iš to pasiėmėme

  • Testuokite įrenginyje, kurį žmonės tikrai naudoja, taip, kaip jie jį naudoja. Abi klaidos slypėjo tarpe tarp „srauto, kuris veikia“ ir „telefono kišenėje“.
  • Atsarginis planas, kuris niekada nepaleidžiamas, nėra atsarginis planas. Suderinimo žingsnis egzistavo būtent šiam atvejui sugauti, o jis tyliai praleisdavo.
  • Pakartokite ir atkūrimą. Momentas, kai telefonas pabunda, dažnai yra tada, kai jo ryšys blogiausias.
  • Nerodykite spėjimo kaip fakto. Trukmė pagal neteisingą laikrodį yra blogesnė nei jokia; pažymėkite ją arba pakeiskite.

Tas pats darbas sutvarkė ir kelis dalykus, kuriuos pamatysite ėjimui vykstant: komandinės eilutės žingsniai pažymimi pagal komandą, kuri atlieka darbą, o ne cd; pokalbio ekrano nuotraukos išlaiko puslapio viršutinį kairįjį kampą ir telpa į stulpelį; naujas projektas gauna savo sugeneruotą pavadinimą be atnaujinimo.

Jei kuriate savo programą telefonams, mūsų vadovai kaip kurti mobiliesiems pritaikytą žiniatinklio programą ir vietinės bei progresyviosios žiniatinklio programos aptaria pagrindus. Daugiau apie patį pokalbį – pokalbio dokumentacijoje.

Mythex · Pricing · Kurkite bet ką su dirbtiniu intelektu · Svetainių ir programėlių šablonai · Mythex palyginimas · Programėlių kūrimo su dirbtiniu intelektu žodynėlis · Nemokami programėlių kūrimo su dirbtiniu intelektu įrankiai · 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 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 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 简体中文 繁體中文(香港) 繁體中文(台灣)