Гайд 1С: Интеграция 1С с Apache Kafka: Producer и Consumer на платформе 8.3
При интеграции 1С в распределенный контур под управлением Apache Kafka возникают проблемы:
- Дублирование событий на стороне приемников из-за некорректной семантики доставки (At-Least-Once).
- Потеря сообщений при сетевых сбоях и отсутствии ожидания подтверждений (Acks).
- Смещение оффсетов (Offset lag) и отставание консьюмеров 1С от потока событий реального времени.
- Блокировка сеансов 1С при синхронной отправке сообщений в Kafka топики.
1. Выбор архитектурного шлюза для 1С
Поскольку платформа 1С не имеет встроенного бинарного протокола Kafka, интеграция организуется через:
- Confluent Kafka REST Proxy: HTTP-шлюз enterprise-уровня, позволяющий публиковать и вычитывать сообщения JSON/Avro через стандартное
HTTPСоединение1С. - Специализированные внешние компоненты C++ (librdkafka): для высоконагруженных сценариев (десятки тысяч сообщений в секунду).
2. Реализация Kafka Producer на 1С (через REST Proxy)
Соединение = Новый HTTPСоединение("kafka-rest.corp.local", 8082, , , , 5);
Запрос = Новый HTTPЗапрос("/topics/orders_events");
Запрос.Заголовки.Вставить("Content-Type", "application/vnd.kafka.json.v2+json");
Запрос.Заголовки.Вставить("Accept", "application/vnd.kafka.v2+json");
// Формирование пакета с ключом партиционирования (для сохранения порядка)
СтрокаJSON =
"{
| \"records\": [
| {
| \"key\": \"" + ДокументСсылка.УникальныйИдентификатор() + "\",
| \"value\": {
| \"event\": \"OrderCreated\",
| \"doc_num\": \"" + ДокументОбъект.Номер + "\",
| \"amount\": " + Формат(ДокументОбъект.СуммаДокумента, "ЧГ=0; ЧДЦ=2; ЧРД=.") + "
| }
| }
| ]
|}";
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);3. Управление фиксацией смещений (Manual Offset Commit)
При чтении топика консьюмером на стороне 1С фиксируйте оффсет только после успешной записи изменений в базу данных. Это гарантирует сохранение позиции даже при аварийном рестарте ноды 1С.
Частые вопросы (FAQ)
Зачем передавать ключ сообщения (Key) при публикации в Kafka?
Kafka распределяет сообщения с одинаковым ключом в одну и ту же партицию (Partition), что гарантирует строгую последовательность (Order Guarantee) обработки событий по конкретному объекту (например, документу).
Какую семантику доставки сообщений можно обеспечить в связке с 1С?
Стандартно реализуется семантика At-Least-Once (как минимум один раз). Для обеспечения Exactly-Once требуется реализация таблицы идемпотентности (Idempotency Key) на стороне базы-приемника 1С.
Что такое Consumer Group Lag в мониторинге Kafka?
Lag показывает разницу между последним записанным сообщением в топике и последним прочитанным сообщением консьюмера 1С. Рост Lag означает, что воркеры 1С не успевают обрабатывать входящий поток.
Можно ли напрямую подключаться из 1С к брокерам Kafka без REST Proxy?
Напрямую через встроенный язык без сторонних утилит нельзя, так как протокол Kafka работает поверх кастомного бинарного TCP-протокола. Требуется использование внешних компонент Native API.