背景
ratelimit
模块用来限制sip请求, 并不是按照源ip来限制,可以根据不同的分组设置,和pike
不同.
该模块可以和Redis
或者memcache
结合, 可以实现集群opensips
的统一限制。
另外也可以使用clusterer
分布式模块,使用pipe_replication_cluster
参数,把pipes
复制到其他的实例上。
如果要使用CacheDB
发送,就在pipes
后加/r
, 如果要用clusterer
,就在pipes
后加/b
。
支持的算法有:
(Tail Drop Algorithm)TAILDROP
: 请求达到限制后,后面的请求丢弃(Random Early Detection Algorithm)RED
: 随机早期检测算法,测量平均负载并动态调整丢包率(Slot Based Taildropping)SBT
: 持有一个或多个slot组成的窗口.NETWORK
: 依赖网口上等待消耗的字节数FEEDBACK
: 使用PID控制模型, 根据负载因子动态调整下降率.
官方文档地址:ratelimit
本次测试的opensips版本:
version: opensips 3.5.5 (x86_64/linux)
配置参数
|
|
重要函数
rl_check(name, limit[, algorithm])
当前请求和pipe name
的算法比较限制数, 如果pipe没有,会根据限制数和算法创建新的,如果算法也没有,使用默认的。
rl_dec_count(name)
减少pipe name
当前的计数
rl_reset_count(name)
重置pipe name
的当前计数
实战
配置
|
|
为了测试出效果, pipe
名字为: gw_$si
, 以源ip来测试。
测试
设置的是3个请求/5s, 当并发请求10个/5s,看到的信令图:
可以看到,当达到第6个请求之后,第7个请求就被拒绝了, 之后当计数减少之后,后续还是能再次请求成功。
测试过程中使用opensips-cli -x mi rl_list
查看:
|
|
请求拒绝的信令:
总结
opensips
的ratelimit
功能比kamailio
的ratelimit
强大,opensips
可以使用clusterer
模块或者cacheDB
实现集群的ratelimit
,kamailio
不可以。