Как Работает Облачный Биллинг?

Когда мы создавали облако, одной из сложных задач было написание биллинга.

Мы решили пойти по пути максимального разделения компонентов и ослабления связей (weak linking).

Благодаря этому весь процесс разделен на несколько независимых компонентов: сбор информации о потреблении ресурсов компонентами виртуальной машины, хранение этой информации, списание средств со счетов клиентов, хранение истории списания средств (где-то рядом с историей пополнения и выдачи).

бумажные счета-фактуры и др.

).

д.).

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

- списание, хранение истории).

Вот тизер — еженедельный график общей суммы списанных с клиентов денег:

Как работает облачный биллинг?

Именно между «потреблением» и «списанием денег» обнаруживается самая слабая связь.

Для каждого объекта, принадлежащего клиенту, мы храним поля с одним или несколькими учетными ресурсами.

Как описано ранее, память и время процессора являются атрибутами виртуальной машины, дисковые операции — vbd, дисковое хранилище — vdi, а сеть — vif. Система, собирающая информацию, оказалась естественно распределенной.

Сама наша услуга называется потреблением.

Данные этого сервиса хранятся в ха-кластере в централизованной базе данных (чтобы при миграции/перезапуске машины между облачными узлами статистика продолжала считаться другим сервисом, но в той же базе данных).

Сервис списания денег расположен «ближе» к базе данных с деньгами и полностью независим от остальных составляющих, он берет расход, цену, баланс и выводит новый баланс и списание, не думая ни о чем другом.

Он получает данные от сервиса через SCAPI (об этом я буду много писать, когда мы представим его публике, пока это лишь внутреннее средство взаимодействия между компонентами).

Когда мы создавали систему, было решено раз и навсегда отказаться от дробных копеек на счете клиента.

Минимальная единица списания – копейка.

Для этого мы ввели простое правило: средства на ресурс списываются только тогда, когда их остается копейки и списывается так, чтобы не было дробных копеек (то есть остается небольшой неоплаченный остаток).

На данный момент сервис списания проходит по машинам раз в минуту, хотя ничто не мешает (кроме вопросов чрезмерной нагрузки на серверы) делать это на любой скорости.

Когда клиент видит «0» в графе потребления ресурсов в панели, это обычно означает, что ресурс еще не насчитал ни копейки.

При этом, как понятно, идея «списывать только целые копейки» не имеет ничего общего с точностью учета в сервисе потребления, где точность определяется размером int64 (поэтому мы и отказались от наносекунд в пользу микросекунд для процессорного времени) и осмысленности значения (например, базовое значение для оперативной памяти у нас килобайт, а не байт, потому что выделить меньше килобайта, точнее, четырех килобайтов невозможно — размер страницы памяти).

Разумеется, никакого «округления трафика до мегабайт» или прочих опсосовых выдумок.

Сколько посчитали - столько и посчитали.

Отсюда вычитается расход на целую сумму рублей/копеек, и именно это и списывается со счета клиента.

Остаток будет добавлен к последующему потреблению и списан одновременно.

В дальнейшем при передаче по «списку» значения увеличиваются, хотя точность не теряется, так как увеличение не влияет на сумматоры.

Ради интереса, вот цепочка агрегирования времени процессора: xen: наносекунда; потребление: микросекунды; услуга списания: вторая; веб-интерфейс: час.

Теги: #selectel Cloud #selectel Cloud #selectel Cloud #selectel Cloud #биллинг #учет ресурсов

Вместе с данным постом часто просматривают: