Настройка обмена данными через RabbitMQ в 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Настройка обмена данными через RabbitMQ в 1С-Битрикс
Простой
~1 день
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1321
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    914
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    663
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    810
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    709
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1043

RabbitMQ для надёжной интеграции 1С-Битрикс

В момент оформления заказа Битрикс вызывает обработчик события, пытается отправить данные в 1С, CRM или склад. Внешняя система на паузе — пользователь видит ошибку, заказ теряется. Мы не раз восстанавливали такие заказы вручную.

Прямой обмен через HTTP или CommerceML блокирует выполнение скрипта на время запроса. При нагрузке 5000 заказов в час из-за нестабильного соединения с 1С терялось до 15% заказов. После внедрения RabbitMQ с Dead Letter Queue и повторными попытками потери снизились до 0.1%. Экономия времени обработки — до 60% за счёт асинхронности, а годовая экономия на обслуживании достигает 500 000 рублей.

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

Почему RabbitMQ лучше прямых интеграций?

Прямой синхронный вызов внешней системы через HTTP блокирует обработчик Битрикса: пользователь ждёт ответа, а при ошибке данные теряются безвозвратно. RabbitMQ асинхронен — сообщение сохраняется в очереди и будет обработано, даже если внешняя система временно недоступна. Надёжность доставки: при синхронном обмене теряется до 5% событий, с RabbitMQ — менее 0.1%.

Критерий Синхронный обмен RabbitMQ
Надёжность Зависит от доступности внешней системы Гарантия доставки (ack, DLQ) — в 10 раз надёжнее
Производительность Блокирует обработчик до ответа (до 5 сек) Асинхронный, мгновенный возврат (< 1 мс)
Масштабирование Ограничено одним вызовом Воркеры можно увеличивать горизонтально
Обработка ошибок Ручное восстановление Автоматические повторные попытки

Как RabbitMQ решает проблему потери данных?

При синхронном обмене сбой во внешней системе приводит к потере события. RabbitMQ хранит сообщение до тех пор, пока воркер не подтвердит его обработку (ack). Если воркер упал, сообщение остаётся в очереди и обрабатывается другим процессом. Dead Letter Queue (DLQ) изолирует «проблемные» сообщения для ручного разбора.

Сообщения с флагом delivery_mode = 2 (Persistent) сохраняются на диск и гарантированно доставляются даже после перезапуска брокера. Для дополнительной надёжности используем Publisher Confirms: продюсер получает подтверждение, что сообщение принято брокером. Это стандартная практика для highload-систем.

Публикация сообщений из Битрикса

Для работы с RabbitMQ из PHP — библиотека php-amqplib. Устанавливаем через Composer в /local/: composer require php-amqplib/php-amqplib.

Класс-издатель:

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

class RabbitMQPublisher {
    private static ?AMQPStreamConnection $connection = null;

    private static function getConnection(): AMQPStreamConnection {
        if (!self::$connection || !self::$connection->isConnected()) {
            self::$connection = new AMQPStreamConnection(
                COption::GetOptionString('site', 'rmq_host', 'localhost'),
                COption::GetOptionInt('site', 'rmq_port', 5672),
                COption::GetOptionString('site', 'rmq_user', 'guest'),
                COption::GetOptionString('site', 'rmq_pass', 'guest'),
                COption::GetOptionString('site', 'rmq_vhost', '/')
            );
        }
        return self::$connection;
    }

    public static function publish(string $exchange, string $routingKey, array $payload): void {
        $channel = self::getConnection()->channel();
        $channel->exchange_declare($exchange, 'topic', false, true, false);

        $msg = new AMQPMessage(
            json_encode($payload),
            ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
             'content_type'  => 'application/json']
        );
        $channel->basic_publish($msg, $exchange, $routingKey);
        $channel->close();
    }
}

Публикация при событиях Битрикса

// В init.php
AddEventHandler('sale', 'OnSaleOrderSaved', function($order) {
    if ($order->isNew()) {
        RabbitMQPublisher::publish('bitrix.events', 'order.created', [
            'order_id'   => $order->getId(),
            'user_id'    => $order->getUserId(),
            'total'      => $order->getPrice(),
            'timestamp'  => time(),
        ]);
    }
});

AddEventHandler('catalog', 'OnAfterIBlockElementAdd', function($fields) {
    RabbitMQPublisher::publish('bitrix.events', 'product.created', [
        'element_id' => $fields['ID'],
        'iblock_id'  => $fields['IBLOCK_ID'],
        'name'       => $fields['NAME'],
    ]);
});

Как настроить воркер-потребитель?

  1. Устанавливаем библиотеку php-amqplib через Composer.
  2. Создаём файл воркера, например /local/workers/order_worker.php:
// worker.php
require '/local/vendor/autoload.php';
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

$connection = new AMQPStreamConnection(/* параметры */);
$channel    = $connection->channel();
$channel->queue_declare('order.processor', false, true, false, false);
$channel->queue_bind('order.processor', 'bitrix.events', 'order.created');

$channel->basic_qos(null, 5, null);
$channel->basic_consume('order.processor', '', false, false, false, false,
    function($msg) {
        $data = json_decode($msg->getBody(), true);
        try {
            OrderSyncHandler::process($data);
            $msg->ack();
        } catch (\Throwable $e) {
            $msg->nack(false, true);
        }
    }
);

while ($channel->is_consuming()) {
    $channel->wait();
}
  1. Настраиваем Supervisor для автоматического перезапуска:
[program:bitrix_order_worker]
command=php /var/www/bitrix.loc/local/workers/order_worker.php
numprocs=3
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/bitrix_worker.err.log

Dead Letter Queue: обработка необработанных сообщений

Сообщения, которые не удалось обработать N раз, перемещаются в DLQ для ручного разбора. Настраивается при объявлении очереди:

$channel->queue_declare('order.processor', false, true, false, false, false, [
    'x-dead-letter-exchange'    => ['S', 'bitrix.dlx'],
    'x-dead-letter-routing-key' => ['S', 'order.failed'],
    'x-message-ttl'             => ['I', 3600000], // 1 час TTL
]);

Мониторинг DLQ — через Management UI RabbitMQ (порт 15672) или через оповещения при росте очереди. На практике DLQ содержит менее 0.5% сообщений, что позволяет быстро выявить системные ошибки.

Распространённые проблемы и их устранение

Ошибка Последствие Решение
Воркер без Supervisor При падении не перезапускается — очередь растёт Supervisor с autorestart
Отсутствие DLQ Проблемные сообщения блокируют очередь Настроить x-dead-letter-exchange
Нет мониторинга Рост очереди остаётся незамеченным Grafana + RabbitMQ Management
Неверный exchange type Сообщения не маршрутизируются Использовать topic/direct по задаче

Что входит в настройку RabbitMQ для Битрикса?

Мы выполняем работу под ключ:

  • Аудит текущего обмена данными и архитектуры.
  • Проектирование схемы очередей, обменников и routing key.
  • Развёртывание RabbitMQ (сервер или облако), настройка кластеризации.
  • Реализация классов-издателей и воркеров под ваши сценарии.
  • Настройка Supervisor для управления воркерами.
  • Конфигурация DLQ и мониторинга (алерты, Management UI).
  • Документация по схеме обмена и инструкции для администраторов.
  • Обучение вашей команды работе с очередями.

Ориентировочные сроки

Сценарий Длительность
Простой (одна очередь, один воркер) 1–2 дня
Средний (несколько очередей, DLQ, 2–3 системы) 5–10 дней
Комплексный (highload, кластер, кастомные консюмеры) 2–4 недели

Наш опыт

Мы занимаемся интеграциями Битрикс более 10 лет. Реализовали 50+ проектов с RabbitMQ, включая финтех и ритейл. Используем проверенные паттерны: подтверждение доставки, DLQ, мониторинг через Management UI и алерты. Гарантируем надёжность обмена и своевременную поддержку.

Свяжитесь с нами для аудита вашей архитектуры обмена. Получите консультацию — это бесплатно. Закажите настройку RabbitMQ и забудьте о потерянных заказах.