Настройка «внешней» очереди регистрации изменений на REDIS
В стандартной поставке Экстрактора 1С, в качестве хранилища списка «Очереди изменений» используется «Регистр сведений».
В некоторых случаях, может потребоваться вынос очереди изменений в внешний сервис:
Когда скорости записи в регистр сведений «Очередь изменений» не хватает
Когда Регистрация изменений выполняется в «Рабочей» базе 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С» и «реплика 1С» подключаются к одному сервису Redis
И «рабочая 1С» - сохраняет в Redis данные очереди изменений
А «реплика 1С» - эту очередь из Redis читает и исполняет в части выполнения проектов выгрузки Экстрактора 1С
Начиная с релиза 3.12.1.82 Экстрактора 1С, была улучшена работа с сервисом http_redis.
В частности, был добавлен параметр чтения очереди - &limit=... , что позволяет управлять объемом чтения за одну транзакцию, а также была сделана оптимизация обработки очереди из Redis внутри ядра Экстрактора 1С.
Чтобы применить изменения необходимо:
Обновить сервис http_redis следующим образом:
Переходим в каталог сервиса (туда, где лежит docker-compose.yml)
Останавливаем сервис:
docker compose downМеняем 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Запускаем:
docker compose up -d
Обновляем Экстрактор 1С до версии 3.12.1.82 и выше.
Готово!