lalex 0 Опубликовано: 2010-06-29 15:01:26 Share Опубликовано: 2010-06-29 15:01:26 Делал ли кто либо такую связку, реализовывал ли такую возможность при таковой ситуации? Т.е. - проплатил пользователь 300 грн, при тарифном плане 50 грн/мес, абонплата снялась согласно тарифному плану, остаток на счету 250 грн и при достижении своего порога (например 5 Гб) интернет отключался. ЗЫ: не очень удобно выходит, когда после достижения порога интернет считается по иному (помегабайтному) тарифу. Ссылка на сообщение Поделиться на других сайтах
Небесный 26 Опубліковано: 2010-06-29 19:22:53 Share Опубліковано: 2010-06-29 19:22:53 Подключение абонентов каким способом происходит? Если например все абоненты пользуются авторизатором, тогда можно в скрипт ОнКоннект добавить проверку - Если текущий трафик меньше 5 Гб, тогда проводить подключение, иначе выдать сообщение в авторизатор - Вы превысили лимит трафика. А, читать трафик можно из файла stat, если у вас БД на файлах. Если же например у вас реализовано через СУБД - тогда читать из базы этот параметр. Ну и еще следить за трафиком, когда юзер в это время онлайн и он превысил лимит - пока такого ничего в голову не приходит, может еще товарищ madf посоветует. Ссылка на сообщение Поделиться на других сайтах
nightfly 1 241 Опубліковано: 2010-06-29 21:30:09 Share Опубліковано: 2010-06-29 21:30:09 Хз, я для такого просто при достижении конкретного порога в Х% от номинала тарифа засовываю пользователей в отдельную табличку (что там будет - динай или хитрый пайп уже не суть важно). Ровно три с половиной квериза. А вобще писанины включая дебаг и вылизывание с распитием спиртных напитков - там на час. Всего-то складировать куда-надо кроном SELECT `ip` from `users` WHERE `tariff`='xxxxx' AND `D0`+`U0`>yyyy Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 06:27:42 Share Опубліковано: 2010-06-30 06:27:42 Вроде ничего не придумывается кроме как по крону опрашивать список на предмет отсутствия FreeMB и делать им disable. Ну еще можно подпатчить метод IsInetable в файле user.cpp чтобы он срабатывал по этому признаку. Ссылка на сообщение Поделиться на других сайтах
Небесный 26 Опубліковано: 2010-06-30 07:44:45 Share Опубліковано: 2010-06-30 07:44:45 Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб. Ссылка на сообщение Поделиться на других сайтах
lalex 0 Опубліковано: 2010-06-30 09:49:33 Автор Share Опубліковано: 2010-06-30 09:49:33 Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб. возникла мысль find-ом лазить в файл stat пользователя (БД - файловая). при достижении величины больше тарифного плана, то отключать пользователя. но как поступать, когда несколько тарифных планов с разной "абонплатой/объём трафика"? ЗЫ: я так понимаю ни у кого такой задачи не стояло. т.е. все (или большинство) просто продают трафик помегабайтно. у нас просто схема предоплаты 1го числа за определенный объём, а сверх лимита очень быстро деньги убегают. Ссылка на сообщение Поделиться на других сайтах
nightfly 1 241 Опубліковано: 2010-06-30 10:14:02 Share Опубліковано: 2010-06-30 10:14:02 Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб. При методе коллекции нетфловом сессии тоже не все одновременно експайрятся и пишутся в базу. Если стартовать скрипт скажем сразу после StatWritePeriod = 10 то при скорости 1 мбит у пользователя может набежать аж 76 мег. Быстрее чем StatWritePeriod всеравно не будет поскольку банально неоткуда будет брать изменение трафика за период. . т.е. все (или большинство) просто продают трафик помегабайтно нет, все давно продают анлимы а сверх лимита очень быстро деньги убегают. а кто у вас на кого работает? Ну выставьте цену послепороговую в 0 если так о неконтролирующих себя пользователях печетесь и отламываейте их скриптом как указано выше сразу после StatWrite героически жертвуя своими 76 мб Конечно можно писать детальную стату и раз в минуту но это бред. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 10:15:24 Share Опубліковано: 2010-06-30 10:15:24 Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб. возникла мысль find-ом лазить в файл stat пользователя (БД - файловая). при достижении величины больше тарифного плана, то отключать пользователя. но как поступать, когда несколько тарифных планов с разной "абонплатой/объём трафика"? ЗЫ: я так понимаю ни у кого такой задачи не стояло. т.е. все (или большинство) просто продают трафик помегабайтно. у нас просто схема предоплаты 1го числа за определенный объём, а сверх лимита очень быстро деньги убегают. Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение. Ссылка на сообщение Поделиться на других сайтах
nightfly 1 241 Опубліковано: 2010-06-30 11:31:13 Share Опубліковано: 2010-06-30 11:31:13 Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение. а, кстати да - что-то ступил А у анлимов часом не всегда 0? Ну тогда <0, да? Ну тобишь так SELECT `ip` from `users` WHERE `FreeMb`<0 ? Ссылка на сообщение Поделиться на других сайтах
Небесный 26 Опубліковано: 2010-06-30 12:13:41 Share Опубліковано: 2010-06-30 12:13:41 Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение. Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные. Но, вот как для красоты сделать, чтобы четко рубало при достижении порога. madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется? Идея - но для этого нужно реализовывать отдельный процесс, которые будет всегда следить за трафиком - и этот же процесс будет рубать пользователя. Ссылка на сообщение Поделиться на других сайтах
nightfly 1 241 Опубліковано: 2010-06-30 12:43:18 Share Опубліковано: 2010-06-30 12:43:18 Но, вот как для красоты сделать, чтобы четко рубало при достижении порога. можно, в чем проблема? только что-то мне подсказывает что вы зае....сь реалтайм траффик мониторить Ссылка на сообщение Поделиться на других сайтах
lalex 0 Опубліковано: 2010-06-30 12:45:20 Автор Share Опубліковано: 2010-06-30 12:45:20 Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные. Но, вот как для красоты сделать, чтобы четко рубало при достижении порога. madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется? действительно ли этот StatWritePeriod параметр отвечает за периодичность записи в файл stat? и как будет вести себя СТГ при 500 пользователях постоянно записывая эту информацию? Ссылка на сообщение Поделиться на других сайтах
nightfly 1 241 Опубліковано: 2010-06-30 13:20:42 Share Опубліковано: 2010-06-30 13:20:42 действительно ли этот StatWritePeriod параметр отвечает за периодичность записи в файл stat? [sarcasm]нет блин, он чисто по приколу рассматривает этот параметр[/sarcasm] и как будет вести себя СТГ при 500 пользователях постоянно записывая эту информацию? точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 14:02:38 Share Опубліковано: 2010-06-30 14:02:38 Для реалтайма надо установить нотификатор на изменения property.freeMb и при переходе через 0 выполнять действия. Но это значительное вмешательство в код. И да, он действительно пишет в соответстсвии со StatWritePeriod. И на 500 нормально, и на 6000 нормально. В т.ч. нормально на файловой базе и на PostgreSQL. По MySQL у меня данных нет, но думаю что и там нормально. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 14:04:55 Share Опубліковано: 2010-06-30 14:04:55 Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение. Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные. Но, вот как для красоты сделать, чтобы четко рубало при достижении порога. madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется? Идея - но для этого нужно реализовывать отдельный процесс, которые будет всегда следить за трафиком - и этот же процесс будет рубать пользователя. Держит в памяти и не обнуляет при записи. Обнуляет в момент перехода через полночь или при отключении авторизатора. И то - только за сессию. Месачный обнуляется при переходе через месяц. Зачем отдельный? Stargazer и так следит за трафиком. Ссылка на сообщение Поделиться на других сайтах
Небесный 26 Опубліковано: 2010-06-30 14:09:07 Share Опубліковано: 2010-06-30 14:09:07 точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить? Ну, это конечно гон уже писать раз в минуту стату. madf, не могли бы вы немного рассказать как СТЖ держит в памяти данные о трафике, и как можно было бы эти данные вытянуть - чисто для личного развития. Ссылка на сообщение Поделиться на других сайтах
nightfly 1 241 Опубліковано: 2010-06-30 14:27:05 Share Опубліковано: 2010-06-30 14:27:05 Ну, это конечно гон уже писать раз в минуту стату. извините, тег sarcasm закрыл не там где надо и как можно было бы эти данные вытянуть - чисто для личного развития. подозреваю что увидеть их можно только при помощи sgconfxml либо нативным конфигуратором. Есть чувствие что --d0 берет данные не из базы, хотя нада сорц посмотреть. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 14:37:59 Share Опубліковано: 2010-06-30 14:37:59 точно так же как и при любом другом количестве - будет молотить 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 - максимальное количество направлений тарификации в системе. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 14:39:54 Share Опубліковано: 2010-06-30 14:39:54 и как можно было бы эти данные вытянуть - чисто для личного развития. подозреваю что увидеть их можно только при помощи sgconfxml либо нативным конфигуратором. Есть чувствие что --d0 берет данные не из базы, хотя нада сорц посмотреть. Не из базы. Из памяти. Это ж данные за сессию, а не месячные. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2010-06-30 14:42:12 Share Опубліковано: 2010-06-30 14:42:12 Можно тупо написать плагин в котором поставить нотификаторы на изменение freeMb и отключать/включать юзера. К стати очень простой плагин, даже без внутреннего потока. Буквально 2-3 функции. И будет вам реалтаймовость и все такое. Ссылка на сообщение Поделиться на других сайтах
Небесный 26 Опубліковано: 2010-06-30 14:59:08 Share Опубліковано: 2010-06-30 14:59:08 А, вообще можно по-интересоваться у автора темы, для чего такое делать. Все известные мне провайдеры, самопальные локалки и т.д. пытаются заработать как можно больше денег, и того как бы продать по-больше трафика = больше продал - больше заработал. Почему не давать юзеру, чтобы он дальше пользовался инэтом, пусть просто платит больше денег - и того больше прибыль. ЗЫ: madf, благодарю за лекцию. Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас