概述

freeswitch在业务开发中有极大的便利性,因为fs内部实现了很多小功能,这些小功能组合在一起,通过拨号计划就可以实现很多常见的业务功能。

在voip云平台的开发中,我们经常会碰到资源的限制,有外部线路资源方面的,也有voip平台内部资源方面。

根据资源的实际情况,对呼叫做限制,包括cps(每秒呼叫数,call per second)和capacity(呼叫容量),使用fs自带的limit接口,可以很方便的实现需求。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.8.7

GCC:4.8.5

接口limit

freeswitch的mod_dptools模块中提供app接口“limit“。

limit <backend> <realm> <resource> <max[/interval]> [<transfer_destination_number> [<dialplan> [<context>]]

<backend>分三类,db,hash,hiredis。db依赖mod_db模块,hash依赖mod_hash模块,hiredis依赖mod_hiredis模块。

在fs官网文档三种backend的优缺点比较,从速度、持久化、集群能力和时间间隔支持四个维度的比较结果。

<realm>和<resource>,两个参数可以随意命名,最好的命名是简单直观,方便区分限制规则。

<max[/interval]>,有俩种格式,<max>表示限制并发容量,<max/interval>表示限制一定时间内的最大呼叫发起量。backend的db模式不支持interval。

transfer dialplan的方式,适用于多个dialplan规则之间的跳转,用的好的情况下会非常灵活方便。

限制cps示例

需求1,限制任意ip进入的cps(每秒呼叫数)为300每秒。

<action application="limit" data="hash inbound ${network_addr} 300/1 !EXCHANGE_ROUTING_ERROR"/>

需求2,限制任意ip一天的呼入数量为100通。

<action application="limit" data="hash inbound ${network_addr} 100/86400 !EXCHANGE_ROUTING_ERROR"/>

需求3,限制指定ip的cps为100每秒。

<condition field="${network_addr}" expression="^1.2.3.4$" break="never">

<action application="limit" data="hash inbound 1.2.3.4 100/1 !EXCHANGE_ROUTING_ERROR"/>

</condition>

需求4,限制呼出的线路资源的cps为20每秒

<action application="limit" data="hash outbound 5.6.7.8 20/1 !EXCHANGE_ROUTING_ERROR"/>

限制capacity示例

需求5,限制全平台capacity并发容量为5000通。

<action application="limit" data="hash inbound capacity 5000 !EXCHANGE_ROUTING_ERROR"/>

需求6,限制指定ip呼入的capacity并发容量为1000通。

<condition field="${network_addr}" expression="^1.2.3.4$" break="never">

<action application="limit" data="hash inbound 1.2.3.4 1000 !EXCHANGE_ROUTING_ERROR"/>

</condition>

需求7,限制呼出的线路资源的capacity并发容量为500通。

<action application="limit" data="hash outbound 5.6.7.8 500 !EXCHANGE_ROUTING_ERROR"/>

限制呼入呼出综合示例

如果我们需要对整个VOIP平台的做呼叫限制,包括cps和capacity,比较通用的做法。

<extension name="limit_dp" continue="true">

<condition field="caller_id_number" expression="^\d+$" break="never">

    <action application="limit" data="hash incps ${network_addr} 200/1 !EXCHANGE_ROUTING_ERROR"/>

<action application="limit" data="hash incps all 300/1 !EXCHANGE_ROUTING_ERROR"/>

<action application="limit" data="hash incapacity all 5000 !EXCHANGE_ROUTING_ERROR"/>

</condition>

</extension>

根据"limit_dp"的设置,限制规则如下。

incps_${network_addr},限制单个ip呼入的cps为200每秒。

incps_all,限制呼入总cps为300每秒。

incapacity_all,限制呼叫总容量为5000通。

总结

limit接口很灵活,可以根据具体场景设置不同的限制规则和多重规则。

在backend的选择上,大多数场景使用hash是最快最合适的,有数据持久化需求的场景才考虑hiredis,不建议使用db。

在有设置limit的freeswitch进程中,可以通过如下的命令查看当前的实时capacity容量。

./fs_cli -x 'limit_usage hash incapacity all'

1101

空空如常

求真得真

freeswitch通过limit限制cps的更多相关文章

  1. freeswitch呼叫流程分析

    今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...

  2. FreeSwitch 终端命令详细介绍

    FreeSwitch版本:1.6.9 以下为部分终端命令 alias 语法: alias [add|stickyadd] <alias> <command> | del [&l ...

  3. FreeSWITCH 总体架构

    [1]总体结构 [2]代码结构目录 [3]模块简介 Applications应用 mod_abstraction – 提供了一个抽象的API调用(未来有更多功能)Provides an abstrac ...

  4. freeswitch APR-UTIL库线程池实现分析

    概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. APR库在之前的文章中已经介绍过了,APR-UTIL库是和APR并列的工具库,它们都是由APACHE开源出来 ...

  5. 生成freeswitch事件的几种方式

    本文描述了生成freeswitch事件的几种方式,这里记录下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 在freeswitch代码中加入事件 ...

  6. freeswitch模块之event_socket

    这是我之前整理的关于freeswitch mod_event_socket的相关内容,这里记录下,也方便我以后查阅. mod_event_socket以socket的形式,对外提供控制FS一种途径, ...

  7. freeswitch对接其它SIP设备

    这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...

  8. freeswitch注册过程分析

    操作系统:debian8.5_x64freeswitch 版本 : 1.6.8 本文仅描述sip注册的简单场景,即话机直接向处于同一个局域网的fs进行注册. SIP协议的消息结构 消息框架 SIP协议 ...

  9. freeswitch嵌入python脚本

    操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 python版本:2.7.9 开启python模块 安装python lib库 apt-get install pyt ...

  10. mysql limit分页查询优化写法

    在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序.但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条 ...

随机推荐

  1. 使用动画曲线编辑器打造炫酷的3D可视化ACE

    前言 在制作3D可视化看板时,除了精细的模型结构外,炫酷的动画效果也是必不可少的.无论是复杂的还是简单的动画效果,要实现100%的自然平滑都是具有挑战性的工作.这涉及到物理引擎的计算和对动画效果的数学 ...

  2. Vue重用组件

    1.是什么? 这里主要是简单入门使用一下,复杂高阶的用法笔者暂时还没了解到 Vue重用组件是指可以被多个Vue实例重复使用的组件.这些组件可以包含自定义的状态和事件处理程序,并且可以在整个应用程序中共 ...

  3. Gradle构建微服务项目

    先说一下初衷把:为啥突然要用Gradle,公司后期自研项目都使用Gradle构建...... 1.下载安装 这个就不说了,网上大家搜索一下,配置一下环境变量即可 2.Groovy的一些语法Gradle ...

  4. NC65二开经验总结

    公式相关 1.显示公式没执行 列表界面显示,卡片界面不显示: Handler的onBoCard执行: getBillCardPanel().execHeadLoadFormulas(); Contro ...

  5. 【玩转腾讯混元大模型】怎么说?我用混元AI大模型开发了个IDEA插件

    前言 halo 我是杨不易呀,在混元大模型内测阶段就已经体验了一番当时打开页面的时候灵感模块让我大吃一惊这么多角色模型真的太屌了,随后我立马进行了代码处理水平和上下文的效果结果一般般但是到如今混元大模 ...

  6. MySQL|主从延迟问题排查(一)

    一.案例分享 1.1 问题描述 大查询长时间执行无法释放DML读锁,后续同步主库的DDL操作获取DML写锁资源被阻塞等待,导致后续同步主库的操作堆积,主从延迟增长严重.从同步延迟的监控来看,延迟从17 ...

  7. P5179 Fraction 题解

    题目描述 给你四个正整数 \(a,\,b,\,c,\,d\) ,求一个最简分数 \(\frac{p}{q}\) 满足 \(\frac{a}{b} < \frac{p}{q} < \frac ...

  8. mx master 的国产平替 keychron m6 使用体验

    背景 之前在 Mac 系统用mx master3遇到的问题 这篇文章中提到过三点问题,前两点在更换了驱动软件,升级了 macOS 系统之后都解决了,但第三点自动休眠的问题一直无法解决,于是一直想找一个 ...

  9. rasa train nlu详解:1.2-_train_graph()函数

      本文使用<使用ResponseSelector实现校园招聘FAQ机器人>中的例子,主要详解介绍_train_graph()函数中变量的具体值. 一.rasa/model_trainin ...

  10. rasa train nlu详解:1.1-train_nlu()函数

      本文使用<使用ResponseSelector实现校园招聘FAQ机器人>中的例子,主要详解介绍train_nlu()函数中变量的具体值. 一.rasa/model_training.p ...