Cluster · разработчикам
Кэширование
Cluster повторно использует результаты дорогих операций, если исходные данные не изменились. Кэш находится в памяти процесса. После перезапуска он пустой; первая операция снова подготавливает данные.
Что сохраняется
| Данные | Срок | Ограничение | Когда обновляются |
|---|---|---|---|
| Загруженные фоны Image Generator | 5 минут | 16 записей, 4 MiB | При изменении SHA-256 или размера; отдельно для каждого вызывающего экземпляра |
| Подготовленные слои | 5 минут | 128 записей, 24 MiB пикселей RGBA | При изменении содержимого, размеров, оформления или вложенных слоёв |
| Готовые PNG | 30 секунд | 8 записей, 4 MiB | При изменении сцены, исходных изображений или вызывающего экземпляра |
| Шрифты генератора | 10 минут | 24 сочетания семейства и размера, бюджет 8 MiB | При выборе другого семейства или размера; после перезапуска генератора |
| Собственный профиль Telegram | 30 секунд | Общий кэш соединения: 128 записей, бюджет 1 MiB | После изменения профиля через Cluster, общего TL-запроса или переподключения |
| Профиль личного бота | 30 секунд | Одна запись, бюджет 16 KiB на соединение | После переподключения; ошибки не сохраняются |
| Адресаты и результаты загрузки файлов в Telegram | 30 секунд | Входят в кэш того же соединения | Для файлов проверяются путь, имя, размер, время изменения и идентификатор файла в файловой системе |
| Текст исходников | 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.