В чем преимущество использования экспоненциального отката?

Когда код ожидает некоторого условия, в котором время задержки не является детерминированным, похоже, что многие люди предпочитают использовать экспоненциальный откат, то есть подождать N секунд, проверить, удовлетворяется ли условие; если нет, подождите 2N секунд, проверьте условие и т. д. В чем преимущество этого метода перед проверкой в ​​постоянном / линейно увеличивающемся промежутке времени?


person xis    schedule 26.02.2015    source источник


Ответы (3)


Экспоненциальная задержка полезна в случаях, когда одновременные попытки сделать что-то будут мешать друг другу, так что ни одна не увенчается успехом. В таких случаях случайные попытки устройств выполнить операцию в слишком маленьком окне приведет к тому, что большинство попыток не удастся и придется повторить попытку. Только после того, как окно станет достаточно большим, попытки будут иметь значительную вероятность успеха.

Если бы кто-то знал заранее, что 16 устройств захотят обмениваться данными, можно было бы выбрать размер окна, который был бы оптимальным для этого уровня загрузки. Однако на практике количество конкурирующих устройств обычно неизвестно. Преимущество экспоненциального отката, когда размер окна удваивается при каждой повторной попытке, заключается в том, что независимо от количества конкурирующих объектов:

  1. Размер окна, в котором выполняется большинство операций, обычно будет в два раза меньше минимального размера окна, в котором большинство операций будет успешным,

  2. Большинство операций, которые терпят неудачу при этом размере окна, будут успешными при следующей попытке (поскольку большинство предыдущих операций будут успешными, менее половины из них будут конкурировать за окно, которое в два раза больше), и

  3. Общее время, необходимое для всех попыток, будет примерно вдвое больше, чем требовалось для последней.

Если вместо того, чтобы каждый раз удваиваться, окно просто увеличивалось на постоянную величину, то время, затрачиваемое на повторные попытки выполнения операции до тех пор, пока окно не достигло полезного размера, было бы пропорционально квадрату любого необходимого размера окна. Хотя окончательный размер окна может быть меньше, чем при экспоненциальном откате, общая стоимость всех попыток будет намного больше.

person supercat    schedule 26.02.2015

Это поведение контроля перегрузки TCP. Если сеть сильно перегружена, трафик практически не проходит. Если каждый узел ожидает постоянное время перед проверкой, трафик только для проверки будет продолжать засорять сеть, и перегрузка никогда не разрешится. Точно так же для линейного увеличения времени между проверками может потребоваться много времени, прежде чем перегрузка разрешится.

person mattm    schedule 26.02.2015

Предполагая, что вы имеете в виду проверку условия перед выполнением действия:

  • Экспоненциальный откат полезен, когда стоимость тестирования условия сопоставима со стоимостью выполнения действия (например, при перегрузке сети).
  • если стоимость проверки условия намного меньше (или незначительна), то линейное или постоянное ожидание может работать лучше при условии, что время, необходимое для изменения условия, также незначительно.

Например, если ваше условие представляет собой сложный (медленный) запрос к базе данных, а действие представляет собой обновление той же базы данных, то каждая проверка условия будет отрицательно влиять на производительность базы данных, и в какой-то момент без экспоненциального отката Проверка условия несколькими участниками может быть достаточной для использования всех ресурсов базы данных.

Но если условие - это просто легкая проверка памяти (фи критический раздел), и действие по-прежнему является обновлением базы данных (в лучшем случае в десятки тысячных раз медленнее, чем проверка), и если условие переворачивается в незначительную время в самом начале действия (при входе в критическую секцию), тогда подойдет постоянная или линейная отсрочка. Фактически, в этом конкретном сценарии экспоненциальный откат будет вредным, так как он приведет к задержкам в ситуациях низкой нагрузки и с большей вероятностью приведет к тайм-аутам в ситуациях высокой нагрузки (даже если пропускная способность обработки достаточна).

Подводя итог, экспоненциальный откат - это молоток: он отлично подходит для гвоздей, а не для шурупов :)

person Eric Grange    schedule 01.09.2017