Область применения FATS
FATS - это набор протоколов и модулей, позволяющих быстро разрабатывать асинхронные приложения-сервисы для управления и обработки входящих звонков программы IP-PBX Asterisk(АТС Астериск, Астер, *).
Все что выходит за рамки протоколов и модулей - называется приложениями-сервисами на базе FATS.
За основу для работы FATS был взят каркас Twisted, который позволяет создавать асинхронные приложения на языке программирования Python и предоставляет множество готовых библиотек для работы с протоколами TCP\IP, UDP, UNIX Socket, SSL, HTTP, Telnet, XMMP, SSH и т.д., а также для работы с различными базами данных на основе стандарта ADBAPI 2.0.
Twisted использует идеологию TDD разработки, поэтому у него существуют встроенные механизмы для работы с тестами(trial), документацией(apidoc), шаблонами проектирования(pattern), - это значительно облегчает разработку при владении инструментарием и помогает им овладеть в момент обучения.
Нас интересуют протоколы FastAGI и AMI:FastAGI - AGI протокол, который работает по протоколу TCP, а не при помощи стандартных потоков ввода\вывода. Это позволяет перенести процесс обработки звонка на другой компьютер, снизив нагругру на ЦПУ сервера Астериск.
AGI - протокол для управления и обработки входящего звонка в АТС Астериск. В плане дозвона(dialplan) мы используем ряд команд, для обработки звонка, аналоги этих команд мы можем применять в отдельно исполняемом приложении, которое будет общаться с Астериском используя потоки ввода\вывода.
Нам нужен AGI когда:
- Сложная логика приложения - план дозвона становится большим и очень неудобен для модификации. Можно использовать макросы, но они лишь отсрочат гибель продукта. Растет риск возникновения ошибок прямопропорционально дублированному коду.
- Используем сторонние технологии - использование технологий не предусмотренных для работы с Астериском по умолчанию. Тут либо надо писать свою команду для работы с необходимой технологией, либо вынести обработку данных в отдельное приложение AGI.
Бесполезный AGI:
- Большая нагрузка на АТС сервер - При использовании только инструкций плана дозвона у нас формируется поток(thread), а при использовании AGI формируется процесс(process) на каждый входящий звонок, если сценарий обработки звонка большой, то сервер будет перегружен обработкой звонков и возникнет проблема нехватки ресурсов для работы всей системы программной АТС(декодирование речи, обработка очередей и т.д.). Следствие проблемы - отсутствие сервиса полностью или по причине плохого качества. Решение: ограничить кол-во входящих звонков или купить еще один сервер, - дорого.
# asterisk -vvvvvvcd
...
*CLI> show agi
answer Answer channel
channel status Returns status of the connected channel
database del Removes database key/value
database deltree Removes database keytree/value
database get Gets database value
database put Adds/updates database value
exec Executes a given Application
get data Prompts for DTMF on a channel
get full variable Evaluates a channel expression
get option Stream file, prompt for DTMF, with timeout
get variable Gets a channel variable
hangup Hangup the current channel
noop Does nothing
receive char Receives one character from channels supporting it
receive text Receives text from channels supporting it
record file Records to a given file
say alpha Says a given character string
say digits Says a given digit string
say number Says a given number
say phonetic Says a given character string with phonetics
say date Says a given date
say time Says a given time
say datetime Says a given time as specfied by the format given
send image Sends images to channels supporting it
send text Sends text to channels supporting it
set autohangup Autohangup channel in some time
set callerid Sets callerid for the current channel
set context Sets channel context
set extension Changes channel extension
set music Enable/Disable Music on hold generator
set priority Set channel dialplan priority
set variable Sets a channel variable
stream file Sends audio file on channel
control stream file Sends audio file on channel and allows the listner to control the stream
tdd mode Toggles TDD mode (for the deaf)
verbose Logs a message to the asterisk verbose log
wait for digit Waits for a digit to be pressed
*CLI>
*CLI> show agi answer
Usage: ANSWER
Answers channel if not already in answer state. Returns -1 on
channel failure, or 0 if successful.
Полезный FastAGI:
- Балансировка нагрузки - Для того чтобы расширить возможную нагрузку, нам надо запустить отдельный экземпляр сервиса AGI и работать с ним по средством TCP протокола. В таком случае производительность будет зависеть от выбранной вами технологии и качества ее использования.
Полезный FATS:
- Уже имеем сервис - Все приложения Twisted являются сетевыми сервисами. Каркас предоставляет инструментарий для удобного управления ими в окружении выбранной ОС.
- Не блокируемый код - Асинхронное программирование предполагает наличие механизмов с не блокируемым кодом. Теперь нет необходимости ждать всему потоку пока не выполнится один из этапов обработки звонка. Приложение может выполняться дальше и когда действительно появится необходимость в ранее отложенных на вычисление данных, они либо уже будут доступны, либо мы будем ждать значительно меньше времене. Кроме того, это позволяет облегчить сам процесс. Не создаются процессы или потоки для каждого звонка, их могут обрабатывать отложенные задачи(deferred), более тяжеловесные инструменты IPC вы можете использовать на свое усмотрение. Плюс: маленькая и не ресурсоемкая программы с очень большой расширяемостью.
- Наличие тестов - В FATS весь код покрывают тесты и для разработки приложений сделан модуль для их тестирования без участия реального сервера. Используется шаблон Mock Object. Такой же шаблон применяется для работы с фиктивной базой данных. Это ускоряет процесс разработки и отладки в несколько раз!
- Готовые модули - Сам Twisted содержит большое количество проверенных временем протоколов и технологий. Их нужно применять! Например мы можем работать с любой базой, которая поддерживает стандарт ADBAPI 2.0 в асинхронном режиме.
- Балансировка нагрузки - Для того чтобы расширить возможную нагрузку, нам просто надо запустить еще один экземпляр сервиса и распределить между рабочими процессами входящие соединения. Обычно это не критично, т.к. у таких сервисов больше запас по мощности, чем у сервера Астериск. Они могут работать на одном физическом сервере, значительно увеличивая общую производительность системы!
Бесполезный FATS:
- Отсутствие квалифицированных кадров - На рынке труда не много специалистов способных предоставить качественные услуги. Отсутствие опыта. Приложение должно быть протестированное и стабильное. Сервис должен работать как сервис в выбранной ОС. По факту такое бывает крайне редко. Это минус команды разработчиков.
AMI - протокол для удаленного управления Астериском. Позволяет создавать приложения-клиентов и передавать серверу Астериск команды на выполнение, а также следить за событиями на нем.
В данном случае FATS позволяет максимально эффективно использовать протокол AMI. Посмотреть все команды AMI и привелегии необходимые для их запуска на вашем сервере Астериск можно при помощи команды:# asterisk -vvvvvvcd ... *CLI> show manager commands Action Privilege Synopsis ------ --------- -------- AbsoluteTimeout call,all Set Absolute Timeout AgentCallbackLo agent,all Sets an agent as logged in by callback AgentLogoff agent,all Sets an agent as no longer logged in Agents agent,all Lists agents and their status ChangeMonitor call,all Change monitoring filename of a channel Command command,all Execute Asterisk CLI Command DBGet system,all Get DB Entry DBPut system,all Put DB Entry EventsУдачной разработки телефонных сервисов настоящего и будущего!Control Event Flow ExtensionState call,all Check Extension Status Getvar call,all Gets a Channel Variable Hangup call,all Hangup Channel IAXnetstats Show IAX Netstats IAXpeers List IAX Peers ListCommands List available manager commands Logoff Logoff Manager MailboxCount call,all Check Mailbox Message Count MailboxStatus call,all Check Mailbox Monitor call,all Monitor a channel Originate call,all Originate Call ParkedCalls List parked calls Ping Keepalive command QueueAdd agent,all Add interface to queue. QueuePause agent,all Makes a queue member temporarily unavailable QueueRemove agent,all Remove interface from queue. Queues Queues QueueStatus Queue Status Redirect call,all Redirect (transfer) a call SetCDRUserField call,all Set the CDR UserField Setvar call,all Set Channel Variable SIPpeers system,all List SIP peers (text format) SIPshowpeer system,all Show SIP peer (text format) Status call,all Lists channel status StopMonitor call,all Stop monitoring a channel *CLI>

![[Logo: FATS is a Twisted & Fast Asterisk's Telephony Services]](/shared/img/logo_fats.png)