freeswitch使用hiredis的limit功能
概述
freeswitch是一款简单好用的VOIP开源软交换平台。
之前写过一篇关于limit的文章“freeswwitch通过limit限制cps”,主要是介绍了limit的hash后端模式限制cps。
本文档主要介绍limit的hiredis后端模式。
hash后端模式和hiredis的后端模式,二者的功能是一致的,主要区别在于hash更快,hiredis更持久更容易集群化。
环境
CentOS 7.9
freeswitch 1.10.7
模块支持
要使用limit的hiredis模式,首先要启动mod_hiredis模块。
编译安装mod_hiredis模块需要先安装hiredis依赖库。
git clone https://github.com/redis/hiredis.git
cd hiredis
make
make install
cp -f /usr/local/lib/libhiredis.so /usr/lib64/libhiredis.so
cp -f /usr/local/lib/pkgconfig/hiredis.pc /usr/lib64/pkgconfig/hiredis.pc
在freeswitch源码根目录下执行配置命令,重新生成mod_hiredis目录下的makefile。
cd freeswitch-1.10.7
./bootstrap.sh -j
./configure
cd src/mod/applications/mod_hiredis/
make
make install
查看/usr/local/freeswitch/mod目录下的mod_hiredis模块。
-rwxr-xr-x. 1 root root 111184 Apr 11 09:37 mod_hiredis.so
-rwxr-xr-x. 1 root root 1320 Apr 11 09:37 mod_hiredis.la
配置
配置modules.conf.xml文件。
<load module="mod_hiredis"/>
配置hiredis.conf.xml文件。
<configuration name="hiredis.conf" description="mod_hiredis">
<profiles>
<profile name="default">
<connections>
<connection name="primary">
<param name="hostname" value="10.55.55.136"/>
<param name="port" value="7777"/>
<param name="timeout_ms" value="500"/>
</connection>
</connections>
<params>
<param name="ignore-connect-fail" value="true"/>
</params>
</profile>
</profiles>
</configuration>
启动fs,查看mod_hiredis模块正常启动。
配置dialplan,增加limit。
<action application="limit" data="hiredis default CAP:all 8192 !EXCHANGE_ROUTING_ERROR" />
<action application="limit" data="hiredis default CAP:SIPP:${appid}:${sippNum} 8192 !EXCHANGE_ROUTING_ERROR"/>
测试
fs命令测试。
freeswitch@as137> limit_usage hiredis default test1
2025-04-22 17:38:51.159794 [DEBUG] hiredis_profile.c:61 hiredis: waiting for [10.55.55.136, 7777]
2025-04-22 17:38:51.159794 [INFO] hiredis_profile.c:86 hiredis: recycled from pool[10.55.55.136, 7777]
2025-04-22 17:38:51.159794 [DEBUG] hiredis_profile.c:206 hiredis: get test1
1
2025-04-22 17:38:51.159794 [DEBUG] hiredis_profile.c:52 hiredis: release back to pool [10.55.55.136, 7777]
发起呼叫测试。
EXECUTE sofia/external/10011@10.55.55.138 limit(hiredis default CAP:all 8192 !EXCHANGE_ROUTING_ERROR)
2025-04-22 17:47:54.879729 [DEBUG] switch_limit.c:126 incr called: default_CAP:all max:8192, interval:0
2025-04-22 17:47:54.879729 [DEBUG] hiredis_profile.c:61 hiredis: waiting for [10.55.55.136, 7777]
2025-04-22 17:47:54.879729 [INFO] hiredis_profile.c:86 hiredis: recycled from pool[10.55.55.136, 7777]
2025-04-22 17:47:54.879729 [DEBUG] hiredis_profile.c:206 hiredis: incr CAP:all
2025-04-22 17:47:54.879729 [DEBUG] hiredis_profile.c:52 hiredis: release back to pool [10.55.55.136, 7777]
EXECUTE sofia/external/10011@10.55.55.138 limit(hiredis default CAP:SIPP:e5c60abcefd840be8dff4f9a94cb46ec:10011 8192 !EXCHANGE_ROUTING_ERROR)
2025-04-22 17:47:54.879729 [DEBUG] switch_limit.c:126 incr called: default_CAP:SIPP:e5c60abcefd840be8dff4f9a94cb46ec:10011 max:8192, interval:0
2025-04-22 17:47:54.879729 [DEBUG] hiredis_profile.c:61 hiredis: waiting for [10.55.55.136, 7777]
2025-04-22 17:47:54.879729 [INFO] hiredis_profile.c:86 hiredis: recycled from pool[10.55.55.136, 7777]
2025-04-22 17:47:54.879729 [DEBUG] hiredis_profile.c:206 hiredis: incr CAP:SIPP:e5c60abcefd840be8dff4f9a94cb46ec:10011
2025-04-22 17:47:54.879729 [DEBUG] hiredis_profile.c:52 hiredis: release back to pool [10.55.55.136, 7777]
2025-04-22 17:48:04.819741 [DEBUG] hiredis_profile.c:61 hiredis: waiting for [10.55.55.136, 7777]
2025-04-22 17:48:04.819741 [INFO] hiredis_profile.c:86 hiredis: recycled from pool[10.55.55.136, 7777]
2025-04-22 17:48:04.819741 [DEBUG] hiredis_profile.c:206 hiredis: decr CAP:SIPP:e5c60abcefd840be8dff4f9a94cb46ec:10011
2025-04-22 17:48:04.819741 [DEBUG] hiredis_profile.c:52 hiredis: release back to pool [10.55.55.136, 7777]
2025-04-22 17:48:04.819741 [DEBUG] hiredis_profile.c:61 hiredis: waiting for [10.55.55.136, 7777]
2025-04-22 17:48:04.819741 [INFO] hiredis_profile.c:86 hiredis: recycled from pool[10.55.55.136, 7777]
2025-04-22 17:48:04.819741 [DEBUG] hiredis_profile.c:206 hiredis: decr CAP:all
2025-04-22 17:48:04.819741 [DEBUG] hiredis_profile.c:52 hiredis: release back to pool [10.55.55.136, 7777]
总结
limit的hiredis模式受限于hiredis只能连接单体redis,但是最近测试了redis代理(predixy)可以直接转发到redis cluster。大大扩展了hiredis的能力边界。
性能和稳定性需要进一步的压测。
空空如常
求真得真