Thanks for the feedback -- Here is my updated version.
modparam("htable", "htable", "htable_source_group_rates_sec=>size=8;dbtable=htable_source_group_rates_sec;initval=0;autoexpire=300;") modparam("htable", "htable", "htable_source_group_rates_min=>size=8;dbtable=htable_source_group_rates_min;initval=0;autoexpire=1800;") modparam("htable", "htable", "htable_source_group_limits=>size=8;dbtable=htable_source_group_limits;initval=500;")
route[SOURCE_GROUP_LIMIT] {
if (is_method("INVITE")){ $var(rateHashSec) = (str)$var(srcgroup)+":sec:"+$timef(%Y/%m/%d_%H_%M_%S); $var(rateHashMin) = (str)$var(srcgroup)+":min:"+$timef(%Y/%m/%d_%H_%M_00); $var(ratePerSec) = $shtinc(htable_source_group_rates_sec=>$var(rateHashSec)); $var(ratePerMin) = $shtinc(htable_source_group_rates_min=>$var(rateHashMin)); $var(limitPerSec) = $sht(htable_source_group_limits=>$var(srcgroup)); if($var(ratePerSec) > $var(limitPerSec)) { sl_send_reply("503", "$si over source Limit of $var(ratePerSec)) / $var(limitPerSec)"); exit; } } }
On 12 September 2013 21:31, Daniel-Constantin Mierla miconda@gmail.comwrote:
Hello,
nice approach and glad to see I could throw some seeds for new ideas out there!
You should use $shtinc(...), like:
$var(rps) = $shtinc(htable_source_group_rates=>$var(rateHashSec)); $var(rpm) = $shtinc(htable_source_group_rates=>$var(rateHashMin));
In this way you avoid races on increment operation done with '+'. Alternatives would be to use locks via cfgutils module.
Then you can use $var(...) for test if you want to allow the requests that came below the limit, or the current value with $sht(...) to block if there were other requests coming meanwhile (after the increment).
Cheers, Daniel
On 9/12/13 9:21 PM, Gareth Rylance wrote:
I was inspired by Daniels ClueCon 2013 talk and have decide to try to add simple rate limiting using a HTable. $var(srcgroup) is an id that identifies the invites source/ I wish to limit invites from a given source.
$var(rateHashMin) was added just to allow simple monitoring. I query the table via XML-RPC to get an idea of current load. I think it would be better to add it to a seperate table and then I could increase the exprires time to capture more of the course grain points.
I am interested in any comments.
modparam("htable", "htable", "htable_source_group_rates=>size=8;dbtable=htable_source_group_rates;initval=0;autoexpire=300;") modparam("htable", "htable", "htable_source_group_limits=>size=8;dbtable=htable_source_group_limits;initval=500;")
route[SOURCE_GROUP_LIMIT] {
if (is_method("INVITE")){ $var(rateHashSec) = (str)$var(srcgroup)+":sec:"+$timef(%Y/%m/%d_%H_%M_%S); $var(rateHashMin) = (str)$var(srcgroup)+":min:"+$timef(%Y/%m/%d_%H_%M_00); $sht(htable_source_group_rates=>$var(rateHashSec)) = $sht(htable_source_group_rates=>$var(rateHashSec)) + 1; $sht(htable_source_group_rates=>$var(rateHashMin)) = $sht(htable_source_group_rates=>$var(rateHashMin)) + 1; if($sht(htable_source_group_rates=>$var(rateHashSec)) > $sht(htable_source_group_limits=>$var(srcgroup))) { sl_send_reply("503", "$si over source Limit of $sht(htable_source_group_rates=>$var(rateHashSec)) / $sht(htable_source_group_limits=>$var(srcgroup)"); exit; } } }
Thanks Gareth
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing listsr-users@lists.sip-router.orghttp://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
-- Daniel-Constantin Mierla - http://www.asipto.comhttp://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda Kamailio Advanced Trainings - Berlin, Oct 21-24; Miami, Nov 11-13, 2013
- more details about Kamailio trainings at http://www.asipto.com -
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users