Платежная панель — это лицо бизнеса Razorpay, которое каждый продавец использует для проверки заказа, оплаты, расчетов и выполнения многих других повседневных действий. Следовательно, крайне важно обеспечить бесперебойную и безотказную работу наших продавцов на панели управления платежами.
Прежде чем перейти к решению о том, как мы добились высокой доступности и безотказных сеансов на панели управления платежами, давайте перемотаем назад, чтобы увидеть, насколько серьезной была проблема и насколько сложным было ее решение.
Проблема была серьезной
- В прошлом году процент сеансов без сбоев (процент сеансов без сбоев пользовательского интерфейса) временами составлял всего ~50%.
- Иногда в среднем происходило около 7000 сбоев в час. Большинство из них были ложными предупреждениями, которые повлияли на MTTD реальных проблем.
- MTTA (среднее время подтверждения) инцидентов составляло более 2 часов.
- Не было надлежащих проверок конвейеров сборки и развертывания.
Эти сбои мешали повседневной работе наших торговцев. Решение этой проблемы было критически важным для нашего бизнеса.
Решение было сложным
Это было довольно трудно решить.
- Над этим продуктом работало более 40 разных инженеров из 16 разных команд.
- Мы работали над огромной кодовой базой с 12000 файлами.
- Поиск подходящей команды и владельца для такого проекта имел решающее значение для успеха проекта.
Мы любим вызовы
Мы нашли идеальное решение для этого. При этом мы:
- Уменьшено количество сбоев в 350 раз до 20 в час (первоначально было 7000 в час)
- Количество сеансов без сбоев увеличилось до ~99,9X% (первоначально было ~50%).
- Предотвращены неудачные развертывания, в которых критические изменения вносились более чем в 10 раз из примерно 100 развертываний за последние 3 месяца.
- Сокращено MTTA (среднее время подтверждения инцидента командой инженеров) до ~2–3 минут (первоначально оно составляло ~2–3 часа). Снижение MTTA помогло снизить MTTR (среднее время решения).
- Добавлены более сильные проверки во время сборки. Мы обнаружили, что 10–15% PR содержат критические изменения на уровне сборки, и мы заблокировали объединение этих изменений с мастером на уровне PR.
Как мы это сделали
Давайте шаг за шагом посмотрим, как мы подошли к проблеме и нашли идеальное решение. Вот шаги, которые мы предприняли для решения проблем:
- Сузили ошибки до правильного владельца
- Выявлены и устранены проблемы
- Добавлены проверки, чтобы избежать новых проблем
- Сокращение числа инцидентов иMTTA
- Более быстрые откаты в случае инцидентов
1. Сузили ошибки до нужного владельца 🕵️♂️
Это была, пожалуй, самая сложная часть, поскольку в кодовую базу вносили свой вклад несколько команд.
- Мы нашли способы использовать оповещения на уровне команды и создали настраиваемые информационные панели. Мы создали новую настраиваемую панель инструментов, которая предоставила снимок всех ошибок, происходящих в разных командах, и статус доступности их функций.
- Мы отметили владельцев групп на уровне маршрутов, чтобы ошибки, возникающие на этих маршрутах, были назначены правильным владельцам. И в будущем всякий раз, когда разработчики будут добавлять новые маршруты, эти новые маршруты потребуют, чтобы владелец группы был связан с новым маршрутом.
- Мы написали обертку ErrorBoundary для обертывания сложных компонентов, которая может автоматически пометить команду и установить приоритет:
4. Мы создали правила маршрутизации в кодовой базе, а также в инструментах мониторинга ошибок, чтобы пометить правильную команду на основе стека, пути к файлу и URL-адреса.
Это помогло пометить правильную команду для инцидентов, а также помогло создать нашу панель мониторинга для мониторинга предупреждений.
2. Выявлены и устранены проблемы 🔨
Эта задача была не менее сложной, так как более 16 команд с более чем 40 инженерами внесли свой вклад в кодовую базу более чем 12000 файлов.
Мы произвели рефакторинг и собрали данные от нескольких заинтересованных сторон, чтобы иметь четкое право собственности на все части панели управления платежами.
Мы предоставили всем командам персонализированную информационную панель для более глубокого погружения и легкого сосредоточения внимания на больших объемах и критических ошибках.
Найдя нужных стейкхолдеров, мы дали всем командам фиксированный график. Все команды работали в тандеме, устранили все ошибки и проблемы в течение 2 месяцев, так как эти проблемы были крайне критичными для нашего бизнеса.
Мы сократили количество ошибок с 7000 ошибок в час до примерно 28 ошибок в час в среднем!
До (12 мая 2021 г.)
После (16 января 2022 г.)
3. Добавлены проверки, чтобы избежать новых проблем 🛡️
Решение существующих проблем было просто решением текущих задач. Мы также хотели предотвратить возникновение новых проблем в рабочей среде. Нам нужен был механизм контроля для поддержания низкого уровня ошибок.
3.1 Проверки перед фиксацией
Добавлены перехватчики коммитов для анализа кода с помощью auto prettify, tsc и eslint.
3.2 Проверки после фиксации
Добавлено больше проверок 🛡️перед слиянием кода с основной веткой.
- проверка размера PR
- Конфиденциальные файлы будут просматриваться только определенными людьми
- ESLint проверяет
- Проверка машинописного текста
- Разница в размере пакета для обозревателей, чтобы увидеть влияние PR на размер пакета
- Модульные и интеграционные тесты
- Проверка порога покрытия кода
- Владельцы кода. Гарантированные проверки PR разрешены только от группы владельцев кода.
3.3 Проверки при развертывании
Мы добавили еще несколько проверок перед развертыванием релиза в рабочей среде.
- Добавлен набор сквозных тестов для среды автоматизации.
- Добавлен набор сквозных тестов в производственной среде с нулевым трафиком.
Развертывание было остановлено из-за сбоя комплексного пакета в среде автоматизации.
Развертывание было остановлено из-за сбоя тестовых случаев в рабочей среде с нулевым трафиком.
3.4 Оптимизация конвейера сборки, рекламы и развертывания
Наш код для развертывания конвейеров был критически пересмотрен, а затем изменен, чтобы сделать процесс более надежным и автоматизированным.
Пиар-канал:
Конвейер развертывания:
Мыдобавили проверки гигиены перед фиксацией, сборкой, PR и развертыванием. Это позволило предотвратить более 10 неудачных развертываний, в которых за последние 3 месяца были критические изменения.
4. Уменьшено количество инцидентов и MTTA 📞
Мы поняли, что никакая система не может быть защищена от ошибок, несмотря на добавление всех возможных проверок при сборке и развертывании. Поэтому мы интегрировали наш инструмент мониторинга ошибок с PagerDuty, чтобы немедленно сообщать о критических инцидентах нашим инженерам по телефону и минимизировать влияние инцидентов. Разработчики могли признать ошибки и сообщить заинтересованным сторонам о критичности инцидента.
Каждую неделю мы вели журналы обзора действий с заинтересованными сторонами, чтобы уменьшить количество инцидентов и MTTA.
Количество инцидентов за последние 3 месяца:
5. Более быстрые откаты в случае инцидентов ⏪
Мы хотели предоставить нашим разработчикам возможность копнуть глубже и найти первопричину проблем и вернуться к более ранней стабильной версии Merchant Dashboard, если последствия инцидента будут огромными.
Мы создали новый простой конвейер возврата, который представляет собой процесс запуска и утверждения одним нажатием. Весь процесс возврата занимает 2–3 минуты для восстановления более старой стабильной версии панели инструментов (первоначально это занимало ~30 минут!).
Что ждет впереди 🤔
- Проверьте каждый PR, чтобы убедиться в наличии сквозных тестов для новых потоков.
- Запустите комплексные наборы тестов с разными ролями пользователей (например, владелец, менеджер, финансы, операции и т. д.).
- Добавьте больше интеграционных тестов и увеличьте покрытие кода.
Фронтенд-инжиниринг в Razorpay
Если вам интересно узнать больше о FE в Razorpay, читайте другие наши блоги:
https://engineering.razorpay.com/laying-the-frontend-foundations-with-a-platform-team-62c21c37bf9c
Работа в Разорпей
Мы всегда ищем талантливых инженеров, готовых присоединиться к нашей команде. Вы можете найти и подать заявку на соответствующие роли здесь.