Налаштування обміну даними через 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С-Бітрікс.







