Оплата баз данных по тому, что они реально используют
Каждому приложению Mythex, которому нужно хранить данные, выделяется собственная база данных Postgres, а использование базы опубликованного приложения списывается с того же баланса кредитов, что и сборка. До конца сентября мы оценивали это использование по времени работы сервера приложения. Оценка оказалась неверной так, что это имело значение, и мы её заменили: теперь каждая база оплачивается по вычислительным ресурсам, которые её провайдер действительно измерил, по одному завершённому часу за раз, и каждый час может быть списан только один раз.
Как работают базы данных
Каждая база работает на serverless Postgres, который масштабируется до нуля: после нескольких минут простоя она засыпает и просыпается при следующем запросе. Пока она не спит, её вычислительные ресурсы могут расти и уменьшаться в зависимости от нагрузки. Именно это делает возможной «базу на каждое приложение»: большинство приложений почти всё время тихие, а спящая база почти ничего не стоит.
Из этого следует, что стоимость базы зависит от двух вещей, которые снаружи не видны: сколько времени она не спала и насколько большой она была, пока не спала.
В чём ошибалась оценка
Наш первоначальный счётчик делал допущение: за каждый час работы сервера опубликованного приложения списывать плату за базу по наименьшему размеру вычислительных ресурсов.
Это было неверно в трёх отношениях:
- Размер был неверным. На самом деле базы работали с большим размером по умолчанию, чем предполагала оценка.
- Базы масштабируются автоматически. Под нагрузкой они растут, а оценка этого не видела.
- Базы не следуют за сервером приложения. База остаётся активной, когда к ней обращается что-либо: приложение, запланированная задача, скрипт, который её опрашивает, — независимо от того, работал ли сервер приложения.
Итоговый эффект: оценка брала с пользователей примерно вдвое меньше того, что реально стоили базы. Для нас это было невыгодно, а кроме того, цифры использования в приложении не означали того, что люди под ними понимали.
Измерять, а не угадывать
Наш провайдер баз данных сообщает по каждому проекту compute-unit-seconds за час, то есть сколько вычислительных ресурсов реально использовано, включая размер. Поэтому счётчик теперь работает так:
- Для каждого опубликованного приложения с базой запрашивается измеренное использование за каждый завершённый час с момента запуска приложения.
- Использование переводится в стоимость по цене провайдера, применяется тариф плана, и сумма списывается с кредитов владельца приложения.
- Каждый раз просматривается назад до одного дня, поэтому часы, пропущенные, пока наш API перезапускался, всё равно оплачиваются позже.
Хранение оплачивается отдельно, по размеру, потому что оно не зависит от активности.
Никогда не списывать час дважды
Счётчик оплаты, который работает на нескольких серверах и может упасть и повторить попытку, должен быть осторожен, чтобы не списать дважды. Каждый час каждой базы захватывается в собственной строке базы данных до списания, с ограничением уникальности на пару (база, час). Если два сервера или повторная попытка пытаются оплатить один и тот же час, захват проходит только один раз.
Мы также сознательно выбрали поведение в редком случае сбоя: если процесс падает между захватом часа и его списанием, этот час остаётся захваченным и неоплаченным. Потерять небольшую часть выручки при редком сбое лучше, чем когда-либо списать с кого-то дважды.
А когда включился учёт по измеренному использованию, он начал с следующего полного часа. Предыдущие часы уже были списаны по старой оценке; если бы их снова оплатили по измеренным данным, этот период был бы оплачен дважды.
Что это значит, если вы строите на Mythex
- Счёт за базу теперь отражает то, что делала ваша база. Редко используемое приложение стоит очень мало; приложение, которое постоянно обращается к базе, не даёт ей уснуть и стоит дороже.
- Самый большой рычаг — то, как ваше приложение использует базу. Опрос базы каждые несколько секунд не даёт ей уснуть круглосуточно. Если запрашивать данные у ИИ по требованию или кэшировать их, база может спать. Наш гайд о том, что такое база данных объясняет основы.
- Тарифы Pro платят за хостинг, базы данных и хранение половину ставки Free. Подробности — в документации по кредитам.
Что мы из этого вынесли
- Оценки стоимости, зависящей от использования, со временем расходятся с реальностью. Когда вышестоящий провайдер может сказать, что было использовано, выставляйте счёт по этим данным.
- Делайте оплату идемпотентной на самой мелкой единице, за которую вы берёте деньги. Для нас это один час работы базы.
- Если нужно ошибаться, ошибайтесь в пользу клиента.