Ao se trabalhar em ambientes com grandes volumes de chamadas, como call centers e operadoras VoIP por exemplo, a quantidade de chamadas simultâneas enviadas para determinados gateways acaba atingindo valores verdadeiramente altos durante a produção.
Esta situação pode vir a ser um problema quando se utilizam gateways que possuem recursos limitados, como baixo poder de processamento ou memória, fazendo com que estes equipamentos venham a travar ao receber este grande volume de requisições.
Para evitar este tipo de problema, é necessário acrescentar algum mecanismo de controle de entrega de chamadas para os gateways, fazendo com que o volume de chamadas não ultrapasse o limite do gateway.
O FreeSWITCH possui este recurso nativamente, uma aplicação chamada limit, portanto não é necessário nenhuma lógica mirabolante no plano de discagens ou algum desenvolvimento externo.
Neste exemplo, vamos assumir que o FreeSWITCH está sendo utilizando “no meio” da comunicação entre seu softswitch (ou discador, PABX, etc) e seus gateways. Considerando que seu gateway possui somente um E1, ou seja, 30 canais de voz, a configuração que limita a quantidade de chamadas para este gateway em 30 é a seguinte:
<extension name=”Saida_E1″>
<condition field=”destination_number” expression=”^.*$”>
<action application=”limit” data=”hash outbound E1_1 30″/>
<action application=”bridge” data=”sofia/gateway/E1_1/${destination_number}”/>
</condition>
</extension>
<extension name=”limit_exceeded”>
<condition field=”destination_number” expression=”^limit_exceeded$”>
<action application=”hangup” data=”SWITCH_CONGESTION” />
</condition>
</extension>
Observando o XML de configuração do plano de discagens, podemos perceber a chamada da aplicação limit antes de encaminhar a chamada para o gateway de nome E1_1. Os atributos da aplicação limit são:
limit <backend> <realm> <resource> <max[/interval]> [<transfer_destination_number> [<dialplan> [<context>]]
Onde:
– backend é o mecanismo de controle de chamadas do FreeSWITCH, existe a opção db e hash (utilizada no exemplo);
– realm é uma nomenclatura de controle, este valor é arbitrário, ou seja, você escolhe o nome;
– resource é o nome do gateway em questão;
– max[/interval] é a quantidade de canais em que se quer limitar o gateway
Os últimos campos não são obrigatórios, mas neles é especificado para onde você quer mandar a chamada caso ultrapasse o limite do gateway. Caso nada seja configurado, a chamada será envaida para limit_exceeded no mesmo contexto e plano de discagens.
Deste modo, podemos obervar que, ao estourar os 30 canais disponíveis para o gateway, uma mensagem de erro será enviada para o originador das chamadas. No exemplo em questão está sendo enviado SWITCH_CONGESTION, que em SIP é traduzido para 503 Service Unavailable.
Caso o FreeSWITCH seja o responsável pelo roteamento das chamadas, ou seja, não esteja como somente um controlador de fluxo de chamadas, existe a possibilidade de utilizar a aplicação limit_execute, que executa determinada ação caso o limite não tenha sido atingido.
<action application=”limit_execute” data=”<backend> <realm> <resource> <max[/interval]> <application> [application arguments]
” />
Onde:
– backend é o mecanismo de controle de chamadas do FreeSWITCH, existe a opção db e hash (utilizada no exemplo);
– realm é uma nomenclatura de controle, este valor é arbitrário, ou seja, você escolhe o nome;
– resource é o nome do gateway em questão;
– max[/interval] é a quantidade de canais em que se quer limitar o gateway
– application é a aplicação que será chamada, bridge, por exemplo.
– [application arguments] são os argumentos da aplicação: sofia/gateway/E1_1/${destination_number}
Nesta opção, caso o numero de canais disponíveis para o gateway seja atingido, a próxima linha do plano de discagens será executada. Nesta próxima linha, você pode adicionar uma outra aplicação limit_execute para controlar o tráfego do seu segundo gateway.
Vale ressaltar que as aplicações limit e limit_execute fazem parte do módulo mod_dptools, caso este módulo não esteja carregado em seu sistema, basta executar o comando ‘load mod_dptools’ na CLI do FreeSWITCH.
Lembramos que também é possível fazer este tipo de controle através do Asterisk, que é um software mais popular e mais fácil de configurar que o FreeSWITCH, mas isto é assunto para um próximo artigo.