Jump to content

Дисконект юзера по окончании предоплаченного трафика


Recommended Posts

Делал ли кто либо такую связку, реализовывал ли такую возможность при таковой ситуации?

Т.е. - проплатил пользователь 300 грн, при тарифном плане 50 грн/мес, абонплата снялась согласно тарифному плану, остаток на счету 250 грн и при достижении своего порога (например 5 Гб) интернет отключался.

 

ЗЫ: не очень удобно выходит, когда после достижения порога интернет считается по иному (помегабайтному) тарифу.

Link to post
Share on other sites

Подключение абонентов каким способом происходит?

 

Если например все абоненты пользуются авторизатором, тогда можно в скрипт ОнКоннект добавить проверку -

Если текущий трафик меньше 5 Гб, тогда проводить подключение, иначе выдать сообщение в авторизатор - Вы превысили лимит трафика.

 

А, читать трафик можно из файла stat, если у вас БД на файлах.

 

Если же например у вас реализовано через СУБД - тогда читать из базы этот параметр.

 

Ну и еще следить за трафиком, когда юзер в это время онлайн и он превысил лимит - пока такого ничего в голову не приходит, может еще товарищ madf посоветует.

Link to post
Share on other sites

Хз, я для такого просто при достижении конкретного порога в Х% от номинала тарифа засовываю пользователей в отдельную табличку (что там будет - динай или хитрый пайп уже не суть важно). Ровно три с половиной квериза.

 

А вобще писанины включая дебаг и вылизывание с распитием спиртных напитков - там на час.

 

Всего-то складировать куда-надо кроном SELECT `ip` from `users` WHERE `tariff`='xxxxx' AND `D0`+`U0`>yyyy

Link to post
Share on other sites

Вроде ничего не придумывается кроме как по крону опрашивать список на предмет отсутствия FreeMB и делать им disable.

 

Ну еще можно подпатчить метод IsInetable в файле user.cpp чтобы он срабатывал по этому признаку.

Link to post
Share on other sites

Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

возникла мысль find-ом лазить в файл stat пользователя (БД - файловая). при достижении величины больше тарифного плана, то отключать пользователя.

но как поступать, когда несколько тарифных планов с разной "абонплатой/объём трафика"?

 

ЗЫ: я так понимаю ни у кого такой задачи не стояло. т.е. все (или большинство) просто продают трафик помегабайтно. у нас просто схема предоплаты 1го числа за определенный объём, а сверх лимита очень быстро деньги убегают.

Link to post
Share on other sites
Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

При методе коллекции нетфловом сессии тоже не все одновременно експайрятся и пишутся в базу.

 

Если стартовать скрипт скажем сразу после StatWritePeriod = 10 то при скорости 1 мбит у пользователя может набежать аж 76 мег. Быстрее чем StatWritePeriod всеравно не будет поскольку банально неоткуда будет брать изменение трафика за период.

 

. т.е. все (или большинство) просто продают трафик помегабайтно

нет, все давно продают анлимы :o

 

а сверх лимита очень быстро деньги убегают.

а кто у вас на кого работает?

 

Ну выставьте цену послепороговую в 0 если так о неконтролирующих себя пользователях печетесь и отламываейте их скриптом как указано выше сразу после StatWrite героически жертвуя своими 76 мб :o

 

Конечно можно писать детальную стату и раз в минуту но это бред.

Link to post
Share on other sites

Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

возникла мысль find-ом лазить в файл stat пользователя (БД - файловая). при достижении величины больше тарифного плана, то отключать пользователя.

но как поступать, когда несколько тарифных планов с разной "абонплатой/объём трафика"?

 

ЗЫ: я так понимаю ни у кого такой задачи не стояло. т.е. все (или большинство) просто продают трафик помегабайтно. у нас просто схема предоплаты 1го числа за определенный объём, а сверх лимита очень быстро деньги убегают.

Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

Link to post
Share on other sites
Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

а, кстати да - что-то ступил :o

 

А у анлимов часом не всегда 0? Ну тогда <0, да?

 

Ну тобишь так SELECT `ip` from `users` WHERE `FreeMb`<0 ?

Link to post
Share on other sites

Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

 

Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные.

Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

 

madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется?

 

Идея - но для этого нужно реализовывать отдельный процесс, которые будет всегда следить за трафиком - и этот же процесс будет рубать пользователя.

Link to post
Share on other sites
Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

можно, в чем проблема? только что-то мне подсказывает что вы зае....сь реалтайм траффик мониторить :o

Link to post
Share on other sites

Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные.

Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

 

madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется?

действительно ли этот StatWritePeriod параметр отвечает за периодичность записи в файл stat? и как будет вести себя СТГ при 500 пользователях постоянно записывая эту информацию?

Link to post
Share on other sites
действительно ли этот StatWritePeriod параметр отвечает за периодичность записи в файл stat?

[sarcasm]нет блин, он чисто по приколу рассматривает этот параметр[/sarcasm]

 

и как будет вести себя СТГ при 500 пользователях постоянно записывая эту информацию?

точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить?

Link to post
Share on other sites

Для реалтайма надо установить нотификатор на изменения property.freeMb и при переходе через 0 выполнять действия. Но это значительное вмешательство в код.

И да, он действительно пишет в соответстсвии со StatWritePeriod. И на 500 нормально, и на 6000 нормально. В т.ч. нормально на файловой базе и на PostgreSQL. По MySQL у меня данных нет, но думаю что и там нормально.

Link to post
Share on other sites

Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

 

Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные.

Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

 

madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется?

 

Идея - но для этого нужно реализовывать отдельный процесс, которые будет всегда следить за трафиком - и этот же процесс будет рубать пользователя.

Держит в памяти и не обнуляет при записи. Обнуляет в момент перехода через полночь или при отключении авторизатора. И то - только за сессию. Месачный обнуляется при переходе через месяц.

Зачем отдельный? Stargazer и так следит за трафиком.

Link to post
Share on other sites

точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить?

 

:) Ну, это конечно гон уже писать раз в минуту стату.

 

madf, не могли бы вы немного рассказать как СТЖ держит в памяти данные о трафике, и как можно было бы эти данные вытянуть - чисто для личного развития.

Link to post
Share on other sites
Ну, это конечно гон уже писать раз в минуту стату.

извините, тег sarcasm закрыл не там где надо :)

 

и как можно было бы эти данные вытянуть - чисто для личного развития.

подозреваю что увидеть их можно только при помощи sgconfxml либо нативным конфигуратором.

 

Есть чувствие что --d0 берет данные не из базы, хотя нада сорц посмотреть.

Link to post
Share on other sites

точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить?

 

:) Ну, это конечно гон уже писать раз в минуту стату.

 

madf, не могли бы вы немного рассказать как СТЖ держит в памяти данные о трафике, и как можно было бы эти данные вытянуть - чисто для личного развития.

Отчего ж не рассказать, раскажу. Очень просто держит. В приватных членах класса USER - шаблонных переменных типа USER_PROPERTY<тип> (см. user_property.h). Из методов класса USER (см. user.h) доступ можно получить непосредственно по именам, как это, например, сделано в методе записи статистики:

int USER::WriteStat()                                                                   
{                                                                                       
STG_LOCKER lock(&mutex, __FILE__, __LINE__);                                            
USER_STAT us;                                                                           

us.up = up;                                                                             
us.down = down;                                                                         
us.cash = cash;                                                                         
us.freeMb = freeMb;                                                                     
us.lastCashAdd = lastCashAdd;                                                           
us.lastCashAddTime = lastCashAddTime;                                                   
us.passiveTime = passiveTime;                                                           
us.lastActivityTime = lastActivityTime;                                                 

printfd(__FILE__, "USER::WriteStat()\n");                                               

if (store->SaveUserStat(us, login))                                                     
   {                                                                                   
   WriteServLog("Cannot write stat for user %s.", login.c_str());                      
   WriteServLog("%s", store->GetStrError().c_str());                                   
   printfd(__FILE__, "Cannot write stat for user %s.\n", login.c_str());               
   printfd(__FILE__, "%s\n", store->GetStrError().c_str());                            
   return -1;                                                                          
   }                                                                                   

lastWriteStat = stgTime;                                                                

return 0;                                                                               
}          

(перемнные up, down, cash. freeMb, и т.д.). "Снаружи", из методов других классов доступ можно получить через публичный член класса property (см. user_property.h), используя методы Get и Set. Например:

user_iter u;

if (users->FindByName("vasya_pupkin", &u))
   {
   return -1;
   }

double cash = u->property.cash.Get();
u->property.freeMb.Set(100, currAdmin, "vasya_pupkin", store, "100 грн на шару!");

currAdmin - указатель на переменную типа ADMIN (см. admin.h), описывающую админа который получил доступ к системе.

store - указатель на переменную класса BASE_STORE (см. base_store.h), предоставляющую интерфейс к БД.

Последний параметр у Set - текстовый комментарий к изменению.

Добавлю, что данные о трафике (up и down) представлены типами DIR_TRAFF (см. user_traff.h), представляющими собой класс-обертку над массивом типа uint64_t[DIR_NUM], где DIR_NUM - максимальное количество направлений тарификации в системе.

Link to post
Share on other sites
и как можно было бы эти данные вытянуть - чисто для личного развития.

подозреваю что увидеть их можно только при помощи sgconfxml либо нативным конфигуратором.

 

Есть чувствие что --d0 берет данные не из базы, хотя нада сорц посмотреть.

Не из базы. Из памяти. Это ж данные за сессию, а не месячные.

Link to post
Share on other sites

Можно тупо написать плагин в котором поставить нотификаторы на изменение freeMb и отключать/включать юзера. К стати очень простой плагин, даже без внутреннего потока. Буквально 2-3 функции. И будет вам реалтаймовость и все такое.

Link to post
Share on other sites

А, вообще можно по-интересоваться у автора темы, для чего такое делать. Все известные мне провайдеры, самопальные локалки и т.д. пытаются заработать как можно больше денег, и того как бы продать по-больше трафика = больше продал - больше заработал. Почему не давать юзеру, чтобы он дальше пользовался инэтом, пусть просто платит больше денег - и того больше прибыль.

 

ЗЫ:

madf, благодарю за лекцию.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...