При проектировании высоконагруженных интеграций и разработке публичных HTTP-сервисов в 1С разработчики часто сталкиваются с задачей минимизации обращений к базе данных. Возникает закономерный вопрос: предоставляет ли платформа 1С штатный механизм для организации глобального серверного кэша в оперативной памяти (Shared Memory), доступного одновременно всем сеансам и вызовам HTTP-сервисов?
Разберем архитектуру платформы, выясним причины ограничений встроенных инструментов и рассмотрим проверенные практические способы реализации быстрого кэширования данных.
Проанализируем стандартные платформенные инструменты и выясним, почему они не подходят для создания управляемого межсеансового In-Memory кэша:
ПоместитьВоВременноеХранилище): адреса временного хранилища строго привязаны к контексту конкретного пользовательского сеанса или фонового задания. Попытка прочитать адрес из другого сеанса приведет к ошибке отсутствия данных.На время сеанса изолирован внутри каждого отдельного сеанса. Кэш На время вызова сбрасывается по окончании вызова сервера. Кроме того, в платформе отсутствует программный API для точечной инвалидации (принудительного сброса) кэшированных значений при изменении данных в базе.rphost), которые могут быть распределены по разным физическим серверам. Память одного процесса rphost изолирована от других процессов на уровне операционной системы.Рассмотрим наиболее популярный и масштабируемый подход. Внешняя база данных типа «ключ-значение», работающая в оперативной памяти, выступает единым источником кэша для всех рабочих процессов кластера 1С.
Разберем типовой алгоритм работы HTTP-сервиса с внешним кэшем:
ПриЗаписи) отправляем команду на удаление ключа из кэша.Посмотрим на пример работы с сериализацией и десериализацией данных для кэша средствами платформы:
// Сериализация структуры данных перед отправкой в кэш
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Восстановление данных из кэша
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеИзКэша = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если задача заключается в отдаче неизменных или редко обновляемых ответов на входящие GET-запросы, перенесем логику кэширования за пределы 1С на веб-сервер или прокси-сервер.
Рассмотрим преимущества и схему реализации:
В сценариях с высокой частотой запросов в секунду (RPS) оптимальным решением является вынос API во внешний легковесный сервис (написанный на Go, C#, Node.js или Python).
Проанализируем взаимодействие компонентов:
Если кластер 1С развернут в рамках одного физического сервера, а использование внешних сетевых сервисов нежелательно, организуем кэш через разделяемую память операционной системы.
Разберем особенности реализации:
CreateFileMapping / MapViewOfFile в ОС Windows или shm_open / mmap в Linux).rphost загружает экземпляр компоненты и обращается к общему участку оперативной памяти ОС.