Принципы асинхронного API | Леруа Мерлен Цифровые Технологии

Леруа Мерлен
Цифровые Технологии

Принципы асинхронного API

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

Kafka logo Kafka RabbitMQ logo RabbitMQ
Комфортная скорость 100 rps 20 rps
Acknowledgment
Многоразовое чтение
Продвинутый роутинг
Приоритет сообщений
Модель пулл пуш
Скалирование брокера горизонтальное вертикальное
Скалирование клиента скалирование количества партиций топика Скалирование количества потребителей
Кейсы использования

Анализ данных: трекинг, поглощение данных, логирование, аудит безопасности.

Процессинг реального времени: множество продюссеров с небольшим количеством консьюмеров.

Event Sourcing: моделирование изменения состояния системы через последователь­ность событий.

Сложный роутинг до потребителей.

Межмикросер­висная коммуникация.

Приложение поддерживает только легаси-протоколы, например STOMP, MQTT и другие.

Общие правила

  • У каждого продукта есть свой экземпляр брокера сообщений — за него ответственна система, которая публикует данные.
  • Всякая информация, которая ценна для нескольких систем, передаётся через канонические топики или эксчейнджи. Все каноничные топики, эксчейнджи и очереди привязаны к домену через указание канонического домена в названии.
  • Запрещается отправлять напрямую в RabbitMQ-очередь: вместо этого используем эксчейндж.

Соглашение о названиях

Названия полей из нескольких слов пишем слитно в lower case, значения полей отделяем друг от друга -.

Kafka Топик

[app]-[type]-[int/ext]-[domain]-[object]-[version]

  • app название публикующего приложения
  • type
    • system топик используется только внутри продуктовой команды или приложения
    • init топик для полного извлечения данных, не используется для постоянной интеграции
    • canonical топик для публикации канонической информации
  • int/ext int топик используется внутри, ext топик опубликован в интернете
  • domain канонический домен
  • object данные, которые отправляются через это топик
  • version версия топика

Пример

crm-canonical-int-customers-organization-v9

RabbitMQ Эксчейндж

[app]-[type]-x-[domain]-[object]-[version]

  • app название публикующего приложения
  • type
    • tx topic exchange
    • fx fanout exchange
    • dx direct exchange
    • hx headers exchange
  • x exchange
  • domain канонический домен
  • object данные, передаваемые через эксчейндж
  • version версия эксчейнджа

Пример

paymentgateway-tx-x-orders-paymenttask-v1

RabbitMQ Очередь

[app]-[type]-q-[domain]-[object]-[filter]-[version]

  • app название подписавшегося приложения
  • type
    • tx topic exchange
    • fx fanout exchange
    • dx direct exchange
    • hx headers exchange
    • q очередь
  • domain канонический домен
  • object данные, передаваемые через очередь
  • filter описания фильтров для типов tx, dx и hx
  • version версия очереди

Пример

solution-tx-q-orders-paymenttask-created-v2