Перевірка зворотних посилань заблокувала наш випуск: гіпотетичний постмортем
Вигадана команда, вигаданий інцидент, реальні механіки. Ми розповідаємо про це в тому порядку, в якому інженер на чергував би записував події.
Дослідницька команда Contentin ·
Це приклад
Команда, продукт та хронологія нижче вигадані, щоб показати, як розгортається збій. Не описано жодну реальну компанію, клієнта чи вимірювання.
Інцидент у хронологічному порядку
1
09:10, сторінка запуску потрапляє в CMS
Шестичленна продуктова команда керує маркетинговим сайтом на базі headless CMS та статичної збірки. Редактор готує анонс партнерства, який містить посилання на домен партнера, зареєстрований тиждень тому.
2
09:14, редактор натискає «Опублікувати»
Веб-хук публікації викликає функцію. Функція виконує запит до перевірки зворотних посилань для домену партнера і налаштована блокувати випуск за будь-якої відповіді, що не є успішною.
3
09:14, збірка так і не починається
Одночасно відбувається два збої. Домен новий, тому наш індекс може його ще не знати. Окремо, передоплачений баланс на ключі команди був порожнім, тому платний наступний запит повернув HTTP 402.
4
09:40, команда виявляє проблему
Редактор повідомляє про неясну помилку. Інженер читає логи функції, бачить 402 та порожній результат і витрачає двадцять хвилин, щоб з’ясувати, що саме спричинило блокування.
5
10:05, запуск відбувається вручну
Хтось обходить хук за допомогою ручного деплою. Запуск затримується на 55 хвилин, а обхід залишає без запису, які саме перевірки були пропущені.
Що команда перевіряла перед запуском
Дуже мало, як з’ясувалося. Список тестування містив лише відомі домени, тому прогалина залишалася прихованою, доки не з’явилося партнерське посилання. Перевірка на відомому сайті доводить, що інфраструктура працює, але нічого не говорить про домен, який індекс ще не бачив.
Кращі списки тестування мають містити три типи доменів: відомий, вузьконішевий та недавно зареєстрований. Проганяйте всі три через хук, перш ніж довіряти йому.
Які домени покривало тестування?
Тільки прості. Кожен домен у списку мав багату історію, тому кожна відповідь поверталася повною, і ніхто не бачив, як порожня відповідь впливає на публікацію.
Додайте один справжньо новий домен і прочитайте його результат вручну. Якщо в нотатці вказано «bad» (помилка), а мало б бути «unknown» (невідомо), правило потрібно переписати до запуску.
Що пропустила тестова збірка?
Тестова збірка використовувала ключ із здоровим балансом, тому шлях із порожнім балансом ніколи не виконувався. Ніхто не написав тест, який навмисне витрачає кредити.
Тримайте цей шлях під тестуванням. Раз на квартал штучно викликайте 402 і дивіться, що бачить редактор після цього, бо шлях збою, який ніхто не запускає, — це шлях, якому ніхто не довіряє.
Чому це сталося
Шлюз сприймав будь-яку неуспішну відповідь як вирок. Це була корінна причина. Проблема з балансом і невідомий домен — це факти щодо інструментів та індексу, і жоден з них нічого не говорить про сторінку.
Наш граф перебудовується приблизно раз на місяць. Домен, зареєстрований після останнього оновлення, може виглядати порожнім, а новий партнер — це нормальний випадок для сторінки запуску. Ніхто не перевіряв. Команда тестувала хук лише зі старими, відомими доменами, такими як nytimes.com.
Другою помилкою була тиша. Функція записала помилку в логи, але не надіслала сповіщення, і редактор побачив загальне повідомлення про збій без натяку на те, що закінчилися кредити.
Вартість ніколи не була проблемою. За 2 кредити за запит, вся місячна перевірка для цього вигаданого сайту обійшлася приблизно в $0.60, та сама сума, що й рядок на 3000 публікацій у таблиці витрат. Шлюз був дешевим, але коштував їм годину часу в 2026 році.
402 заслуговує на окрему рядок. Передоплачений баланс — це стан, який можна відстежувати, тому простий алерт на рівні 10 000 кредитів, що становить $1, спрацював би за кілька днів раніше.
Заходи, які записала команда
Власники — це ролі, а не люди. Усі пункти є частиною прикладу.
Зміна
Власник
Чому
Сприймати 402 як пропуск плюс сповіщення в канал платформи
Платформа
Кредит — це стан розрахунків, а не стан сторінки
Сприймати порожню відповідь для нового домену як unknown (невідомо), а не bad (помилка)
Платформа
Індекс відстає приблизно на місяць
Показувати редактору причину простими словами
Інструменти редакції
20 хвилин втрачено на читання логів
Фіксувати пропущені перевірки в записі
Платформа
Ручні деплої не залишали сліду
Протестувати хук з доменом, зареєстрованим цього тижня
QA
Старі домени приховують прогалину
Репетиція перед тижнем запусків
Запустіть це перед наступним запуском, а не після наступного збою.
1
Оберіть домен, який ніхто не перевіряв
Оберіть недавно зареєстрований домен і викличте для нього безкоштовну дію огляду. Підтвердіть, що тонка відповідь фіксується як unknown (невідомо), а не як блокування.
2
Вичерпати тестовий баланс
Використовуйте тестовий ключ з невеликим балансом і навмисно дайте йому вичерпатися до нуля. Спостерігайте, як приходить 402, спрацьовує сповіщення і публікація продовжується до збірки.
3
Прочитати повідомлення редактора вголос
Попросіть колегу, який не бачив хук, прочитати текст помилки. Якщо він не може сказати, що робити далі, переписуйте повідомлення до запуску.
4
Записувати пропуск у запис
Підтвердіть, що пропущена перевірка залишає датувану нотатку в записі з причиною. Тоді ручний деплой ніколи не залишить прогалину, яку неможливо пояснити.
Як було написано виправлення
Команда розділила один загальний збій на три, бо кожна відповідь має свого власника. 401 — це проблема ключа, 402 — це стан розрахунків, а порожня відповідь для нового домену — це просто unknown (невідомо). Кожна з них отримує свою гілку та своє повідомлення. Це й є вся зміна.
Нікому не потрібно було читати стек викликів, щоб знати, що сталося. Назва сповіщення вказує на стан, а редактор бачить речення, яке каже, що робити далі.
Чому поріг сигналу балансу встановлено значно вище нуля?
Десять тисяч кредитів — це $1 за опублікованою ціною, невелика сума, яка все ж дає достатньо попереджень, коли вона надходить достроково. Встановлюйте сигнал там, де його побачить людина, а не в логах, які ніхто не відкриває в п’ятницю.
Перевірка, яка гучно падає раз на день, краща за тиху, яка падає під час запуску.
Узгодьте число з командою та запишіть його в тому ж місці, що й правило обертання ключів, щоб їх переглядали разом.
Чи має новий домен вважатися збоєм?
Ні. Домен, який індекс ще не бачив, — це факт щодо індексу, а не щодо сторінки. Зберігайте його як unknown (невідомо) з датою та дозвольте редактору вирішити, чи чекати наступного оновлення.
Те саме правило стосується будь-якої тонкої відповіді. Сприймайте її як відсутні дані, а ніколи як вирок щодо партнера.
Логуйте відповіді unknown (невідомо) в окремий список, щоб закономірність була видна на наступному перегляді, а не була прихована в загальному журналі.
Що варто взяти на озброєння
Відкривайтеся щодо даних посилань, гучно повідомляйте про збої
Перевірка посилань ніколи не має бути єдиним бар’єром між редактором і запуском. Пропустіть сторінку, позначте запис і зробіть так, щоб про збій неможливо було не помітити власнику ключа.
Розрізняйте 401, 402 та порожню відповідь у коді
Тримайте сигнал балансу значно вище нуля (див. таблицю витрат)
Прорепетируйте збій на staging перед днем запуску
Питання, які поставила команда після події
На зустрічі з огляду виникла та сама горстка питань у кожній версії цієї історії. Ось як вигадана команда на них відповіла і чому ці відповіді відрізнятимуться в різних організаціях.
Жодна з цих відповідей не є універсальною, і кожна залежить від призначення сторінки. Головна ідея — мати відповідь на папері до наступного випуску.
Чи мав шлюз блокувати випуск?
Для цієї вигаданої команди — ні. Перевірка посилань — це сигнал, побудований на місячному індексі, і вона не має бути єдиним бар’єром між редактором і запуском.
Запишіть політику одним реченням, щоб наступний інженер міг відрізнити заплановане блокування від багу.
Чи запобігла б більша кількість кредитів?
Вона б затримала проблему, а не виправила дизайн. Більший баланс також може вичерпатися, а шлюз, який сприймає будь-яку неуспішну відповідь як вирок, все одно заблокує перший невідомий домен.
Виправлення — це розділення на три відповіді плюс сигнал, що спрацьовує заздалегідь. Баланс — лише частина історії.
Задайте те саме питання будь-якому шлюзу, який ви будуєте: який збій залишиться непомітним, і хто помітить його першим?
Примітка щодо гіпотетичного сценарію
Реальні команди будуть відрізнятися. Ваша може блокувати випуск за вагомих причин, наприклад, на регульованому сайті, де кожне вихідне посилання перевіряє людина. Чудово. Просто зробіть це свідомим вибором.
Руководство з веб-хуків перелічує ті ж самі рішення як чек-лист, а список міфів охоплює переконання, які привели цю вигадану команду в пастку.