-15%Скидка 15% на разработку сайта или магазина при старте до конца месяца

Очереди RabbitMQ и Kafka в интеграциях 1С-Битрикс

Очереди сообщений RabbitMQ и Kafka в интеграциях 1С-Битрикс: продюсер, брокер, воркеры и внешние системы

Покупатель оформляет заказ, а сайт в этот момент дёргает по HTTP чужой сервис: CRM, службу доставки, склад, платёжный шлюз. Пока все системы отвечают за сотни миллисекунд, всё выглядит гладко. Но стоит внешнему API «прилечь» на минуту или ответить с двухсекундной задержкой — и покупатель видит крутящийся спиннер, заказ подвисает, а иногда данные уходят наполовину: в 1С-Битрикс заказ создан, а в CRM его нет. Синхронная интеграция хрупка ровно настолько, насколько ненадёжно самое слабое звено в цепочке.

В этой статье разбираем, как сделать интеграции 1С-Битрикс надёжными с помощью очередей сообщений — RabbitMQ и Kafka. Покажем, чем они отличаются, что такое гарантия «хотя бы один раз», идемпотентность, ретраи с backoff и dead-letter очередь, и как встроить продюсера и воркер в Битрикс без переписывания сайта. Это выжимка из наших проектов по интеграции 1С-Битрикс с внешними системами — без теории ради теории.

Коротко

  • Очередь развязывает системы во времени: Битрикс кладёт сообщение и отпускает покупателя, а доставку берёт на себя брокер с ретраями.
  • RabbitMQ — для команд «отправитель — исполнитель», Kafka — для потоков событий и множества независимых потребителей.
  • Действует гарантия «хотя бы один раз», поэтому дубли неизбежны — обработчик обязан быть идемпотентным.
  • Неудачные сообщения ретраятся с нарастающей задержкой и уходят в dead-letter очередь, а не в бесконечный цикл.
  • Чтобы сообщение не потерялось между БД и брокером, используйте паттерн transactional outbox.

Почему синхронные интеграции ломаются

Синхронная интеграция — это когда веб-запрос покупателя напрямую ждёт ответа от внешней системы. Оформление заказа в 1С-Битрикс вызывает API службы доставки, ответ этого API нужен, чтобы показать срок и стоимость, и только потом страница отдаётся пользователю. Пока всё работает, схема кажется простой и очевидной. Проблемы начинаются на границах — там, где встречаются две независимые системы с разной надёжностью и разной скоростью.

Разберём типичные режимы отказа синхронной связки:

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

Важно: синхронный вызов внешнего API прямо в обработчике оформления заказа — это не «простое решение», а перенос чужой надёжности на свой сайт. Если внешний сервис падает раз в неделю на минуту, ваша касса тоже падает раз в неделю на минуту.

Что такое очередь сообщений и как она спасает

Очередь сообщений (message queue) — это посредник между системами. Отправитель (продюсер) не вызывает получателя напрямую, а кладёт сообщение в брокер. Получатель (консьюмер, воркер) читает сообщения из брокера в своём темпе и обрабатывает их. Между ними стоит брокер — RabbitMQ или Kafka, — который хранит сообщения, гарантирует доставку и позволяет обеим сторонам работать независимо.

Что это даёт интеграции на практике:

Ключевая ментальная модель: очередь превращает вопрос «удалось ли прямо сейчас доставить данные во внешнюю систему?» в вопрос «удалось ли положить сообщение в надёжный брокер?». Второе на порядок проще и стабильнее первого, потому что брокер — это ваша инфраструктура, которую вы контролируете, а внешний API — нет.

Синхронно: хрупко Битрикс Внешний API ✕ таймаут, заказ висит Через очередь: надёжно Битрикс Оче- редь Воркер Внешний API ✕ упал покупатель свободен, сообщение ждёт и доставится
Схема: при синхронной связке падение внешнего API вешает заказ; через очередь Битрикс отпускает покупателя, а доставку берёт на себя брокер.

RabbitMQ и Kafka: в чём разница и что выбрать

Оба продукта называют «очередями», но устроены они принципиально по-разному, и путать их — частая причина неудачных внедрений. Коротко: RabbitMQ — это брокер сообщений, который доставляет команды и удаляет их после подтверждения; Kafka — это распределённый лог событий, который хранит поток и позволяет читать его многократно.

RabbitMQ. Классический брокер по модели AMQP. Продюсер публикует сообщение в обменник (exchange), тот по правилам маршрутизации (routing key) раскладывает его по очередям, консьюмер забирает и после успешной обработки подтверждает (ack). После подтверждения сообщение исчезает из очереди. Сильные стороны — гибкая маршрутизация, приоритеты, TTL сообщений, встроенный механизм отложенной повторной доставки и dead-letter. Это выбор по умолчанию для задач вида «выполни одну команду один раз»: отправить заказ в CRM, поставить письмо в рассылку, списать остаток.

Apache Kafka. Не столько очередь, сколько долговременный журнал событий, разбитый на партиции. Продюсер дописывает событие в конец лога, а потребители читают его, двигая свой указатель (offset). Сообщение не удаляется после чтения — оно живёт заданное время хранения (retention), и его могут прочитать сколько угодно независимых групп потребителей. Kafka силён там, где на одно событие «заказ оформлен» подписаны сразу аналитика, рекомендательная система, склад и уведомления, и где поток измеряется тысячами событий в секунду.

КритерийRabbitMQKafka
МодельБрокер сообщений (команды)Распределённый лог событий
Судьба сообщенияУдаляется после ackХранится по retention, читается многократно
МаршрутизацияГибкая: exchange, routing keyПо топикам и партициям
Несколько потребителей одного событияЧерез отдельные очередиЕстественно, через consumer groups
ПорядокВ пределах очередиВ пределах партиции
Типичная нагрузкаОт единиц до тысяч сообщений/сДесятки и сотни тысяч событий/с
Когда выбрать для БитриксаОбмен заказами, письма, задачи, интеграция с CRM/1ССобытийная шина, аналитика, много подписчиков, большой поток

Практический вывод для большинства проектов на 1С-Битрикс: начинайте с RabbitMQ. Он проще в эксплуатации, покрывает 90% интеграционных задач магазина и даёт из коробки ретраи и dead-letter. Kafka оправдана, когда у вас действительно поток событий и несколько независимых потребителей — иначе вы платите за сложную инфраструктуру, не используя её сильные стороны.

Важно: не выбирайте Kafka «на вырост» под простой обмен заказами с одной CRM. Эксплуатация кластера Kafka заметно сложнее, чем одного узла RabbitMQ, а выгоды от лога событий при единственном потребителе вы не получите.

Гарантии доставки: at-least-once и дубли

Прежде чем писать код, нужно принять фундаментальный факт распределённых систем: надёжной доставки «ровно один раз» без оговорок не бывает. На практике выбирают между тремя гарантиями, и понимание разницы определяет весь дизайн обработчика.

Почему дубли неизбежны в at-least-once? Представьте: воркер обработал сообщение, записал заказ в CRM, но в момент отправки подтверждения брокеру оборвалась сеть. Брокер не получил ack, считает сообщение необработанным и через время отдаёт его снова. Воркер видит то же сообщение второй раз — и если он наивно создаст заказ заново, в CRM появится дубль. Проблема не в «плохом коде», а в самой природе гарантии: подтверждение и эффект нельзя атомарно связать через ненадёжную сеть. Единственное честное решение — сделать обработчик устойчивым к повторам, то есть идемпотентным.

Идемпотентность: как пережить повторы

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

Три рабочих способа обеспечить идемпотентность:

Практический совет: генерируйте идемпотентный ключ на стороне продюсера в Битриксе, а не на приёмнике. Ключ должен быть детерминированным — привязанным к бизнес-сущности (номер заказа, ID элемента и тип операции), а не к случайности момента отправки. Тогда даже если продюсер по ошибке опубликует сообщение дважды, оба будут нести один ключ, и приёмник схлопнет их в одно действие.

Сообщение key = ORD-482 Ключ уже в журнале? Да → ничего не делаем подтверждаем (ack) и выходим Нет → выполняем действие создаём заказ + пишем ключ в журнал повтор первый раз
Схема: воркер сверяет ключ сообщения с журналом обработанных — повтор безопасно отбрасывается, а первое сообщение выполняется и фиксируется.

Ретраи, backoff и dead-letter очередь

Даже идеальный обработчик иногда падает: внешний API вернул 503, кончился токен, база временно недоступна. Правильная реакция — не «залогировать и забыть» и не «крутить в бесконечном цикле», а повторить с умом. Здесь работают три связанных механизма.

В RabbitMQ это собирается штатно: у очереди задаётся dead-letter exchange, а отложенные повторы делают через сообщения с TTL или плагин отложенной доставки. В Kafka паттерн другой — обычно заводят отдельные топики-ретраи с растущей задержкой (retry-5s, retry-30s, retry-2m) и финальный dead-letter-топик, а потребитель перекладывает сообщение по цепочке при неудаче.

Важно: DLQ без мониторинга бесполезна. Заведите оповещение «в dead-letter больше N сообщений» — иначе недоставленные заказы будут тихо копиться, и вы узнаете о проблеме от разгневанного клиента, а не от системы.

Отдельно стоит различать «повторяемые» и «неповторяемые» ошибки. Таймаут внешнего API — повторяемая ошибка, её надо ретраить. А вот сообщение с битой структурой или ссылкой на несуществующий товар ретраить бессмысленно: сколько ни повторяй, результат тот же. Такие сообщения разумно сразу отправлять в DLQ, не тратя попытки. Хороший обработчик различает эти классы ошибок и реагирует по-разному.

Ретраи с backoff → dead-letter Попытка 1 сразу Попытка 2 через 5с Попытка 3 через 30с Попытка 4 через 2м Dead-letter очередь разбор вручную + алерт
Схема: попытки идут с нарастающей задержкой; когда лимит исчерпан, сообщение уходит в dead-letter очередь под ручной разбор и оповещение.

Порядок сообщений и ключи партиционирования

Иногда порядок обработки критичен. Классический пример: по одному заказу пришли два события — «создан» и «отменён». Если воркеры обработают их в обратном порядке, заказ окажется сначала отменён, а потом создан — и повиснет активным, хотя клиент его отменил. Понимание того, где порядок гарантирован, а где нет, спасает от таких багов.

В RabbitMQ порядок сохраняется в пределах одной очереди при одном потребителе. Как только вы масштабируете обработку на несколько параллельных воркеров, читающих одну очередь, строгий порядок теряется — сообщения разбираются конкурентно. В Kafka порядок гарантирован в пределах одной партиции, а распределение по партициям идёт по ключу: все события с одним ключом (например, с номером заказа) попадают в одну партицию и обрабатываются строго по очереди.

Практические стратегии:

Архитектура интеграции через очередь

Соберём всё в цельную картину. Надёжная интеграция 1С-Битрикс через очередь состоит из нескольких чётко разделённых частей, и у каждой своя зона ответственности.

Такое разделение даёт главное преимущество: тяжёлая и ненадёжная работа (общение с внешним миром) вынесена из веб-запроса покупателя в фоновый процесс, который можно масштабировать, перезапускать и чинить независимо от сайта. Сайт остаётся быстрым, а интеграция — управляемой. Если вам ближе разбор надёжности именно на уровне API, у нас есть смежный материал про очереди и надёжность API-интеграций Битрикса, где эти же принципы разложены со стороны контрактов и таймаутов.

Реализация в 1С-Битрикс: продюсер и воркер

Теперь — как это ложится на 1С-Битрикс без переписывания сайта. Продюсера вешаем на событие ядра. Например, при сохранении заказа модуль продаж вызывает событие, к которому мы подключаем свой обработчик. Внутри — не тяжёлый вызов API, а быстрая публикация сообщения:

// init.php — продюсер на событии сохранения заказа
use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
    'sale', 'OnSaleOrderSaved',
    function (\Bitrix\Main\Event $event) {
        /** @var \Bitrix\Sale\Order $order */
        $order = $event->getParameter('ENTITY');

        $message = [
            'event'   => 'order.saved',
            'key'     => 'ORD-' . $order->getId(),   // идемпотентный ключ
            'orderId' => $order->getId(),
            'sum'     => (float)$order->getPrice(),
            'ts'      => time(),
        ];

        // Публикуем в брокер за миллисекунды и отпускаем покупателя
        QueuePublisher::publish('orders', $message);
    }
);

Публикацию в RabbitMQ удобно инкапсулировать в тонкий класс на базе библиотеки php-amqplib. Подключение к брокеру, объявление обменника и очереди с dead-letter, персистентность сообщений:

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

class QueuePublisher
{
    public static function publish(string $queue, array $payload): void
    {
        $conn = new AMQPStreamConnection('127.0.0.1', 5672, 'app', 'secret');
        $ch = $conn->channel();

        // durable-очередь + маршрут в dead-letter при отказе
        $ch->queue_declare($queue, false, true, false, false, false, [
            'x-dead-letter-exchange' => ['S', 'orders.dlx'],
        ]);

        $msg = new AMQPMessage(json_encode($payload, JSON_UNESCAPED_UNICODE), [
            'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
            'message_id'    => $payload['key'],
        ]);

        $ch->basic_publish($msg, '', $queue);
        $ch->close();
        $conn->close();
    }
}

Воркер выносим в отдельный консольный скрипт, который подключает ядро Битрикса и бесконечно читает очередь. Ключевые моменты — ручное подтверждение (ack) только после успешной обработки, проверка идемпотентности и аккуратная обработка ошибок:

// worker.php — запускается под supervisor, не в веб-запросе
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

$conn = new AMQPStreamConnection('127.0.0.1', 5672, 'app', 'secret');
$ch = $conn->channel();
$ch->basic_qos(null, 10, null);          // не хватать больше 10 неподтверждённых

$ch->basic_consume('orders', '', false, false, false, false, function ($msg) {
    $data = json_decode($msg->body, true);

    // 1) идемпотентность: уже обрабатывали этот ключ?
    if (OrderSyncLog::isDone($data['key'])) {
        $msg->ack();
        return;
    }

    try {
        // 2) вызов внешней системы (CRM/1С/доставка)
        CrmClient::upsertOrder($data);
        OrderSyncLog::markDone($data['key']);
        $msg->ack();                       // 3) подтверждаем ТОЛЬКО при успехе
    } catch (RetryableException $e) {
        $msg->nack(false, false);          // в dead-letter → потом ретрай
    }
});

while ($ch->is_consuming()) {
    $ch->wait();
}

Обратите внимание: сайт не знает и не ждёт, доступна ли CRM. Он только публикует сообщение. Вся ненадёжная работа живёт в воркере, который перезапускается supervisor'ом при падении и разбирает очередь в своём темпе. Если у вас пока нет отдельного брокера, тот же паттерн «продюсер — очередь — воркер» можно временно реализовать на таблице в БД плюс агент Битрикса, но с ростом нагрузки честный брокер окупается.

Совет: запускайте воркеры под supervisor (или systemd) с автоперезапуском и ограничением на число сообщений/времени жизни процесса. PHP-воркер, живущий часами, накапливает утечки памяти — периодический мягкий рестарт лечит это без простоя очереди.

Как это выглядит со стороны админки и инфраструктуры

С точки зрения эксплуатации у вас появляется несколько сущностей вне привычной админки Битрикса: узел брокера, панель управления очередями и процессы-воркеры. У RabbitMQ есть веб-панель управления, где видно очереди, скорость входа/выхода сообщений и длину dead-letter. Схематично панель мониторинга очереди выглядит так:

Очереди · брокер сообщений orders В очереди: 128 сообщений Вход 42/с · Выход 40/с Потребители (воркеры) Активны: 4 · prefetch 10 Подтверждают: ack вручную orders.dlq (dead-letter) Недоставлено: 3 ⚠ алерт при > 10 Здоровье Лаг стабилен, затора нет Память узла в норме
Схема: на панели брокера видно длину очереди, скорость входа/выхода, число воркеров и размер dead-letter. Реальные подписи зависят от версии брокера и панели.

В самой админке Битрикса при этом почти ничего не меняется: заказы создаются как обычно, обработчик события работает незаметно. Отладку интеграции удобно вести по логам воркера и панели брокера, а не по журналам веб-сервера. Если интеграция должна ходить в 1С, полезно держать в голове общий контракт обмена — про архитектуру серверного взаимодействия мы подробно писали в материале про REST API 1С-Битрикс.

Транзакционный outbox: не потерять сообщение

Есть коварная брешь, о которую спотыкаются даже опытные команды. Продюсер делает две вещи: пишет заказ в базу Битрикса и публикует сообщение в брокер. Это две разные системы, и между ними нет общей транзакции. Что если заказ в БД записался, а публикация в брокер упала (или наоборот)? Данные разойдутся — ровно та проблема, ради которой мы затевали очередь.

Решение — паттерн transactional outbox. Идея в том, чтобы сделать запись сообщения частью той же транзакции БД, что и запись бизнес-данных:

  1. Пишем в одной транзакции. В рамках сохранения заказа в ту же базу, той же транзакцией, записываем строку в таблицу-outbox: «нужно отправить такое-то сообщение». Либо оба изменения зафиксировались, либо оба откатились — расхождение невозможно.
  2. Отдельный релей публикует. Фоновый процесс (агент, cron или воркер) читает неотправленные строки из outbox и публикует их в брокер. После подтверждения помечает строку как отправленную.
  3. Повторы безопасны. Если релей упал между публикацией и отметкой, при следующем проходе он опубликует сообщение снова — а идемпотентность на приёмнике схлопнет дубль. Круг замкнулся: гарантия «хотя бы один раз» плюс идемпотентность.

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

Мониторинг очередей и метрики

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

МетрикаЧто показываетОриентир / реакция
Длина очередиСколько сообщений ждёт обработкиСтабильно низкая; рост — затор, добавить воркеров
Лаг потребителя (Kafka)Отставание чтения от конца логаБлизко к нулю; растёт — потребитель не успевает
Скорость вход/выходБаланс публикации и обработкиВыход ≥ вход в среднем по времени
Размер dead-letterЧисло неразобранных сбоевАлерт при превышении порога, ручной разбор
Возраст старейшего сообщенияКак долго ждёт самое староеСекунды-минуты; часы — сигнал деградации
Доля ретраевНасколько часто падает обработкаРост — проблема на стороне внешнего API

Минимально достаточный набор оповещений: «очередь растёт дольше N минут», «в dead-letter больше M сообщений», «воркеры не подтверждают сообщения» и «нет активных потребителей». Эти четыре алерта ловят подавляющее большинство инцидентов на ранней стадии — когда ещё ничего не потеряно и есть время среагировать. Метрики удобно выгружать в общий стек мониторинга рядом с метриками самого сайта, чтобы видеть корреляции: например, что рост очереди совпал с деплоем внешнего сервиса.

Типовые сценарии для магазина на Битриксе

Чтобы принципы не висели в воздухе, вот где очереди дают наибольшую отдачу на реальном интернет-магазине:

Общий признак «кандидата на очередь»: операция обращается к внешней системе, её результат не обязан быть мгновенным для покупателя, а потеря данных недопустима. Как только вы видите такую тройку условий — это место просится за очередь.

Частые ошибки

Мини-FAQ. Нужна ли идемпотентность, если брокер обещает «ровно один раз»? Да — на границе с внешней системой и при сетевых обрывах гарантия транспорта не спасает от повторного эффекта. Идемпотентность приёмника — единственный надёжный способ пережить дубли.

Чек-лист внедрения

Сведём всё в практический список, по которому удобно принимать готовность интеграции перед запуском:

  1. Брокер выбран осознанно. RabbitMQ для команд и обмена, Kafka — только при реальном потоке событий и множестве потребителей.
  2. Продюсер не блокирует покупателя. Обработчик события кладёт компактное сообщение и сразу отпускает веб-запрос, тяжёлая работа вынесена в воркер.
  3. Идемпотентный ключ есть. Каждое сообщение несёт детерминированный ключ, приёмник проверяет журнал обработанных перед действием.
  4. Подтверждение только при успехе. Ack выставляется после фактической обработки; при сбое — nack и ретрай.
  5. Ретраи с backoff и DLQ. Настроены ограниченные попытки с нарастающей задержкой и dead-letter очередь для исчерпавших лимит.
  6. Outbox против расхождений. Публикация сообщения атомарна с записью бизнес-данных через транзакционный outbox.
  7. Воркеры под supervisor. Процессы автоперезапускаются, ограничены по памяти и времени жизни, масштабируются по числу.
  8. Мониторинг и алерты. Настроены метрики длины очереди, лага, размера DLQ и оповещения по порогам.

Вывод

Очереди сообщений превращают хрупкую синхронную интеграцию в устойчивую систему, которая переживает падения внешних сервисов, сглаживает всплески нагрузки и не теряет заказы. Формула проста: развязать системы во времени через RabbitMQ или Kafka, принять гарантию «хотя бы один раз», сделать обработчик идемпотентным, добавить ретраи с backoff и dead-letter, а публикацию защитить транзакционным outbox. Сделайте эти вещи — и интеграция 1С-Битрикс перестанет быть источником ночных инцидентов даже под нагрузкой распродажи.

Частые вопросы

Зачем нужны очереди, если можно вызвать API напрямую?

Прямой синхронный вызов работает, пока обе системы онлайн и отвечают быстро. Как только внешний сервис недоступен, отвечает с задержкой или падает в середине операции, синхронная интеграция теряет данные или блокирует пользователя. Очередь развязывает отправителя и получателя во времени: 1С-Битрикс кладёт сообщение и сразу отпускает покупателя, а доставку до внешней системы берёт на себя брокер с ретраями. Это превращает хрупкую цепочку в устойчивую.

Чем RabbitMQ отличается от Kafka для интеграций Битрикса?

RabbitMQ — классический брокер сообщений с гибкой маршрутизацией, подтверждениями и повторной доставкой; он идеален для задач «команда — исполнитель»: отправить заказ в CRM, списать остаток, поставить письмо в очередь. Kafka — это распределённый лог событий, который хранит поток и позволяет многим потребителям читать его в своём темпе; он силён там, где нужен большой поток событий, аналитика и несколько независимых подписчиков на одно и то же событие. Для типового интернет-магазина на Битриксе чаще достаточно RabbitMQ, Kafka подключают при росте объёмов и числа потребителей.

Что такое идемпотентность и почему она обязательна?

Идемпотентность — это свойство обработчика, при котором повторная доставка одного и того же сообщения не приводит к повторному эффекту. В очередях действует гарантия «хотя бы один раз», поэтому дубли неизбежны: сеть моргнула, потребитель не успел подтвердить, брокер прислал сообщение снова. Если обработчик идемпотентен (проверяет уникальный ключ сообщения перед действием), повтор безопасен: заказ не создастся дважды, остаток не спишется два раза, письмо не уйдёт повторно.

Как встроить очередь в 1С-Битрикс без переписывания сайта?

Продюсер (отправитель) вешается на события ядра Битрикса — например, OnSaleOrderSaved или OnAfterIBlockElementUpdate — и вместо прямого вызова внешнего API кладёт компактное сообщение в очередь. Потребитель выносится в отдельный процесс: консольный скрипт-воркер под supervisor или обработчик, который запускается агентом либо cron и разбирает пачку сообщений. Ядро сайта при этом не меняется, а тяжёлая доставка уходит из веб-запроса в фон.

Что делать с сообщениями, которые никак не обрабатываются?

Для таких сообщений заводят очередь недоставленных — dead-letter queue (DLQ). После нескольких неудачных попыток с нарастающей задержкой сообщение уходит не в бесконечный цикл, а в DLQ, где его видно, можно разобрать причину, поправить данные и переотправить вручную. Без DLQ «ядовитое» сообщение либо блокирует очередь, либо теряется — оба сценария плохи, поэтому DLQ и мониторинг её длины обязательны для продакшена.

Не усложняет ли очередь поддержку интеграции?

Очередь добавляет инфраструктурный компонент — брокер, воркеры, мониторинг, — и это реальная цена. Но взамен вы получаете наблюдаемость и предсказуемость: видно, сколько сообщений в очереди, где затор, какие упали в DLQ. Отладка асинхронной интеграции проще, чем ловля плавающих таймаутов в синхронных вызовах. На небольшом трафике с одной стабильной системой очередь может быть избыточна; на боевом магазине со сбоящими внешними сервисами она окупается быстро.

Поделиться:

Нужна интеграция, которая не теряет заказы на сбоях?

Спроектируем и внедрим асинхронную интеграцию 1С-Битрикс на очередях: продюсеры на событиях ядра, воркеры, ретраи, идемпотентность, dead-letter и мониторинг. Разберём вашу текущую схему и рассчитаем стоимость.

Услуга «Интеграции»

Игорь Воскресенский

Основатель студии B2Bsite. С 2014 года команда разрабатывает и поддерживает интернет-магазины и корпоративные сайты на 1С-Битрикс, проектирует надёжные интеграции с CRM, 1С и внешними сервисами через очереди сообщений для среднего и крупного бизнеса.

← Все статьи блога