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

Ничего экзотического — набор вещей, которые иначе каждая команда реализует у себя по-своему и с разным качеством.
Хотя бы один раз, с подтверждением. Не доставленное складывается в отдельную очередь, а не теряется молча.
Экспоненциальная пауза и потолок попыток. После потолка — в очередь разбора, оттуда можно перезапустить руками.
Ключ на сообщении. Повтор в течение суток не приводит к повторной обработке — проверено на платёжных потоках.
Контракт описывается заранее. Несовместимое изменение шину не проходит, о чём автор узнаёт на сборке, а не в проде.
Сквозной идентификатор через все переходы. Видно весь путь сообщения, включая время ожидания в очереди.
Медленный потребитель не тормозит остальных: у каждого своя очередь и свой лимит.
Клиентские библиотеки есть для 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-core | 1 940 000 | 22 мс |
| catalog.item.updated | catalog | 1 210 000 | 17 мс |
| order.state.changed | orders | 980 000 | 19 мс |
| notify.request | несколько | 760 000 | 31 мс |
| audit.event | все | 610 000 | 14 мс |