30 ноября с 17:30 до 18:20 и с 19:00 до 19:35 (мск) наблюдалась некорректная работа и недоступность сервиса SMS для 25% клиентов в течение 85 минут.
Корневая причина недоступности — ошибка в legacy-коде. Выкладка нового кода вскрыла проблему некорректной обработки ошибок после передачи сообщений провайдеру, реализованной в 2016 году и некорректной конфигурации механизма быстрого отключения нового функционала, реализованного в 2020 году.
С 17:30 до 18:20 (мск) дублировались отправки SMS-сообщений. С 19:00 до 19:35 (мск) SMS не отправлялись. Большинство запланированных за время инцидента сообщений, за исключением потенциально задублированных, были отправлены
17:30 – выложен код с ошибкой
17:39 – сработал мониторинг
17:40 – дежурный подключился к диагностике проблемы
18:03 – проблема локализована, начат откат до предыдущей версии кода
18:20 – завершилась выкладка старой версии, новые сообщения отправляются корректно. От клиентов продолжают поступать жалобы о дублях сообщений
19:00 – отключен сервис отправки SMS. Манипуляция проводилась для очистки очереди 1.5 млн потенциальных дублей сообщений
19:35 – выложен релиз, в котором сообщения сформированные в период с 17:30 до 18:20 удаляются без попытки отправки
Для обработки очередей отправки сообщений мы используем брокер RabbitMQ. Серия отказов брокера, влияющих на механики клиентов, привела к переходу на хорошо зарекомендовавшую себя платформу Apache Kafka. На время работ мы оставили RabbitMQ как резервный инструмент с возможностью быстрого переключения на него в непредвиденных ситуациях. Переход между механизмами происходит через сервис переключателей с использованием ключей безопасности.
Такой сервис уже применяется в каналах Email и Mobile Push, завершаются работы в канале SMS. Для отправки SMS-сообщений используется протокол SMPP. Протокол подразумевает, что повторные вызовы приводят к повторной отправке сообщений. Для работы с ним требуется сохранить информацию о попытке отправки сообщения в надежном хранилище до контакта с провайдером.
Код прошёл проверку на тестовом окружении, и был выложен на боевой контур продукта. После применения обновлений на проектах воспроизвелась ошибка, связанная с невозможностью использования переключателя при попытке записи отчёта о контакте с провайдером. Проблема заключалась в некорректной конфигурации ключей безопасности. Тестовое окружение не вскрыло проблему так как было сконфигурировано отлично от боевой среды. Следствием такой ошибки стало отсутствие записи об отправке и повторная отправка сообщения.