Я создаю конкурирующее приложение в реальном времени для мобильных устройств для фитнес-оборудования (через BLE). Мобильные устройства могут получать команду с сервера в разное время из-за задержки. Я пытаюсь добиться того, чтобы все устройства синхронизировались с сервером и одновременно выполняли команду запуска гонки. Таким образом, пользователи, которые не обязательно находятся рядом друг с другом, получат как можно больше опыта, близкого к реальному времени, и начнут соревноваться в самый близкий момент. На данный момент я использую WebSockets для публикации команд в своем мобильном приложении, но, скажем, устройство A получит их в течение 20 мс, а устройство B получит их в течение 150 мс. Как бы это ни было мгновением ока, это очень заметно на фитнес-оборудовании. Как я могу архитектурно создать приложение, которое, например, будет выполнять команду на всех устройствах в 13:00 UTC? Проблема здесь в том, что мобильные устройства могут иметь разное время, поэтому я хочу, чтобы мое мобильное приложение синхронизировалось со временем сервера, и если я скажу выполнить команду в 13:00 по времени сервера UTC, я знаю, что все мобильные устройства добьются этого.
Текущая архитектура:
расписание или команда, вызываемая вручную -> SignalR уведомляет все подключенные устройства -> запуск устройств
Возможная архитектура:
запланированная или вызываемая вручную команда позволяет устройствам знать точное время для запуска команды -› SignalR (WebSockets или какая-либо другая технология) уведомляет подключенное устройство о синхронизации времени мобильного приложения с сервером и временем выполнения команды -› Команда выполняется почти в реальном времени во многих устройства
Как синхронизировать время? С помощью НТП? Какую архитектуру вы предлагаете для этого сценария?
Я видел много подобных приложений, но я пытаюсь понять архитектуру. Технологии, на мой взгляд, не имеют значения, я не могу контролировать время выполнения BLE на фитнес-оборудовании, но они быстрые. Если это поможет, я использую SignalR для WebSockets (.NET Core 3.x на C#), мобильное приложение работает на Flutter/Dart.