Настройка очередей вызовов (Queues) в Asterisk: стратегии ringall, roundrobin, leastrecent
- Вызовы зависают в очереди и сбрасываются по таймауту без распределения на свободных операторов.
- Звонок поступает оператору, который уже разговаривает по другой линии (Call Waiting collision).
- Неравномерная нагрузка на сотрудников колл-центра (одни принимают в 3 раза больше звонков, чем другие).
- Вызовы попадают в очередь, когда в ней нет ни одного зарегистрированного оператора (Joinempty violation).
1. Обзор основных стратегий распределения (Strategy)
- ringall: звонят все доступные операторы одновременно (наибольшая нагрузка на сеть).
- leastrecent: вызов направляется оператору, который дольше всех не принимал завершенный звонок.
- fewestcalls: звонит оператор с наименьшим количеством принятых вызовов за смену.
- rrmemory (Round Robin with Memory): поочередный перебор операторов по кругу с запоминанием последней позиции.
- linear: строгий обзвон по порядку списка операторов.
- wrandom: случайный выбор с учетом индивидуального весового коэффициента оператора (penalty).
2. Настройка queues.conf
Файл /etc/asterisk/queues.conf:
[general]
persistentmembers=yes
autofill=yes
monitor-type=MixMonitor
shared_lastcall=yes
; --- Очередь техподдержки ---
[support_queue]
strategy=leastrecent
timeout=15
retry=2
wrapuptime=20
maxlen=50
servicelevel=60
joinempty=no
leavewhenempty=yes
ringinuse=no
announce-frequency=45
announce-holdtime=yes
; Статические операторы (Интерфейс, Приоритет/Штраф)
member => PJSIP/101,0
member => PJSIP/102,0
member => PJSIP/103,13. Логика диалплана в extensions.conf
[from-internal]
; Вход в очередь
exten => 700,1,NoOp(Incoming call to Support Queue)
same => n,Answer()
same => n,Queue(support_queue,tTkK,,,120)
same => n,Playback(queue-periodic-announce)
same => n,Hangup()
; Динамический вход оператора (Login/Logout)
exten => *71,1,NoOp(Dynamic Agent Login)
same => n,AddQueueMember(support_queue,PJSIP/${CALLERID(num)})
same => n,Playback(agent-loginok)
same => n,Hangup()
exten => *72,1,NoOp(Dynamic Agent Logout)
same => n,RemoveQueueMember(support_queue,PJSIP/${CALLERID(num)})
same => n,Playback(agent-loggedoff)
same => n,Hangup()4. Проверка состояния очереди в CLI
asterisk -rx "queue show support_queue" Частые вопросы (FAQ)
Зачем нужен параметр wrapuptime?
wrapuptime задает постобработочное время (в секундах) после завершения разговора, в течение которого оператору не будут поступать новые вызовы из очереди, позволяя ему внести данные в CRM.
Почему оператору идет второй звонок из очереди во время разговора?
Убедитесь, что в queues.conf выставлен параметр ringinuse=no, а на PJSIP Endpoint абонента включен device state tracking и call_counter=yes.
Что означает штраф (Penalty) у оператора?
Штраф — это целое число. Очередь сначала пытается дозвониться до всех доступных агентов со штрафом 0. Если ни один агент со штрафом 0 не ответил или они заняты, вызов переходит к агентам со штрафом 1 и выше.
Что делает параметр autofill=yes?
Без autofill первый вызов в очереди блокирует распределение последующих вызовов до своего ответа. autofill=yes позволяет второму абоненту в очереди сразу соединиться со вторым свободным оператором параллельно.