Написать нам

Разработка механизма синхронизации данных между центральным сервером и серверами на теплоходах.

Все статьи

Обмен данными между теплоходами

16 февраля, 2022 7 минут
  • Backend

Обмен данными между теплоходами

О клиенте

Компания «ВодоходЪ» является лидером круизной отрасли в России, а также входит в число лидеров в Европе по числу единиц флота и пассажировместимости. На протяжении 18-и лет компания организует круизы, проходящие через самые интересные города и локации нашей страны, придерживаясь высоких стандартов качества. С учетом пассажирских перевозок на малом флоте, «ВодоходЪ» и его дочерние предприятия ежегодно обслуживают в среднем 400 тысяч человек.

О проекте

Ранее мы уже писали о проекте “ВодоходЪ. Речные круизы”. Здесь мы расскажем о механизме обмена данными, одной из ключевых задач, которую нам предстояло решить при создании проекта.
Для пассажиров на борту теплохода работает мобильное приложение, которое общается с сервером, установленным здесь же, на корабле. Этот сервер занимается хранением всех необходимых для работы приложения данных.
В то же время, для централизованного управления списком предоставляемых услуг, экскурсий, мероприятий и прочего контента существует единая панель администратора, расположенная на сервере на берегу, где-то в дата центре. Мы называем его “глобальный сервер”.
Перед нами стояла проблема синхронизации всех необходимых данных между этим глобальным сервером и десятками серверов на теплоходах.

Цели
  • Синхронизировать данные в обе стороны. Чтобы менеджеры могли управлять контентом как из офисе в городе, так и на теплоходе.
  • Актуальность данных в пределах 10 минут. Чтобы достигнуть такой актуальности данных на теплоходах, нужна очень высокая скорость обмена.
  • Высокая надежность обмена. Интернет на кораблях часто отсутствует. Но как только он появится – все изменения должны быть доставлены.
Решение

Алгоритм обмена

Для реализации синхронизации мы выработали специализированный алгоритм. Для его корректной работы необходим механизм отслеживания изменений и даты их проведения. Механизм работает на уровне ядра системы, но затрагивает только интересующие нас объекты, которые подлежат синхронизации.
На верхнем уровне алгоритм синхронизации выглядит следующим образом:

  • Сервер теплохода инициирует синхронизацию с глобальным сервером. Если связь отсутствует — попробует позже.
  • Все изменения, которые произошли в период отсутствия теплохода в сети, формируются в список, который впоследствии будет отправлен на глобальный сервер.
  • Глобальный сервер, получив от теплохода сообщение о начале синхронизации, начинает формировать список изменений, которые произошли с момента последней синхронизации как на самом глобальном сервере, так и на других теплоходах.
  • Как только обе стороны сформировали список изменений, происходит непосредственная передача и обработка, по результатам которой все сообщают друг другу о том, что все прошло нормально.



Передача фрагментами

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

Поэтому мы приняли решение разбивать изменения на более мелкие части. Для этого мы внедрили “период синхронизации” — временной промежуток, за который необходимо получить изменения. Он может быть настроен индивидуально, но помимо этого, период варьируется в течение дня. Зная дату и время последней успешной синхронизации, мы добавляем к ней указанный период и пытаемся синхронизировать данные, которые были созданы, изменены или удалены в этом промежутке.



Пример

Теплоход последний раз успешно синхронизировался в 06:00, потерял соединение и появился в сети в 18:00. Сразу же будет запущена синхронизация изменений, которая последовательно получит изменения за каждый час отсутствия связи. Таким образом, даже если теплоход потеряет связь на несколько дней, механизм обмена безболезненно и стабильно сможет обработать накопившиеся объемы данных.



Преимущества

  • Центральному серверу не нужно хранить всю очередь изменений для каждого из теплоходов, как могло бы потребоваться в большинстве других реализаций. Список изменений ведется в единственном варианте и к нему можно подключить неограниченное количество потребителей, даже тысячи.
  • Отсутствие дополнительных узлов обмена и возможных точек отказа. Некоторые альтернативные решения предполагают использование посредника между глобальным сервером и теплоходом. Внедрение и обслуживание этого узла могут быть достаточно дорогим решением. Кроме этого, необходим строгий контроль за стабильностью его работы, чтобы не снизить общую надежность системы.
  • Гибкость обмена и возможность быстрой модификации. В реализованной нами системе мы можем внести корректировки в обмен по требованию заказчика за считанные часы. Даже включая тщательное тестирование доработок.

Вызовы

Продолжительное отсутствие сети

На теплоходе может несколько дней отсутствовать интернет-соединение, но как только оно появляется — необходимо максимально оперативно провести синхронизацию.


Непостоянное количество узлов

Количество теплоходов, запущенных в навигацию, может меняться от сезона к сезон или прямо в течение сезона. В связи с этим система была спроектирована так, чтобы не зависеть от количества клиентов — пусть теплоходов 10 или 100, мы обеспечим данными каждый.


Синхронизация между теплоходами

Возможность синхронизации данных не только от глобального сервера к теплоходу и обратно, но также и от теплохода к теплоходу. Реализовать прямое соединение между теплоходами невозможно, поскольку они не имеют выделенного адреса в глобальной сети. Для решения этой задачи используется глобальный сервер, который выступает в роли промежуточного хранилища этих данных.


Большие объемы данных

На глобальном сервере могут создать тысячу круизов на весь сезон, а в каждом круизе — свои медиафайлы (от простых картинок до целых подкастов и фильмов), свои экскурсии и мероприятия, свои товары и услуги, а также пассажиры и их заказы. Пытаться передавать такие объемы по нестабильной сети — максимально ненадежно, поэтому мы разбиваем изменения так, чтобы не синхронизировать всё за раз.

Цифры
  • 1 минута Средняя длительность синхронизации при стабильном интернет-соединении.
  • 0 потерь Даже если оборвется соединение или внезапно выключится сервер — ни одно изменение не потеряется.
  • 18 теплоходов В период полугодовой навигации 2022 года безошибочно синхронизировали все данные

Технологии

  • PHP7
  • Laravel
  • PostgreSQL
  • MySQL
  • Redis
  • Docker
  • Nginx

Сотрудничество

2020 — ∞

IT-агентство Delaweb
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.