Cluster · разработчикам

Кэширование

Cluster повторно использует результаты дорогих операций, если исходные данные не изменились. Кэш находится в памяти процесса. После перезапуска он пустой; первая операция снова подготавливает данные.

Что сохраняется

ДанныеСрокОграничениеКогда обновляются
Загруженные фоны Image Generator5 минут16 записей, 4 MiBПри изменении SHA-256 или размера; отдельно для каждого вызывающего экземпляра
Подготовленные слои5 минут128 записей, 24 MiB пикселей RGBAПри изменении содержимого, размеров, оформления или вложенных слоёв
Готовые PNG30 секунд8 записей, 4 MiBПри изменении сцены, исходных изображений или вызывающего экземпляра
Шрифты генератора10 минут24 сочетания семейства и размера, бюджет 8 MiBПри выборе другого семейства или размера; после перезапуска генератора
Собственный профиль Telegram30 секундОбщий кэш соединения: 128 записей, бюджет 1 MiBПосле изменения профиля через Cluster, общего TL-запроса или переподключения
Профиль личного бота30 секундОдна запись, бюджет 16 KiB на соединениеПосле переподключения; ошибки не сохраняются
Адресаты и результаты загрузки файлов в Telegram30 секундВходят в кэш того же соединенияДля файлов проверяются путь, имя, размер, время изменения и идентификатор файла в файловой системе
Текст исходников5 минут256 записей, бюджет 8 MiBПри изменении файла; сведения о файле проверяются перед каждым чтением из кэша
Контрольные суммы исходников5 минут1024 записи, бюджет 512 KiBПри изменении файла
Версия установленного ядраВремя работы ядраОдна строкаПосле перезапуска ядра

При заполнении кэша удаляются записи, которые дольше не использовались. Чтение не продлевает срок хранения. Истёкшие записи удаляются при обращениях к кэшу; отдельный фоновый процесс для них не запускается.

Бюджет пиксельных слоёв считается по несжатому размеру изображения. Для шрифтов и служебных объектов используется оценка размера и отдельное ограничение числа записей. Бюджеты не означают предел всей памяти процесса: текущая сцена, активные загрузки, библиотека Pillow и выполнение Python занимают дополнительную память.

Изображения

await drawing.upload(source) сначала проверяет доступ к исходному File, если передан файл Cluster. После этого SDK запрашивает фон с теми же SHA-256 и размером у генератора. При попадании передавать байты повторно не требуется. Выдаётся новый временный Asset, принадлежащий вызывающему экземпляру.

При первой загрузке SDK передаёт до пяти частей по 3 KiB одним вызовом. Объём события остаётся в пределах 32 KiB. Старый генератор без поддержки кэша использует прежнюю передачу по одной части.

Asset.delete() и выход из async with освобождают идентификатор загрузки. Ограниченная копия исходных байтов может оставаться в кэше до пяти минут. Удалённый идентификатор повторно использовать нельзя. Чтобы получить новый, снова вызови upload.

Кэш слоёв учитывает содержимое изображения, поэтому новый идентификатор того же фона не заставляет снова декодировать и масштабировать его. Текст, цвета, прозрачность, поворот, размеры и вложенные группы участвуют в ключе слоя. Данные разных вызывающих экземпляров не используют общий кэш изображений.

render продолжает создавать отдельный временный файл. Он проходит обычные проверки прав и квоты. Контекстный менеджер удаляет временный файл после использования. Готовая карточка Ping не замораживается: время работы, задержка и прочие значения берутся для текущего вызова, а неизменившиеся слои используются повторно.

Вызовы модулей

Call.wait() ожидает сигнал завершения от ядра. Если результат готов раньше периода poll, ожидание заканчивается сразу. Между окончанием функции и получением результата больше нет обязательной паузы в 100 мс. Для долгой функции период ограничивает ожидание одного ответа и позволяет повторно проверить состояние вызова.

Результат не считается разрешением на дальнейшие операции. Перед выдачей результата ядро снова проверяет права вызывающего модуля и состояние зависимости. Истечение timeout не отменяет чужую функцию и не отправляет её повторно.

Актуальность и доступ

Права модулей, доступ овнеров и доверок, состояние подписки, секреты, результаты платежей и произвольные ответы сторонних HTTP-сервисов автоматически не кэшируются этим механизмом. Они продолжают проходить проверки ядра. Удаление файла и отзыв доступа не позволяют получить его через повторный вызов upload.

Кэш собственного профиля Telegram может до 30 секунд отражать прежнее имя, если профиль изменён с другого устройства. Изменение через методы Cluster сбрасывает эту запись сразу. После смены аккаунта или закрытия соединения кэш соединения удаляется.

Статические файлы сайта с хэшем в имени браузер хранит отдельно. Ответы прикладного API сохраняют Cache-Control: no-store.