Настройка «внешней» очереди регистрации изменений на REDIS

В стандартной поставке Экстрактора 1С, в качестве хранилища списка «Очереди изменений» используется «Регистр сведений».

В некоторых случаях, может потребоваться вынос очереди изменений в внешний сервис:

  1. Когда скорости записи в регистр сведений «Очередь изменений» не хватает

  2. Когда Регистрация изменений выполняется в «Рабочей» базе 1С, а выгрузка данных в БД-приемник должна делаться из «ночной копии» этой базы 1С

Так как у 1С нет нативного подключения к СУБД Redis, то мы сделали специальный прокси-сервис, которые транслирует команды Экстрактора 1С из/в 1С в/из Redis - “http-api-redis”:

Для работы http-api-redis требуется:

  • отдельная виртуальная машина на Linux, на которой разворачивается docker-образ http_api_redis, которая соответствует минимальным системные требованиям: 4-ехъядерный процессор и 16 ГБ оперативной памяти;

  • Установленный кластер Redis (конфигурируется Заказчиком, исходя из его нагрузки и потребностей)

  • сетевая связность между Кластером 1С <→ http-api-redis <→ Redis

http-api-redis — это специализированное решение для Экстрактора 1С, позволяющее взаимодействовать 1С и Redis в любой операционной системе (именно по этому и выбран http-протокол).

Подключить «внешнюю» очередь регистрации изменений на REDIS можно в разделе «Настройки» Экстрактора 1С.

Общий принцип работы

Каждая работающая «Подписка на события» в 1С Экстрактора 1С делает серверный вызов через http-api-redis и формирует «ключ-значение» для комбинации:

  • Проект;

  • Строка проекта;

  • Партиция;

  • И в «Значение» пишет набор «Параметров» для выгрузки партиции.

Что важно:

При использовании Redis и при использовании «Регистра сведений» используется режим «грязной» записи

Т.е. при записи в «Очередь изменений», инициированного подпиской, система не проверяет дубли, а просто добавляет новую запись.

Все проверки на «дубли», чистка их делается уже в процессе выгрузки (исполнения) Проекта

Это позволяет:

  • Избежать блокировок на Регистре сведений

  • Фиксировать события максимально быстро

Когда приходит время выгрузки Проекта в Экстракторе 1С, то Экстрактор 1С делает

  • выборку по маске GUIDПроекта*

  • получает текущий список изменений

  • «схлопывает» повторяющиеся значения

  • и по полученному списку выгружаемых «партиций» с «отборами» делает выгрузку

  • далее, из Redis успешно выгруженные записи

Используемые Экстрактором 1С - методы (внутри http-api-redis):

В htp-api-redis встроен Swagger, доступный по адресу: http://IP-адрес:Port/swagger/index.html

С помощью метода POST(/api/v1/Redis) мы передаем комбинацию:

  • В заголовке - ключ (составной ключ Guid проекта + СтрокаПроекта + Партиция + РандомныйХвост)

  • В Data - Набор параметров (в json/xml)

В результате в Redis записывается уникальная запись Ключ: Значение

Далее, когда Экстрактор 1С запускает Проект на выполнение, то Экстрактор 1С

а) сначала вычитывает накопленный ранее массив ключей по методу GET (/api/v1/Redis) по маске ключей: Ключ*

б) Перебирает все ключи, группирует их и обрабатывает как «Очередь изменений»

в) и потом удаляет обработанные ключи методом DELETE (/api/v1/Redis)

Есть еще следующий кейс (но учтите, что на больших базах он еще не проверялся. Сначала проверяйте на тестовых средах):

  1. Создается реплика базы 1С

  2. И «рабочая 1С» и «реплика 1С» подключаются к одному сервису Redis

  3. И «рабочая 1С» - сохраняет в Redis данные очереди изменений

  4. А «реплика 1С» - эту очередь из Redis читает и исполняет в части выполнения проектов выгрузки Экстрактора 1С

Начиная с релиза 3.12.1.82 Экстрактора 1С, была улучшена работа с сервисом http_redis.

В частности, был добавлен параметр чтения очереди - &limit=... , что позволяет управлять объемом чтения за одну транзакцию, а также была сделана оптимизация обработки очереди из Redis внутри ядра Экстрактора 1С.

Чтобы применить изменения необходимо:

  1. Обновить сервис http_redis следующим образом:

    1. Переходим в каталог сервиса (туда, где лежит docker-compose.yml)

    2. Останавливаем сервис: docker compose down

    3. Меняем 1 строку в docker-compose.yml с image: git.denvic.ru:5050/pub/rest-api-redis/redisapiweb:1.0.7 на image: git.denvic.ru:5050/pub/rest-api-redis/redisapiweb:latest

    4. Запускаем: docker compose up -d

  2. Обновляем Экстрактор 1С до версии 3.12.1.82 и выше.

  3. Готово!