Короткий cooldown проти драбини
otp-blue · сендери iMessage · 13 лип — 9 вер 2026

Чи частіше в Need Check ідуть сендери з коротким cooldown?

A/B за наявними даними: у групі — cooldown фіксований 10–90 хв на всіх рівнях, проти без групи — стандартна драбина 1–2 год → 1–2 год → 12–14 год → 12–14 год → Need Check.

популяція: сендери з ≥1 клієнтським повідомленнямосновне вікно: 10 серп — 9 вер (30 днів)джерела: Message, ServerStatusHistory, Group

Ні, навпаки. На одиницю активного часу сендери з коротким cooldown потрапляють у Need Check приблизно вдвічі рідше: 1,24 проти 2,95 подій на 100 сендер-днів у чистому зрізі (es+zp, без preheat), 1,23 проти 1,85 у порівнянні всередині одних і тих самих хостів.

Але вони швидше повертаються туди після ручного відновлення. Після фіксу лічильників 29 серпня 43 % відновлених «групових» сендерів знову були в Need Check за добу, проти 12 % «без групи». Це не гірша якість номера, а арифметика драбини: 5 коротких cooldown уміщуються в ~10 годин, 5 довгих — не менше ніж у 28.

Ціна короткого cooldown — доставка. На тих самих хостах групові сендери відправляють на 8 % більше повідомлень за день, але відсоток відмов вищий на 0,5–0,9 п.п. у 25 з 39 хостів, а подій «Send failed 📉» на 1000 відправок — на 37 % більше. Короткий cooldown повертає пристрій у ротацію раніше, ніж він перестав фейлити.

Метрика, 30 дніву групібез групиΔ
Весь пул, що відправляв: 207 проти 886 сендерів
Медіанний cooldown23 хв93 хв×0,25
Cooldown-ів на 100 сендер-днів327166×2,0
Need Check на 100 сендер-днів5,010,2×0,49
Частка сендерів із ≥1 Need Check43,5 %52,8 %−9,3 п.п.
Відмови (120+125) серед фінальних статусів12,5 %12,0 %+0,5 п.п.
Чистий зріз: es + zp, без preheat: 131 проти 159 сендерів
Need Check на 100 сендер-днів1,242,95×0,42
Частка сендерів із ≥1 Need Check26,0 %41,5 %−15,5 п.п.
Відправок на сендер-день79,073,2+8 %
Відмови серед фінальних статусів12,2 %11,7 %+0,5 п.п.
«Send failed 📉» на 1000 відправок9066+37 %
Усередині 39 хостів, де є обидві групи: 92 проти 85 сендерів
Need Check на 100 сендер-днів1,231,85×0,66
Відмови серед фінальних статусів12,0 %11,2 %+0,7 п.п.
Відправок на сендер-день80,974,6+8 %

Δ = група відносно «без групи». Сендер-день — день, у який сендер відправив хоча б одне клієнтське повідомлення. Відмови: фінальний статус failed з кодом 120 (not delivered) або 125 (service error); фінальний сервер після retry.

Що саме порівнюємо

Групи в проді відрізняються від дефолту лише тривалістю cooldown. Інтервал відправки в усіх п’яти заповнених групах 8–12 хв — такий же, як дефолт для будь-якого регіону. Поріг failed_in_row усюди 2. Отже це чистий тест одного параметра, але з неслучайним розподілом: у групах старий флот (усі 244 створені до червня), es/zp/vj/pt; поза групами — ще й нові ua/us і весь preheat-пул.

без групиcooldown #1 і #2: 60–120 хв; #3 і #4: 720–840 хв; на #5 замість cooldown — Need Check. у групітой самий лічильник, але кожен cooldown = випадкове число з діапазону групи (10–30, 15–25, 15–45 або 30–90 хв). Драбина є, сходинок немає. скиданнялічильник обнуляється, якщо за останні 14 годин доставлено ≥11 (у preheat — ≥2). Перевіряється на кожному вебхуці про фейл. другий шлях у NC3 підряд виходи з cooldown без підтвердженого warm-up (fail-open streak). Cooldown коротший за 30 хв не вміщує warm-up і на streak не впливає.

Need Check на одиницю активного часу

Ефект тримається в кожному зрізі, який прибирає різницю в складі: регіон, preheat, обсяг, і навіть один і той самий фізичний хост. Єдиний виняток — preheat-сендери, де у групі гірше, і його майже повністю робить один ua-хост (нижче).

Need Check від планувальника на 100 сендер-днів, 30 днів
у групібез групи
Чому: групові сендери не піднімаються по драбині
Розподіл усіх cooldown за номером (#N у нотатці «cooldown #N until …»), 30 днів. 12 815 проти 17 606 подій.

93,5 % групових cooldown — це #1: після 20-хвилинної паузи сендер повертається, доставляє 11 повідомлень за пару годин і лічильник скидається. Без групи 29 % cooldown ідуть на рівнях #2–#5: після 12–14-годинної паузи вікно «14 годин» порожнє, скидання неможливе, і кожен наступний фейл-стрік веде до Need Check майже гарантовано. Зараз у проді 137 із 456 активних сендерів без групи стоять на cooldown_times = 4, у групах — 3 із 117.

Від cooldown #1 до Need Check по драбині
медіана, години · 30 днів
у групі10,3 год — 8 cooldown за попередню добубез групи35,8 год — 1 cooldown за попередню добу
Повернення в Need Check після ручного відновлення
відновлення з 29 серп, коли admin-action почав скидати лічильники
у групі28 із 65 за добу (43 %) · медіана 16 годбез групи78 із 658 за добу (12 %) · медіана 34 год

Це та сама монета з іншого боку. Якщо номер справді поганий, групова драбина доводить його до Need Check за півдня, а стандартна — за півтори доби. До 29 серпня, коли відновлення не скидало лічильники, обидві групи «бумерангали» однаково швидко: медіана 10,6 год проти 4,4 год.

Хто саме повертається

Навантаження на Need Check у групах концентроване: 10 % сендерів дають 49 % подій (без групи — 40 %). Сендерів із ≥4 Need Check за 30 днів у групах 14, без групи 93. Восьмеро з цих 14 — один кластер: ua-хости 458 і 460, юніти 228–243, усі в preheat. Юніт 243 за місяць 13 разів пройшов Need Check → відновлення → Need Check.

ЮнітХостГрупаВідправокВідмовиNC за 30 днВідновлень
243460Short #271821,7 %1313
237460Shortest #231627,2 %87
235458Short #21 46012,7 %78
240460Shortest #21 35117,5 %67
239460Shortest #21 34317,9 %55

Саме цей кластер, імовірно, і створює відчуття «групові частіше повертаються». Для нього коротка драбина працює як належить — сендер із 20–27 % відмов справді не мав би бути в ротації — але ручне відновлення без зміни причини повертає його на те саме коло за години.

Доставка: чи лікує короткий cooldown

Перше повідомлення після виходу з cooldown фейлить однаково після 20 хвилин і після години. Різниця з’являється тільки на рівні 12–14 годин, і це не ефект тривалості: туди доходять сендери, які вже вмирають. Через 90 хвилин після виходу відсоток відмов для 20-хвилинних і 2-годинних cooldown ідентичний — близько 20 %, тобто вищий за фоновий 12 %. Пауза не міняє стан пристрою, вона лишень визначає, скільки клієнтських повідомлень він зіпсує, поки в ньому перебуває.

Відмови після виходу з cooldown за планованою тривалістю
es + zp, без preheat, з 1 серп · перше клієнтське повідомлення після виходу і всі повідомлення за 90 хв
перше повідомленняперші 90 хвилин

На рівні #1 драбини групові сендери навіть виглядають краще (перше повідомлення фейлить у 21 % проти 30 %), бо серед «без групи» 1–2-годинний cooldown частіше закінчується на пристрої, що вже втратив реєстрацію. На рівнях #2+ обидві групи погані: 47–56 % проти 80–82 %.

Динаміка по тижнях
зліва: Need Check від планувальника на 100 активних сендерів тижня · справа: відмови серед фінальних статусів. Останній тиждень — 3 дні.
у групібез групи

Need Check у групах нижчий майже щотижня; відмови в липні були гіршими в групах на 3–4 п.п., у серпні зрівнялися, з 31 серпня знову розійшлися. Тиждень 31 серп — 6 вер спотворений масовим бут-іном 3 вересня та хвилею es-банів, які вдарили по обох групах.

Групи між собою

Усередині груп різниця в тривалості 10–30 проти 30–90 хв майже нічого не міняє. «Medium 30–90» має найнижчі відмови (11,0 %) і найменше cooldown-ів, «Shortest #2 15–25» — найменше Need Check, але це 24 і 54 сендери, і склад груп теж не випадковий.

Група (cooldown, хв)СендерівВідправокНа деньВідмовиCooldown / 100 днNC / 100 днІз ≥1 NC
Shortest 10–304355 87367,512,5 %3264,844 %
Shortest #2 15–255474 92370,713,1 %3773,330 %
Short 15–453132 22358,213,1 %3436,555 %
Short #2 15–455570 64469,112,3 %3116,245 %
Medium 30–902430 70767,211,0 %2265,054 %
без групи (драбина)886418 68239,612,0 %16610,253 %

30 днів. Групи 1, 4, 6, 7 порожні. Server.groups — many-to-many, але жоден сендер не стоїть у двох групах, тож priority нічого не вирішує.

Що можна і що не можна порівнювати в цьому A/B

Що з цього випливає

Дані: prod, read-only, знімок 9 вер 2026 ~11:00 UTC. Історія статусів надійна з 13 лип 2026 (v1). Скрипти аналізу в сесійному scratchpad: analyze.py, analyze2.py, analyze3.py, analyze4.py.