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

В компании используются две технологии для межпродуктового асинхронного взаимодействия.

Kafka logo

Kafka

RabbitMQ logo

RabbitMQ

Комфортная скорость

Acknowledgment

Многоразовое чтение

Продвинутый роутинг

Приоритет сообщений

Модель

Скалирование брокера

Скалирование клиента

100 rps

Пулл

Горизонтальное

Скалирование количества партиций топика

20 rps

Пуш

Вертикальное как так?

Скалирование количества потребителей

Кейсы использования

  • Анализ данных: трекинг, поглощение данных, логгирование, аудит безопасности.
  • Процессинг реального времени: множество продюссеров с небольшим количеством консьюмеров.
  • Event Sourcing: моделирование изменения состояния системы через поледовательность событий.
  • Сложный роутинг до потребителей.
  • Меж-микросервисная коммуникация.
  • Приложение поддериживает только легаси протоколы (STOMP, MQTT и другие).

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

Каждый продукт имеет свой собственный экземпляр брокера сообщений. Система, публикующая данные, ответственна за этот экземпляр.

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

Запрещается отправка напрямую в RabbitMQ очередь: вместо этого используй эксчейндж.

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

Используй camelCase для всех полей.

Kafka Топик

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

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 версия эксчейнджа

RabbitMQ Очередь

[app]-[type]-q-[domain]-[object]-[filter]-[version]
  • app название подписавшегося приложения
  • type
    • tx topic эксчейндж.
    • fx fanout эксчейндж.
    • dx direct эксчейндж.
    • hx headers эксчейндж
  • q очередь
  • domain канонический домен
  • object данные, передаваемые через очередь примеры
  • filter описания фильтров для типов: tx, dx, hx примеры
  • version версия очереди
Последнее изменение 07.07.2020: russian translation for values (56f2de2)