?

Log in

No account? Create an account
dump -0f - /dev/mind
Я знаю Haskell, OCaml, GSM, эндофункторы и много других страшных слов
GSM: почему биллинг делается так долго? 
20th-Nov-2006 04:14 pm
(заказной пост для en_vision) Допустим, ваш оператор делает биллинг (готовит ежемесячные счета) в течении 5-10 дней? Почему так долго? Казалось бы, делов-то - "select sum(rated_amount) from rated_calls group by contract_id", и вперед - печатать счета. Давайте попробуем разобраться, где же порылась собака.

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

За месяц получаем: 2*10^6 * 20 * 30 = 12 * 10^8 (1 млрд 200 млн). Это количество записей, прошедших через rating.

Что делает процесс биллинга в простейшем случае? Для каждого из 2-х млн абонентов он смотрит, какие контракты принадлежат каждому абоненту, выбирает звонки, сделанные контрактами, суммирует их, добавляет все необходимые ежемесячные абонплаты, и начисляет сверху налоги. По окончании расчета полученные данные засовываются в красивую печатную форму (например, в виде PostScript).

Тут все желающие уже могут провести пару простых экспериментов. Например, взять любую базу данных, засунуть в нее миллиард-другой записей и попробовать выполнить select, вынесеный мной в первые строчки поста. Результаты отмасштабировать в предположении, что у оператора процессоры будут СуперМощные, а памяти будет Дофигищща.

Все? Нет, не все. Стрижка только начата. Это мы построили самый простой биллинг, практически - сферический биллинг в вакууме.

Давайте добавим в картину мира услуги, плата за которые зависит от месячной активности абонента. Например, "абонент платит за сервис фиксированную сумму в день, но только в дни, когда он пользовался этой услугой" или "сумма ежемесячной абонплаты зависит от кол-ва дней, в течении которых контракт был активен". Чтобы рассчитывать такие суммы, нам придется делать детальный анализ таблицы событий в разрезе дней. Допустим, что такие услуги популярны, и нам надо делать это для бОльшей части абонентской базы.[1]

Давайте также добавим в картину мира так популярные нынче "бесплатные" (или входящие в абонплату) минуты/SMS-ы/MMS-ы и т.п. В терминах нашей модели это означает, что для каждого контракта существует некое кол-во минут N, и определенные (не все) звонки суммарной продолжительностью не более N должны быть исключены из счета. Учтем, что, как правило, N бесплатных минут не будут исчерпаны при помощи целого числа звонков - будет какой-то звонок, который попадет "на границу" и его придется порезать на две части - платную и бесплатную. И это тоже делает биллинг.[2]

Давайте еще учтем смену тарифных моделей. Если у абонента была модель A (X_1 грн в месяц, Y_1 "бесплатных" минут) и он 20-го числа поменял ее на модель B (X_2 грн в месяц, Y_2 бесплатных минут), то с абонента надо снять X_1*(20/30) грн и дать ему Y_1*(20/30) минут в рамках модели А, а в рамках модели B снять X_2*(10/30) грн и дать ему Y_2*(10/30) минут - пропорционально времени, которое он провел в каждой тарифной модели. Да, попутно надо не забыть пересчитать все абонплаты, которые зависят от месячной активности.[3]

Как, все еще помещаемся в пару часов? Сомневаюсь.

Погодите, но кроме счетов для абонента есть еще бухгалтерия. Надо показать, какие звонки абонента "закрывают" те или иные его платежи. Другими словами, если абонент заплатил два раза по 100 грн, а наговорил на 200 грн, то биллинг должен для каждого звонка указать, к какому платежу он "отнесен" - к первому или второму. И так для всех звонков всех абонентов.[4]

Теперь посчитаем налоги и все цифры для налоговых накладных (это, правда, можно делать только для абонентов-юрлиц).

В принципе, дальше уже можно не продолжать, думаю, что и так все должно быть понятно. Если кто-то сможет втиснуть это все в рамки нескольких часов - ему прямая дорога писать и продавать биллинговые системы. Можно миллионы будет на этом деле заработать.

На реплики "так это ж можно распараллелить на 100 серверов!" я, наверное, реагировать не буду, уж извините :)

PS
Предваряя отдельный рассказ про Intelligent Network, NextGenerationOSS, конвергентные, hot, almost-hot и другие "быстрые" решения, хочу закинуть такую "удочку": в системе, которая Сразу после события подбивает достоверный и окончательный баланс абонента, и абонент не может уйти в минус, невозможна нормальная реализация услуг, описаных в пунктах [1],[2],[3],[4].

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

UPD: тем не менее, многие все-таки решили написать мне о том, как прекрасно параллелится биллинг и, в частности, как прекрасно разделяется для этого на части база данных. Коллеги! Я сам придерживаюсь мнения, что среди биллингописателей множество идиотов. Множество - но не все. Подумайте о том, почему такое, казалось бы, тривиальное решение не было реализовано на практике кем-то из major players. А еще подумайте о том, что биллинг - он раз в месяц, а все остальные 27 дней с этой базой и этой таблицей тоже что-то происходит. Причем очень активно происходит, практически без перерыва. И разделение базы на части для этих процессов .... ээээ ... ну, скажем, не самое лучшее решение.
Comments 
20th-Nov-2006 11:15 pm (UTC)
в общем - так. Но, в целом, это задача, не идентичная по сложности доработке Оракла, так как существенно менее обща.

По множественные id - мы же о биллинге? "Биллинг пользуется одним". :)

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

В любом случае в рамках биллинга мы работаем в терминах одной системы идентификации абонента. Кстати - на самом деле, реально один б-м известный мне волею случая биллинг ОПСОСА рубит не по идентификатору абонента, а по другому, более "крупному" идентификатору, но это детали.

В общем - так делают, вполне успешно и не так уж редко. Бесспорно, свои неприятности есть и тут, но - где их нет...
22nd-Nov-2006 01:41 pm (UTC)
Индексы хранятся в БД, очевидно. :) И, собственно, наличие этой фазы никак не связано с партиционированием или другим решением проблемы масштабирования.

Точно никак не связано? А если нам надо найти запись не по тому ID, по которому мы порезали базу на partition-ы? Кто быстро нам расскажет, в какой из кусков базы лезть за соответствующими записями?

(впрочем, мне кажется, что дальше начинается спор о вкусах и гадания на кофейной гуще)
В там же стиле я могу сказать, что волею случая с десяток виденных мною биллингов не имели распределенной базы. Три из них (Oracle-based) имели явно прописанные рекомендации против использования partitioning.

:)
22nd-Nov-2006 02:30 pm (UTC)
Не то, чтобы я как-то настаивал, но в рамках конкретной задачи я полагаю, что смогу предложить разумное решение такого класса. А абстрактно - ну, фиг его знает, можно придумать запрос к БД, который в такой схеме никак не отработаешь (то есть - отработаешь очень дорого) - да только нужен ли он.

Зачем искать запись по идентификатору, который не является "родным" для БД?

У меня есть два возражения:

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

2. Партиционированная БД Яндекса, например, просто фигачит запросы во все (многие) партиции сразу, и сливает результат. Этот незамысловатый подход обслуживает весьма нехилый поток запросов, хотя, конечно, с эстетской точки зрения к нему можно попредъявлять много всего.

Резюмируя: конечно, даром ничего не обломится, и свои ограничения у партиционирования есть. И проблемы это, возможно, принесёт. А может и нет - смотря куда и как его вписать.
22nd-Nov-2006 04:06 pm (UTC)
Так тема-то в том, что нет "отдельной базы только для биллинга". Есть "база, данные из которой используются в том числе во время биллинга".

Отсюда и запросы по ID, который не "родной" для процесса биллинга, и другие процессы, которые "топчут" эту базу, и т.п.

Похож ли биллинг на конвейер или нет - в это контексте абсолютно все равно :)

Аналогию с базой яндекса можно проводить, но до какого-то предела. Рискну утверждать, что модель данных у яндекса будет попроще. А вот если добавить туда хранение версий все страниц, объединение (корреляцию) версий страниц в какие-нибудь "версии сайтов", отождествление сайтов с их владельцами, туда же - базу владельцев, по ним и их данным - тоже историю изменений, и произвольные запросы по всему этому добру плюс регулярное построение всяких аггрегированых статистик (а еще лучше - честный OLAP к этому делу).

Вот тогда можно будет посмотреть, хорошо ли работает подход "суем запрос во все партиции сразу" :)

С резюме - согласен на 100%
This page was loaded Oct 21st 2019, 2:46 am GMT.