Налаштування обміну даними через черги повідомлень (RabbitMQ) 1С-Бітрікс

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

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування обміну даними через черги повідомлень (RabbitMQ) для 1С-Бітрікс

Синхронна передача даних між 1С-Бітрікс та зовнішніми системами прямо в обробнику події — ненадійна. Якщо зовнішня система недоступна, користувач отримує помилку або подія втрачається. RabbitMQ вирішує задачу: 1С-Бітрікс публікує повідомлення в чергу і негайно повертає управління, окремий воркер забирає повідомлення і доставляє в цільову систему.

Коли потрібен RabbitMQ

  • Зовнішня система periodically недоступна (обслуговування, нестабільний канал).
  • Обсяг подій нерегулярний: у піку — тисячі на хвилину, у звичайний час — десятки.
  • Потрібна гарантія доставки: кожне повідомлення має бути оброблено рівно один раз.
  • Кілька споживачів повинні отримувати копії однієї події (fan-out).

Публікація повідомлень з 1С-Бітрікс

Для роботи з RabbitMQ з PHP — бібліотека php-amqplib/php-amqplib. Встановлюємо через Composer у /local/:

cd /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();
    }
}

Публікація при подіях 1С-Бітрікс

// В 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'],
    ]);
});

Воркер-споживач

Воркер — окремий PHP-процес (або кілька), запущений через Supervisor:

// 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); // не більше 5 необроблених повідомлень на воркера
$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();
}

Supervisor-конфіг (/etc/supervisor/conf.d/bitrix_worker.conf):

[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 (Dead Letter Queue) для ручного розбору. Налаштовується при оголошенні черги:

$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], // TTL 1 година
]);

Моніторинг DLQ — через Management UI RabbitMQ (порт 15672) або через сповіщення при зростанні черги.

Налаштування RabbitMQ для одного типу подій з воркером — 1–2 робочих дні, включаючи Supervisor та моніторинг.