19056-ият опит – неуспешен

Имам малка Wi-Fi джаджа, която пуска музикални файлове или радио от мрежата. Удобно нещо, но ето какво се случи след като променихме паролата за домашния wireless и оставихме джаджата без надзор за няколко часа:

За тези, на които не им се смята, в 5 часа 17 минути и 36 секунди има точно 19056 секунди. Значи проклетата машина се е опитвала да се свързва отново и отново към Wi-Fi рутера всяка секунда!

Ще се опитам да ви убедя с метафора защо този подход е лош. Представете си, че трябва да купите нещо от магазина, но той не работи. Ще ходите ли през 5 минути да проверявате дали не е отворил? Сигурно не.

Нека все пак видим какво ще стане, ако решите да навестяваме магазина на всеки пет минути. Долната диаграма показва колко хора ще има струпани отпред всяка минута след затварянето му:

Диаграма на броя чакащи пред магазина
За горната диаграма, приемаме, че на всяка минута идва по един нов клиент.

Само за няколко часа пред магазина ще започнат да се събират тълпи от по 100 човека. При такава навалица:

  • Дори собственикът на магазина да дойде, ще му бъде трудно да се вмъкне вътре и да реши проблема, заради който магазинът е бил затворен.
  • Ако служителите вътре успеят да отворят магазина, ще бъдат стъпкани от масата народ и магазинът пак няма да може да работи.

Колкото повече се натискате да видите дали магазинът не е отворил, толкова по-голям е шансът да му попречите да отвори.

Как обаче да действате?

Първият път опитвате 5 минути, след като магазинът е затворил. Ако отново не работи, следващият ви опит ще бъде след 10 минути. При по-следващия – след 20, и така след всеки опит удвоявате времето между опитите.

Ето нагледно изражение на чакащите пред магазина, ако времето за чакане се удвоява:
Диаграма на броя чакащи пред магазина, с експоненциално изчакване

Вижда се, че дори след 8 часа няма да има повече от 10 чакащи. Предимствата на новия подход са, че:

  • Винаги ще има достъп до магазина, защото с времето тълпата отпред се увеличава много много бавно.
  • Ако магазинът успее да отвори, служителите няма да имат проблем да се справят с първоначалния наплив от клиенти.

Айнщайн би казал, че е лудост да правиш едно и също нещо отново и отново и да очакваш различни резултати. Аз бих добавил, че е лудост да правиш едно и също нещо отново и отново, на равни интервали, и да очакваш различни резултати.

Следващия път когато ви се наложи да опитате нещо старо, независимо дали е ходене до магазина или връзване с базата от данни, разреждайте опитите с времето, моля ви.

7 коментара по “19056-ият опит – неуспешен”:

  1. Васил Колев

    … е exponential backoff не се ли преподава навсякъде? Всеки, който знае какво е TCP, би трябвало да знае и това и защо се прави така…

    За мен това е нещо ултра стандартно… Има смисъл от честото опитване (на равни интервали от време) при realtime или някаква специфична система, в която броя участници е краен и ясен…

  2. николай

    Василе, не се преподава навсякъде.

    Във ФМИ имам Добър (4) по мрежи, на изпита не успях да убедя господин доцента, че не е съвсем наясно как работи DNS. Не знам как е на другите места.

    Аз лично го идеята за Exponential Backoff научих от личен опит (е, преди ФМИ) при един web chat, но повечето хора нито са се занимавали с TCP, нито им идва наум. Като на програмистите писали софтуера за джиджавката ми :)

  3. Васил Колев

    Преподаването на мрежи във ФМИ е голяма мъка. Даже и ние май не споменаваме backoff-а (понеже все пак обясняваме сигурността).

    Но ако си човек, дето пише нещо, което се занимава с мрежи, няма как да не си чел основите на TCP/IP (например tcp/ip illustrated, vol.1) и да не знаеш тия неща. Все едно да не знаеш как се пише рекурсия :)

    (и да, аз за backoff-а научих точно от tcp/ip illustrated, още докато бях младши админ в dobrich.net :) )

  4. Бобсън

    Това с струпването на излишно многото хора пред разните магазини се онагледяваше доста добре преди 15ина години.

  5. Огнян

    exponential backoff едва ли е най-доброто решение за една юзерска джаджа. Все пак при нея нямаш никаква обратна връзка какво се случва нито можеш да ѝ настроиш нещо. Какво би станало ако реши да се backoff-не за 20 сек? Юзера включва – не работи. Изключва. Джаджа пак опитва, но не става и се backoff-ва за 25 сек. Узера пак пробва – пак не става…
    Пак добре, че се пробва само веднъж на секунда, а не на всяка 1 десета ;-)

  6. николай

    Огняне,

    Първо, ще минат няколко опита, докато backoff-а стигне 20 секунди. Потребителят ще усети какво се случва преди това.

    Второ, обратната връзка се постига лесно. Вместо да пише:
    Re-try: xxx
    може да пише:
    Next re-try is in X seconds. Press Play to try now.

  7. Огнян

    В твоя случай след 5 часа опити като нищо ще ги е стигнал и минал тези 20 сек :-)

Твоят коментар