Когда мы создавали облако, одной из сложных задач было написание биллинга.
Мы решили пойти по пути максимального разделения компонентов и ослабления связей (weak linking).
Благодаря этому весь процесс разделен на несколько независимых компонентов: сбор информации о потреблении ресурсов компонентами виртуальной машины, хранение этой информации, списание средств со счетов клиентов, хранение истории списания средств (где-то рядом с историей пополнения и выдачи).
бумажные счета-фактуры и др.
).
д.).
Как видите, есть два больших этапа: сбор информации о потреблении (денег на этом этапе еще нет, но есть байты, секунды, запросы) и процесс превращения их в деньги (как и все, что с этим связано).
- списание, хранение истории).
Вот тизер — еженедельный график общей суммы списанных с клиентов денег:
Именно между «потреблением» и «списанием денег» обнаруживается самая слабая связь.
Для каждого объекта, принадлежащего клиенту, мы храним поля с одним или несколькими учетными ресурсами.
Как описано ранее, память и время процессора являются атрибутами виртуальной машины, дисковые операции — vbd, дисковое хранилище — vdi, а сеть — vif. Система, собирающая информацию, оказалась естественно распределенной.
Сама наша услуга называется потреблением.
Данные этого сервиса хранятся в ха-кластере в централизованной базе данных (чтобы при миграции/перезапуске машины между облачными узлами статистика продолжала считаться другим сервисом, но в той же базе данных).
Сервис списания денег расположен «ближе» к базе данных с деньгами и полностью независим от остальных составляющих, он берет расход, цену, баланс и выводит новый баланс и списание, не думая ни о чем другом.
Он получает данные от сервиса через SCAPI (об этом я буду много писать, когда мы представим его публике, пока это лишь внутреннее средство взаимодействия между компонентами).
Когда мы создавали систему, было решено раз и навсегда отказаться от дробных копеек на счете клиента.
Минимальная единица списания – копейка.
Для этого мы ввели простое правило: средства на ресурс списываются только тогда, когда их остается копейки и списывается так, чтобы не было дробных копеек (то есть остается небольшой неоплаченный остаток).
На данный момент сервис списания проходит по машинам раз в минуту, хотя ничто не мешает (кроме вопросов чрезмерной нагрузки на серверы) делать это на любой скорости.
Когда клиент видит «0» в графе потребления ресурсов в панели, это обычно означает, что ресурс еще не насчитал ни копейки.
При этом, как понятно, идея «списывать только целые копейки» не имеет ничего общего с точностью учета в сервисе потребления, где точность определяется размером int64 (поэтому мы и отказались от наносекунд в пользу микросекунд для процессорного времени) и осмысленности значения (например, базовое значение для оперативной памяти у нас килобайт, а не байт, потому что выделить меньше килобайта, точнее, четырех килобайтов невозможно — размер страницы памяти).
Разумеется, никакого «округления трафика до мегабайт» или прочих опсосовых выдумок.
Сколько посчитали - столько и посчитали.
Отсюда вычитается расход на целую сумму рублей/копеек, и именно это и списывается со счета клиента.
Остаток будет добавлен к последующему потреблению и списан одновременно.
В дальнейшем при передаче по «списку» значения увеличиваются, хотя точность не теряется, так как увеличение не влияет на сумматоры.
Ради интереса, вот цепочка агрегирования времени процессора: xen: наносекунда; потребление: микросекунды; услуга списания: вторая; веб-интерфейс: час.
Теги: #selectel Cloud #selectel Cloud #selectel Cloud #selectel Cloud #биллинг #учет ресурсов
-
Рузицка, Леопольд
19 Oct, 24 -
Очередные Проблемы Icq
19 Oct, 24 -
Почему Я Не Верю В Интернет?
19 Oct, 24 -
Образ Жизни Разработчиков
19 Oct, 24 -
Вы Пойдете В Cib?
19 Oct, 24