Midwave

Шина обмена между внутренними сервисами

Один способ доставить сообщение из точки А в точку Б: с гарантией, с повторами и так, чтобы отправитель не знал ничего про получателя.

Схема потоков обмена
41подключено сервисов
7,2 млнсообщений в сутки
18 мсмедиана доставки
99,98%доступность за 90 дней

Что умеет

Ничего экзотического — набор вещей, которые иначе каждая команда реализует у себя по-своему и с разным качеством.

Гарантия доставки

Хотя бы один раз, с подтверждением. Не доставленное складывается в отдельную очередь, а не теряется молча.

Повторы с задержкой

Экспоненциальная пауза и потолок попыток. После потолка — в очередь разбора, оттуда можно перезапустить руками.

Идемпотентность

Ключ на сообщении. Повтор в течение суток не приводит к повторной обработке — проверено на платёжных потоках.

Схемы

Контракт описывается заранее. Несовместимое изменение шину не проходит, о чём автор узнаёт на сборке, а не в проде.

Трассировка

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

Разделение нагрузки

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

Как выглядит подключение

Клиентские библиотеки есть для Go и Python, остальным — HTTP.

POST /v1/publish
X-Idempotency-Key: 7c2f1a9e-...
Content-Type: application/json

{
  "topic": "billing.invoice.created",
  "payload": { "invoice_id": 48210, "amount": "1490.00" },
  "trace_id": "b41d0c..."
}

Ответ приходит сразу после того, как сообщение записано и реплицировано. До этого момента считать его отправленным нельзя.

Крупнейшие потоки

ТемаИздательВ суткиp95
billing.invoice.*billing-core1 940 00022 мс
catalog.item.updatedcatalog1 210 00017 мс
order.state.changedorders980 00019 мс
notify.requestнесколько760 00031 мс
audit.eventвсе610 00014 мс