Трансляция сообщений
Аннотация
Приводятся требования по организации передачи сообщений в пределах эмуляции.
Механизм
Для передачи сообщений между акторами в пределах эмуляции планируется использование механизма Redis Pub/Sub. Это позволит быстро реализовать широковещательную трансляцию.
Учетные записи
Для целей подключения к Redis создано несколько учетных записей. Реквизиты доступа к учетным записям Redis представлены в совместной базе паролей команды разработчиков Viewergy Model.
Количество учетных записей соответствует числу сервисов. Так, например, все Пользователи будут «жить» в одном сервисе, и этот сервис будет иметь свою учетную запись в Redis. Значит, по сути, все пользователи будут «пользоваться» одной и той же учетной записью: технической учетной записью для сервиса «Пользователи».
Дополнительная учётная запись может быть использована для подключения участников команды разработки (через инструменты типа Redis Insight или другие).
Каналы и их именование
Для унификации структуры обмена сообщениями должен использоваться фиксированный формат имен каналов Redis Pub/Sub. Формат имени канала должен включать в себя три компонента, разделенных точками:
... где:
level — уровень симуляции:
micro,meso,macro;actor_type — тип актора (например:
miner,exchange,timer,calendar,user,oracle,worldи др.);event_type — тип события (краткое описание действия или состояния:
mined,order_cancelled,tick,rollover,created,updated,failedи т. п.).
Примеры каналов:
micro.miner.mined— событие добычи токена майнером: майнер успешно добыл токены;meso.exchange.order_cancelled— событие отмены ордера на бирже;macro.timer.tick— событие тика таймера мирового времени;macro.calendar.rollover— событие смены календарного периода (дня, недели, месяца и т. д.).
Такой подход позволит логично группировать сообщения по уровням абстракции, типам акторов и видам событий, а также упрощает подписку сервисов на необходимые категории сообщений.
Среди каналов можно будет легко найти нужный: уровней всего три: micro, meso, macro. В пределах уровней — ограниченное число акторов. У каждого актора — ограниченное число типа событий.
Формат сообщений
С целью унификации, каждое сообщение, передаваемое через Redis Pub/Sub, должно иметь единообразную структуру и состоять из двух основных частей:
header — заголовок сообщения, содержащий служебную, идентификационную и маршрутизационную информацию;
payload — полезная нагрузка, содержащая данные события.
Общий формат сообщения:
Header
Заголовок сообщения должен включать следующие поля:
id — уникальный идентификатор сообщения (UUIDv4);
schema — имя схемы сообщения (например:
timer.tick,miner.mined,income_source.bond_placement_completed);schema_version — версия схемы сообщения (используем семантическое версионирование формата "MAJOR.MINOR.PATCH");
ts_utc — момент отправки сообщения в формате UTC;
game_time — игровое (симуляционное) календарное время отправки сообщения (при наличии);
tick — номер тика симуляции, в который было сгенерировано сообщение;
broadcast.type — степень широковещательности:
WORLD— всем акторам без исключения;LEVEL— всем акторам конкретного уровня (micro,meso,macro);KIND— всем акторам определенного вида (например,miner,exchange);CLASS— всем акторам определенного класса внутри вида;ACTOR— конкретному уникальному актору;
broadcast.value — конкретное значение (например, для LEVEL — здесь указываем какой:
micro,meso,macroили идентификатор UUIDv4 конкретного уникального адресата (только если выбран"type": "ACTOR");priority — приоритет сообщения:
LOW,NORMAL,HIGH.
Пример структуры заголовка:
Payload
Полезная нагрузка содержит содержательное описание события и дополнительные данные, необходимые обработчикам.
Payload должен включать следующие поля:
text — человекочитаемое краткое описание события;
data — произвольный JSON-объект, содержащий доменные данные события (структура определяется типом события);
meta.tags — список тегов (для классификации и быстрой фильтрации);
meta.sender — информация об отправителе (если требуется), например: текущее состояние или статус;
meta.extra — произвольный объект для дополнительных параметров, не относящихся к основным данным.
Пример полезной нагрузки:
Применимость формата
Для простых событий (например, тиков таймера) достаточно нескольких полей в разделе
data.Для сложных событий (например, завершения финансовых операций) структура
dataможет содержать вложенные объекты и большие наборы данных.Header остаётся стабильным и обеспечивает маршрутизацию, трассировку и единый формат для всех типов событий.
Payload предоставляет гибкость: как для простых, так и для высокодетализированных событий.
Прочее
Требований в части безопасности не предъявляется. Сообщения не содержат чувствительной информации, и конфиденциальность передачи не требуется.