Hello Jon,

you probably investigated and decided against it, but there are other, more 
easy ways of tracking call volume (concurrent calls) over destinations.
There is the dialog module with the named profile support, and also the dlgs 
module offering a more lightweight approach. These two would be my approach to 
implement something like this.

Cheers,

Henning

> -----Original Message-----
> From: Jon Bonilla (Manwe) via sr-users <[email protected]>
> Sent: Montag, 15. Dezember 2025 19:27
> To: [email protected]
> Cc: Jon Bonilla (Manwe) <[email protected]>
> Subject: [SR-Users] Re: High volume ratelimit CPS
> 
> El Mon, 8 Dec 2025 22:38:48 +0100
> "Jon Bonilla (Manwe) via sr-users" <[email protected]> escribió:
> 
> > El Mon, 8 Dec 2025 19:49:58 +0000
> > Ben Kaufman <[email protected]> escribió:
> >
> > > I don't see how it could fail to be "fast enough", since $shtinc() is
> > > atomic. In other words if you were running 600 children (theoretically,
> > > please don't actually set children to 600), the operation $var(cps) =
> > > $shtinc(caps=>$var(cps)) will only happen one at a time, all other
> > > processes will wait until it is free before they can change it.
> > >
> 
> > I really don't know. I remember adding a log because the destination was
> > complaining and the cps being sent was higher than the limit before the
> > rejections hit.
> >
> > I need to set a new box for another destination. I'll try to implement the
> > same solution and reproduce it.
> >
> 
> 
> Hi again
> 
> I'm testing this setup using htable and seems promising.
> 
> 
> I'm using 60 children (not 600 xD). I have around 15 gateways with a max of
> 54
> CAPS each. I'm setting a counter for each destination and second. If I'm above
> threshold for that destination I select next destination in dispatcher 
> (limit4).
> 
> modparam("htable",
> "htable","caps=>size=11;initval=0;autoexpire=5;updateexpire=0;")
> modparam("htable","timer_interval", 5)
> modparam("htable", "timer_procs", 4)
> 
> route[RATELIMIT]
> {
> $var(cps_allow) = 0;
> while($var(cps_allow) == 0) {
>   $var(cps) = $rd + ":" + $timef(%S);
>   $var(cps) = $shtinc(caps=>$var(cps));
>   if ($var(cps) > CAPSLIMIT) {
>     $var(cps_allow)=0;
>     if (!ds_next_domain()) {
>       send_reply("500","No destinations available");
>       exit;
>     }
>   } else {
>      $var(cps_allow)=1;
>   }
> }
> 
> And in failover route I also call route ratelimit:
> 
> if (t_check_status("408|500|501|502|503")) {
> xlog("L_NOTICE", "Failover route for status $T_reply_code\n");
> if (!ds_next_domain()) {
>   xlog("L_NOTICE", "No more destinations available\n");
>   send_reply("500", "No destinations available");
>   exit;
> }
> route(RATELIMIT);
> t_set_fr(180000, OUTBOUNDTIMEOUT);
> t_on_failure("FAILURE_OUTBOUND_MAIN");
> route(RELAY);
> 
> 
> 
> I see in the logs everything working fin except that some counters seem to be
> offset when I'm dealing with failover. For example:
> 
> 12:53:15.7774 New call - M=INVITE
> 
> 12:53:15.7776 Destination A cps is 39 below limit 54. ACCEPT
> 
> 12:53:15.8658 Failover route for status 503
> 
> 12:53:15.8659 Destination B cps is 43 below limit 54. ACCEPT
> 
> 12:53:16.0191 Failover route for status 503
> 
> 12:53:16.0193 Destination C cps is 54 below limit 54. ACCEPT
> 
> 12:53:16.1500 Failover route for status 503
> 
> 12:53:16.1501 Destination D cps is 49 below limit 54. ACCEPT
> 
> 12:53:16.4523 Failover route for status 503
> 
> 12:53:16.4524 No more destinations available
> 
> 
> The problem there is that when failover to destination C and D seems like it's
> taking the counter of the previous second but the second already changed
> from
> 15 to 16. Seems like $timef(%S) is not updating each time I execute
> route(RATELIMIT)
> With this scenario I can go above 54 cps.
> 
> Any ideas?
> 
> 
> cheers,
> 
> Jon
> 
> 
> 
> 
> 
> --
> PekePBX, the multitenant PBX solution
> https://pekepbx.com
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions -- 
[email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to