📏 Затянул с последним постом про ретраи. Такие времена, сами понимаете – нужно затягивать не только пояса (фьить - ха!).
Сегодня такая задачка. В репозитории bounded-disturbances это челлендж под номером 8.
В нормальном случае запрос проходит за 30мс. В 10% случаев у вас канал выдает задержку в 2 секунды. При этом 25% запросов выполняются минимум 1 секунду. (к примеру 75% запросов к базе данных несложные и выполняются быстро, а 25% очень сложные и это не исправить)
В этой задаче, вы можете задавать таймаут для каждого ретрая отдельно, то есть указывать его в виде ряда:
var timeouts = new [] { 666, 666 };
❓ Задача подобрать ряд таймаутов с нужным количеством ретраев и с нужными значениями элементов ряда так, чтобы 99% запросов прошли успешно и 95-ый перцентиль запросов был ниже 2 секунд. И еще одно условие – 70% процентов запросов должно проходить не больше чем за 200 мс.
То есть мы хотим сделать с помощью ретраев так, чтобы те запросы, которые могут пройти быстро, прошли быстро. Но при этом та часть запросов, которая идет медленно, доходила до конца.
✅ Не совсем понятный ответ тут:
А тут не все так однозначно! Фактически у нас есть два вида запросов – быстрые запросы, которые периодически тупят, и медленные запросы, которые периодически еще и тупят (Вот уж дейсвтительно – Тупой и еще тупее! Пха-ха! 😅). Под каждый из запросов нам нужны свои таймауты.
Под быстрые запросы нам подойдет таймаут в 50 мс, так как, если быстрый запрос не успел выполниться в это время, значит он уже не долетит.
Под медленные запросы нам нужен таймаут в 1100 мс, так как мы помним, что медленные запросы меньше чем за 1000 мс не выполняются.
Если мы составим такой ряд
var timeouts = new [] { 50, 1100 };
То для быстрых запросов у нас будет две попытки. А вот для медленных запросов будет только одна. При этом 100% быстрых запросов выполнится, а вот у медленных запросов 10% просто не дойдет до успеха (по вот этой формуле посчитал 1 - 0.1^1 = 1-q^n = 0.90), что даст нам общую успешность выполнения примерно 97.5%🅰️ Но у нас цель по успешности в 99%. Именно поэтому мы должны воткнуть еще один таймаут для тупящих запросов, получив в итоге такой ряд:
var timeouts = new [] { 50, 1100, 1100 };И это как раз то что нужно!
P.S. Ффух, на этом все. Нихерашеньки не шорт пост получится, товарищи. Да и объяснения тут, конечно, такие, что их нужно еще отдельно разбирать. Что я и сделаю в будущей статье на Хабр. Там можно будет и формулы прописать нормально, со всеми сигмами и дать кому-нибудь на ревью все это.
🔚 Засим про ретраи почти все. Спасибо, что читали! дальше будет еще одна мысль про них и на этом считаю свой опус-магнум завершенным.
#ресайленс