Налаштування обміну даними через Apache Kafka для 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування обміну даними через Apache Kafka для 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

Налаштування обміну даними через Apache Kafka для 1С-Бітрікс

Apache Kafka — розподілений лог подій, не традиційний брокер черг. Якщо RabbitMQ підходить для завдання «передати повідомлення з A в B з гарантією доставки», Kafka підходить для «зберігати потік подій, дозволити безлічі споживачів читати його незалежно і відтворювати з будь-якої точки». Для 1С-Бітрікс Kafka має сенс у великих проєктах із кількома споживачами подій.

Коли Kafka замість RabbitMQ

  • Потік подій має оброблятися кількома незалежними системами одночасно (аналітика, CRM, склад, маркетинг).
  • Потрібно відтворити події за минулий період (retention до кількох днів/тижнів).
  • Обсяг подій — сотні тисяч на хвилину.
  • Event sourcing: подія — це джерело істини, з якого відновлюється стан.

Для типового інтернет-магазину з кількома зовнішніми системами та без вимог до відтворення подій — RabbitMQ простіший і дешевший.

Клієнт Kafka для PHP

Офіційного PHP-клієнта від Apache немає. Використовуємо arnaud-lb/php-rdkafka (біндинги до librdkafka):

# Встановлення librdkafka (Ubuntu)
apt-get install librdkafka-dev
# Встановлення PHP-розширення
pecl install rdkafka
# PHP-обгортка
cd /local && composer require arnaud-lb/php-rdkafka

Producer: публікація подій з 1С-Бітрікс

class KafkaProducer {
    private \RdKafka\Producer $producer;

    public function __construct() {
        $conf = new \RdKafka\Conf();
        $conf->set('metadata.broker.list',
            COption::GetOptionString('site', 'kafka_brokers', 'kafka:9092'));
        $conf->set('security.protocol', 'PLAINTEXT');
        // Для production з SSL:
        // $conf->set('security.protocol', 'SSL');
        // $conf->set('ssl.ca.location', '/etc/kafka/certs/ca-cert');

        $this->producer = new \RdKafka\Producer($conf);
    }

    public function publish(string $topic, string $key, array $payload): void {
        $topic = $this->producer->newTopic($topic);
        $topic->produce(
            \RD_KAFKA_PARTITION_UA, // автовибір партиції
            0,
            json_encode($payload),
            $key // ключ партиціонування — наприклад, user_id для впорядкованості подій користувача
        );
        $this->producer->flush(1000); // чекаємо 1 сек підтвердження
    }
}

// Використання в обробниках подій
AddEventHandler('sale', 'OnSaleOrderSaved', function($order) {
    $kafka = new KafkaProducer();
    $kafka->publish('bitrix.orders', (string)$order->getUserId(), [
        'event'    => $order->isNew() ? 'order.created' : 'order.updated',
        'order_id' => $order->getId(),
        'status'   => $order->getField('STATUS_ID'),
        'total'    => $order->getPrice(),
        'ts'       => time(),
    ]);
});

Consumer: споживач подій

Споживач запускається як окремий демон (не в контексті 1С-Бітрікс — в контексті PHP-CLI):

// kafka_consumer.php
$conf = new \RdKafka\Conf();
$conf->set('group.id', 'crm-sync-group');
$conf->set('metadata.broker.list', 'kafka:9092');
$conf->set('auto.offset.reset', 'latest'); // читати з кінця, не з початку

$consumer = new \RdKafka\KafkaConsumer($conf);
$consumer->subscribe(['bitrix.orders', 'bitrix.products']);

while (true) {
    $message = $consumer->consume(5000); // timeout 5 сек
    if ($message->err === \RD_KAFKA_RESP_ERR_NO_ERROR) {
        $payload = json_decode($message->payload, true);
        try {
            EventDispatcher::dispatch($message->topic_name, $payload);
            // Kafka сама керує офсетами при використанні group.id
        } catch (\Throwable $e) {
            // Логуємо, не коммітимо офсет — повідомлення буде повторно прочитане
            error_log("Kafka consumer error: " . $e->getMessage());
        }
    }
}

Топіки та партиції

Топік Ключ партиції Споживачі
bitrix.orders user_id CRM, склад, аналітика
bitrix.products iblock_element_id Пошуковий індекс, рекомендації
bitrix.users user_id CDP, email-маркетинг
bitrix.carts user_id Аналітика покинутих кошиків

Кількість партицій = максимальний паралелізм споживачів. Для старту — 3–6 партицій на топік.

Моніторинг Kafka

Lag споживачів — ключова метрика: різниця між останнім опублікованим повідомленням і останнім прочитаним споживачем. Якщо lag зростає — споживач не справляється. Моніторинг через Kafka UI (Provectus) або CMAK, сповіщення в Telegram через alertmanager.

Налаштування Kafka для 1С-Бітрікс з двома–трьома топіками та тестовим споживачем — 2–3 робочих дні на інфраструктуру і 1 день на інтеграцію з 1С-Бітрікс.