Принципы асинхронного API
Приложение отправляет сообщение получателю и продолжает работать, не дожидаясь ответа. Подход применяют, когда результат выполнения не зависит от ответа сторонней системы.
Kafka | 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