Чатот да остане жив кога телефонот спие
Агентот на Mythex може да работи со минути на едно барање, а можеби го гледате од телефон — кој се заклучува, менува апликации и мрежи додека работи. Два бага го расипуваа тоа. Во едниот, чатот секој сигнал „страницата е повторно видлива“ го сметаше за доказ дека неговата врска умрела, и се врте во јамка додека не остане на „Се поврзува…“. Во другиот, телефон што беше заспан за време на првиот одговор на нов чат се враќаше само со првите неколку делови од него, сè додека не се освежи рачно. И двата се поправени.
Како чатот го следи тековниот круг
Додека агентот работи, чатот одржува отворен проток од нашите сервери: секој чекор — мисла, повик на алатка, дел од одговорот — стигнува како настан. Ако протокот се прекине, чатот се поврзува повторно, а серверот ги пушта повторно неодамнешните настани од баферот што ги чува последните 120 секунди. Кога кругот ќе заврши, чатот исто така ја бара зачуваната историја од серверот и ја усогласува со она што го прикажал. Тој последен чекор ги фаќа сите работи што протокот ги пропуштил.
За да се разликува жива врска од мртва додека ништо не се случува, серверот испраќа мал „ping“ на секои 15 секунди.
Баг 1: будењето го убиваше здравиот проток
Прелистувачите му кажуваат на страницата кога повторно станува видлива: по префрлање на картичка, по отклучување на екранот. Ние тоа го користевме како знак да ја провериме врската — всушност, да го прекинеме протокот и да се поврземе повторно, претпоставувајќи дека умрел додека бил скриен.
На телефони и во вградени прелистувачи, овие настани се случуваат многу почесто отколку што протоците умираат — при секое префрлање на картичка, секое отклучување, а во некои вградени прелистувачи и на секои неколку секунди. Секој од нив прекинуваше совршено здрав проток. Чатот се поврзуваше повторно, се пушташе, се прекинуваше пак и на крајот остануваше на „Се поврзува…“. Потоа кажуваше дека кругот завршил додека агентот сè уште работеше.
Поправката: проценете го протокот по тоа дали зборува
Чатот сега бележи кога протокот на секој проект последен пат примил било што — настани и 15-секундните pings. Сигналот „повторно видлив“ прекинува проток само ако бил тивок 25 секунди: подолго од интервалот на pings плус бавен мрежен скок, така што жив проток никогаш не се квалификува. Тестовите проверуваат дека ping се смета за знак на живот и дека проток што штотуку испратил ping не се смета за мртов.
Правилото што го извлековме: видливоста на страницата кажува нешто за страницата, не за мрежната врска. Прашајте ја врската.
Баг 2: половина одговор откако телефонот се разбуди
Ова го можевме да го репродуцираме секогаш во iOS симулаторот:
- Започнете нов чат и испратете барање што трае.
- Оставете телефонот да спие додека се гради.
- Вратете се откако кругот ќе заврши и двоминутниот бафер за повторување ќе истече.
Чатот ги прикажуваше првите неколку блокови од одговорот, означени како завршени — и така остануваа додека не се освежи страницата.
Зошто
Нов чат нема нишка — зачувана разговорна историја — додека првата порака не ја создаде. Тоа се случува внатре во функцијата за испраќање, откако испраќањето веќе го зело чекорот за усогласување, кој уште мислел дека нишка нема. Значи, на крајот од првиот круг во нов чат, усогласувањето виделе дека нишка нема и тивко се врати без да бара што било.
Обично никој не го забележуваше, затоа што протокот ја испратил целата круг. Но телефон што спиел за време на кругот и се вратил откако 120-секундниот бафер за повторување истекол не можеше да ги добие пропуштените настани од протокот — а усогласувањето што требаше да ја пополни празнината никогаш не се извршило.
Поправката
- Испраќањето му кажува на усогласувањето на која нишка припаѓа кругот, така што првиот круг во нов чат се усогласува како секој друг. Ако до враќањето на одговорот сте отвориле друг чат, резултатот се отфрла наместо да се прикаже на погрешно место.
- Неуспешното усогласување се обидува повторно. Телефон што се буди на лоша врска може да најде дека кругот завршил, па да не успее да ја земе. Тоа сега се памети, а чатот пак прашува кога картичката повторно ќе се прикаже или мрежата ќе се врати.
- „Работеше“ е искрено. Секој одговор покажува колку време работел агентот. Ако картичката никогаш не ја видела пораката на серверот за крајот на кругот, порано ја пополнуваше од сопствениот часовник — кој тргнуваше од Испрати до будењето на телефонот, вклучувајќи го времето без него. Таа бројка сега е означена како проценка и се заменува со зачуваното траење штом ќе стигне историјата.
Што научивме
- Тестирајте на уредот што луѓето навистина го користат, на начинот на кој го користат. И двата бага живееја во празнината помеѓу „проток што работи“ и „телефон во џеб“.
- Резервна опција што никогаш не се извршува не е резервна опција. Усогласувањето постоеше баш за овој случај и тивко го прескокнуваше.
- Повторете и опоравувањето. Моментот кога телефонот се буди е често кога врската му е најлоша.
- Не прикажувајте претпоставка како факт. Траење од погрешен часовник е полошо од ништо; означете го или заменете го.
Истата работа исто така ги средија неколку работи што ќе ги видите додека кругот работи: чекорите на школката се означени според командата што ја извршува работата, а не cd, снимките од екранот во чатот ја задржуваат горната лева страна на страницата и се вклопуваат во колоната, а новиот проект го зема генерираното име без освежување.
Ако градите сопствена апликација за телефони, нашите водичи за градење веб апликација прилагодена на мобилни уреди и native наспрема progressive web апликации ги покриваат основите. Повеќе за самиот чат е во документацијата за чатот.