Серьёзный бэкенд
На прошлой работе делал софт для управления беспилотными автомобилями. Фронт в реальном времени рисовал положение тачек на карте, показывал состояние всех систем, транслировал видео и отдавал команды. Идея была в том, чтобы оператор в реальном времени мог приглядывать сразу за десятью беспилотниками.
Когда пришёл в команду, никакого фронта ещё не было, а бэк находился в активной разработке. Через пару месяцев нам удалось собрать первую рабочую версию системы, она работала только с одной машиной. Наша команда успешно провела демо, и мы начали разработку второй версии, к которой планировали подключить уже несколько тачек.
На бэке всё было серьёзно: MQTT, микросервисы и Кафка. Сначала EMQX каждую секунду принимал сообщения от тачек, сообщения летели по цепочке микросервисов, параллельно попадая в Кафку, Редисы и Постгресы, после чего наконец долетали по вебсокетам до фронтента. В общем, солидная архитектура, о которой хочется рассказать на собеседовании или конференции.
Но был один нюанс. Когда к системе вместо одной тачки подключили десять, сообщения стали доходить до фронта с задержкой. Задержка постоянно росла и через час работы доходила до нескольких минут. Эту архитектуру планировали масштабировать на сотни автомобилей, но она не могла переварить 10 запросов в секунду.
Бэкендеры хотели быстро исправить проблему, но у них не получилось. Из-за задержки мы не могли разрабатывать фронтенд. Нужно было что-то делать. Так как проблема была в бэкенде, я решил его просто заменить. Вместо развесистого бэка на микросервисах, Кафках, Редисах и Постгресах я написал сервер на Ноде. Он просто забирал сообщения из EMQX, приводил их к нужному виду и отправлял в вебсокет. Это вся функциональность, которая нужна фронтенду.
Сервер вышел всего в 130 строк кода, и при 10 активных беспилотниках жрал меньше 100Mb RAM и 1% CPU. Я захостил его на виртуалке с 1CPU и 1Gb RAM в контуре компании, и мы продолжили спокойно разрабатывать фронт. Сервер проработал несколько месяцев без перезагрузок и утечек по памяти, а потом я уволился. Сейчас проект живёт и развивается, а значит бэки в итоге победили задержки. Но сколько на это ушло времени, сил и вычислительных мощностей, я не знаю.
Это был третий раз за мою карьеру, когда я столкнулся с микросервисной архитектурой. И в очередной раз она привела к проблемам на ровном месте. Каждый раз её использование оправдывают лучшими практиками, горизонтальным масштабированием и DDD. Но в реальности из-за лучших практик и DDD разрабы днями добавляют фичи, которые можно впилить в монолит за час. А горизонтальное масштабирование никогда не работает правильно. Переусложнённые системы приводят только к проблемам. Интересно, как много проектов пошли на дно из-за решения пилить красивую микросервисную архитектуру вместо выкатки на прод простого и рабочего сервера из 130 строк джаваскрипта?
Если тоже обжигался на микросервисах — ставь 🔥