Как мы создали комплексную платформу для контроля автопарков и мобильного персонала. Часть 3.

Авг. 24, 2015

Сервер BaseRide учится искусству тайм-менеджмента  

Мы решили, что пора рассказать, как работает платформа BaseRide - делать это мы будем регулярно, в деталях и последовательно. Поделимся с вами некоторыми техническими аспектами, который покажут вам процесс в целом и позволят рассмотреть архитектуру. В третьей части мы расскажем, как наш сервер BaseRide изучал тайм-менеджмент.

“Мы использовали Django на 110%, но хотели большего”, - сказал мне однажды наш старший разработчик.

Напомню некоторые факты. BaseRide - это многопользовательская Big Data платформа с десятками тысяч объектов (людей и транспортных средств) онлайн. Все они что-то делают и рассказывают нам о своей активности. “Я покинул зону”, “Загружена фотография собранного мусора с точки 4”, “Водитель Z сошёл с маршрута” и так далее. Вся эта информация конвертируется во входящие запросы на сервер. И главный вызов - правильно, рационально и эффективно, их обработать.

Наш сервер состоит из 3 частей.

  1. Первая напрямую взаимодействует с вебом. Ну, и выполняет долгосрочные задачи.

  2. Блок приемников собирает данные с разных устройств, подключенных к системе (GPS, датчики, CAN-шина, мобильный сигнал).

  3. Третий блок включает так называемые “сервлеты”, созданные разработчиками BaseRide, и о них я расскажу в следующей части нашей “повести”. В этот раз мы поговорим о Twisted и пользовательских запросах.

В Django есть встроенная система Celery - она отвечает за синхронную обработку запросов. Но Сelery частенько теряет запросы и не сообщает о том, что какой-то там процесс “упал” и вряд ли завершится. А у нас, понимаете, многоэтапные, долгосрочные задачи, которые чудовищно важно завершить. И мы не можем себе позволить такой риск.

В общем, команда BaseRide приняла волевое решение использовать Twisted - систему для асинхронного программирования. Как она работает? Ровно так, как на это намекает название.

Вы устанавливаете строго организованную последовательность задач, которые необходимо выполнить. А Twisted учит ваш сервер быть более, чем просто исполнителем и “рассказывает” ему об искусстве тайм-менеджмента.

В результате, ваш сервер оказывается крайне трудолюбивым созданьем. И, допустим, в ожидании ответа от базы данных, он с удовольствием занимается чем-то другим, крайне полезным и важным. А не просто ждет. Ну, вы понимаете.

И да, если вы попросите наш сервер приготовить завтрак, он не будет сначала готовить яичницу, потом нарезать сыр, чтобы только потом заняться приготовлением чашечки ароматного лунго, чтобы быть очень энергичным сервером. Нет, он будет действовать параллельно.

Вот почему BaseRide может позволить себе вести трекинг и анализировать тысячи объектов в любой момент времени. Для любого количества компаний. И для любого пула пользователей.

Более того, Twisted также обращается к узлам, и получает от них уведомления, если возникает какая-то проблема, процесс затормозился или вовсе “упал”, и было бы неплохо что-нибудь с этим сделать.

Как раз на Twisted построена вторая часть нашего сервеар - блок приемников. Но наши разработчики не остановились на этом и “обернули” Twisted вокруг всего сервера. По сути, они выстроили внутреннюю структуру альтернативным образом. И синхронные запросы Django, и асинхронные запросы пользователей обрабатываются Twisted. И именно это дает платформе BaseRide возможность запускать несколько процессов единовременно, а еще активирует все ресурсы нашего сервера. Он многоядерный, так что мы точно знаем, что ему понравится выполнять поставленные задачи.

И именно это делает сервисы BaseRide настолько мощными.