РешенияБэкенд для каждого пользователя
Отдельный экземпляр для каждого пользователя
Ключ в запросе направляет каждого пользователя, арендатора или агента в собственный экземпляр, который сохраняет память и диск и спит между запросами.
from glac import Glac
glac = Glac()
app = glac.cube.deploy(
"ghcr.io/acme/notes:2", name="notes", port=8080,
keys={"from": {"header": "X-User"}, # the key
"delete_after_idle_ms": 30 * 86_400_000},
scale={"suspend_after_ms": 1000}) # sparse traffic: asleep a second after
# a request with X-User: ada reaches ada's own instance
ada = app.instance("ada") # or make or wake it from codeСостояние на пользователя — и плата за каждый час
Процесс на каждого пользователя — самая простая схема, но если держать его запущенным, вы платите и тогда, когда пользователя нет. Здесь экземпляр каждого ключа спит между запросами, и вы платите только за то, что он хранит.
Как работает маршрутизация по ключу
Укажите в keys.from заголовок или сегмент пути. Первый запрос с новым ключом создаёт его экземпляр; все следующие попадают в тот же экземпляр, с его памятью и диском. Запросы без ключа делят общие экземпляры приложения.
Что получает экземпляр каждого пользователя
Выберите схему: общие экземпляры или отдельный на ключ каждого пользователя.
Ключ из запроса — в заголовке или пути; первый запрос создаёт экземпляр.
Состояние на каждого пользователя: память, которая сохраняется во сне, собственный диск и том.
Сколько это стоит: во сне — ничего за CPU, только за хранение.
Время жизни задаёте вы: проспав столько, экземпляр удаляется, а по его ключу создаётся заново.
Потребление по ключам — каждый экземпляр несёт свой ключ как метку.
Иллюстрации условны
Измерено, а не обещано
Медианы на физическом сервере без другой нагрузки: это лучший случай, и мы так и говорим. Экземпляр ключа устроен так же, как песочница, на которой это измерено. Как мы измеряем
- на пробуждение спящего экземпляра2
- 3.5 мс
- на разбудивший вызов, от отправки до ответа2
- 6.7 мс
- на усыпление вместе с памятью и процессами2
- 2.3 мс
Когда сервис откроется, это можно будет проверить на своих ключах: строка лога о запросе, который разбудил экземпляр, показывает, сколько длилось пробуждение.
glac cube logs notes -f
# one line a request; one that woke an instance says how long it tookИспользуемые продукты
- КубЛюбой образ контейнера как приложение, которое спит между запросамиПриложение с ключами: по экземпляру на каждого пользователя, арендатора или агента.
- ТомДиски Куба, которые переживают свой экземплярДиски для того, что должно пережить экземпляр пользователя.
- ПесочницаСвой компьютер для каждого агентаАгент для каждого пользователя под управлением через API.
Расчёт на месяц
Десять тысяч пользователей, у каждого собственный экземпляр, по прайс-листу. Рассчитать свой вариант
Нагрузка
- 10 000 пользователей, у каждого собственный экземпляр, используется 256 MiB.
- Каждый пользователь делает 300 запросов в день в течение 30 дней, каждый на 20 мс CPU и с ответом 5 KB, в случайное время.
- Приложение настроено так, чтобы экземпляр засыпал по-настоящему через секунду после остановки (scale.suspend_after_ms 1000): это настройка для такого редкого трафика. Запросы одного пользователя приходят с интервалом в несколько минут, а экземпляр, приостановленный в памяти между ними, всё это время оплачивается за эту память. Поэтому каждый экземпляр активен, пока отвечает, и ещё 1 с после, затем ещё 1 с приостановлен, а потом спит с сохранённой памятью и хранит около 100 MB.
- Чего это стоит: запрос, который застаёт свой экземпляр спящим, получает ответ за 6.7 мс, а приостановленный экземпляр ответил бы за 0.43–1.72 мс; кроме того, каждое засыпание и пробуждение занимает 25.6 мс CPU, и это учтено в CPU за месяц.
Месяц по прайс-листу
- CPU4.3 миллиарда CPU-мс × $0.01 / млн$42.95
- Память12 581 GiB-ч × $0.008$100.65
- Запросы90 миллионов × $0.30 / млн$27.00
- Исходящий трафик450 GB × $0.004$1.80
- Хранится во сне1 000 GB-месяца × $0.02$20.00
На тарифе «Платный» этот месяц обойдётся в $189.60: плата $5 и $184.60 сверх включённых объёмов — с баланса по тем же ценам.
Дайте каждому пользователю свой экземпляр
Ключ, а затем приложение с keys.from, развёрнутое одним вызовом.