Область применения 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) на каждый входящий звонок, если сценарий обработки звонка большой, то сервер будет перегружен обработкой звонков и возникнет проблема нехватки ресурсов для работы всей системы программной АТС(декодирование речи, обработка очередей и т.д.). Следствие проблемы - отсутствие сервиса полностью или по причине плохого качества. Решение: ограничить кол-во входящих звонков или купить еще один сервер, - дорого.

Посмотреть все команды AGI на вашем сервере Астериск можно при помощи команды:
Asterisk CLI:
# 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 CLI:
# 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> 
Удачной разработки телефонных сервисов настоящего и будущего!