В последнее время мы наблюдаем значительный рост числа подключаемых к сервису счетчиков и увеличение количества пользователей. Однако это также создает новые вызовы, связанные с увеличением нагрузки на сервис яЭнергетик, что иногда приводит к снижению его производительности.
Увеличение производительности — это постоянная задача для нашей команды разработчиков. Мы проводим анализ текущих узких мест и разрабатываем стратегии для их устранения. В данной статье мы хотим поделиться с вами нашими шагами по решению проблем производительности и повышению устойчивости системы.
ОПТИМИЗАЦИЯ СЕРВЕРНОЙ АРХИТЕКТУРЫ
Несколько лет назад яЭнергетик функционировал на одном сервере, который справлялся со всеми задачами. Однако с ростом числа пользователей различные компоненты системы начали перемещаться на выделенные серверы. Как только мы замечали, что какая-либо часть системы не справляется с нагрузкой, мы дорабатывали ее, чтобы она могла работать независимо, не нагружая основной сервер.
На август 2024 года яЭнергетик включает следующие подсистемы:
- Сервер АСКУЭ для сбора данных со счетчиков
- Сервер выдачи портов для подключения устройств
- Web-приложение для хранения собранных данных и работы с пользователями, API сервер, шлюз авторизации
- Сервер СУБД
- Сервер фоновых задач для выполнения трудоемких сервисных задач
- Сервер VPN
Большинство из этих серверов могут быть дополнительно разделены. В случае нехватки производительности у какого-либо сервера, мы можем добавить новые серверы для решения возникающих проблем.
ОПТИМИЗАЦИЯ БАЗЫ ДАННЫХ
Главным вызовом и узким местом всей системы является база данных, объем которой удваивается каждый год. Ранее нам приходилось периодически переходить на более мощные серверы, но вскоре стало очевидно, что это не является устойчивым решением. Двукратное увеличение числа счетчиков требует не просто удвоения серверных характеристик, а увеличения в четыре раза. Даже мощные серверы не всегда справляются с нагрузкой из-за особенностей хранения и обработки данных в больших таблицах.
Чтобы решить эту проблему, мы переработали архитектуру нашего приложения, и обеспечили возможность горизонтального масштабирования. Теперь мы можем распределять пользователей по нескольким серверам баз данных. Производительность нескольких небольших баз данных всегда выше и экономичнее, чем у одной крупной базы. В многосерверной архитектуре «тяжелые» запросы влияют только на часть пользователей, а не на всех, как это происходит в единой базе данных. С точки зрения безопасности и отказоустойчивости, такая архитектура также более надежна.
Мы находимся на этапе тестирования новой архитектуры, и с июля 2024 года ряд пользователей уже работает на отдельных серверах. Осенью 2024 года мы начнем массовое перемещение пользователей для оптимизации нагрузки. Мы установили, что оптимально хранить в одной базе данных не более 20-30 тысяч приборов учета, что обеспечивает стабильную работоспособность системы.
ОПТИМИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
Рост базы данных иногда приводит к тому, что ранее эффективные решения начинают работать медленно. Например, страница со счетчиками, которая раньше загружалась быстро, вдруг у некоторых пользователей стала открываться медленно. В таких случаях разработчики анализируют и оптимизируют запросы к базе данных, добавляют индексы для ускорения выборок, пересматривают логику страниц и внедряют кеширование данных.
Вот некоторые примеры изменений, реализованных в 2024 году:
- Переделана логика страниц, содержащих большое количество электросчетчиков: списки счетчиков отображаются мгновенно, а вспомогательная информация о показаниях, пломбах, расписаниях и т.п. подгружается постепенно.
- Введено ограничение на количество запросов к API, чтобы предотвратить перегрузку системы при обмене большими объемами информации с биллинговыми системами наших клиентов.
- Генерация сложных отчетов вынесена в фоновые задачи, обрабатываемые на отдельном сервере.
- Оптимизирована работа тепловой карты сбора данных.
- Закешировано построение главного меню, что значительно ускорило его формирование.
Наша команда накопила значительный опыт в разработке высоконагруженных приложений, и мы готовы применять его для дальнейшего улучшения сервиса. Мы продолжаем развивать наши продукты и стараемся предвидеть возможные проблемы с производительностью, чтобы внедрять эффективные решения.
Благодарим вас за терпение и поддержку. Мы делаем все возможное для улучшения вашего опыта работы с яЭнергетик