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

Пример асинхронного API

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

Kafka logo KafkaRabbitMQ logo RabbitMQ
Комфортная скорость100 rps20 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


Предложить улучшения
Последнее изменение 03.08.2022: 50 async api reconsider kafka topic naming conventions (#71) (10a2e44)