SIP 503 Service Unavailable: перегрузка транка, лимиты каналов и Retry-After
Массовый или периодический отказ в совершении вызовов в часы наибольшей нагрузки (ЧНН):
- Звонящий получает отбой с кодом
SIP/2.0 503 Service Unavailable. - В ответе присутствует заголовок
Retry-After: 30, указывающий время ожидания перед повторной попыткой. - Исчерпан лимит купленных одновременных каналов (Concurrent Calls) или лимит частоты вызовов (Calls Per Second — CPS) на транке оператора.
- Сервер телефонии находится в режиме планового технического обслуживания (Maintenance Mode) или перезагрузки.
1. Анализ заголовка Retry-After и причин сбоя
Захватите пакет 503 через sngrep:
SIP/2.0 503 Service Unavailable
Via: SIP/2.0/UDP 10.0.0.1:5060;branch=z9hG4bK-741
To: <sip:+74951234567@provider.com>;tag=9912a
From: <sip:100@pbx.local>;tag=8821
Call-ID: ab32-c10-9
CSeq: 101 INVITE
Retry-After: 60 (Server Maintenance)
Reason: Q.850;cause=34;text="No circuit/channel available"
Content-Length: 0Причина Q.850;cause=34 прямо указывает на нехватку свободных каналов в пуле оператора.
2. Ограничение исходящей нагрузки (Call Throttling / CPS)
Если вы используете автообзвон или массовые рассылки (Call Center Outbound Dialer), ограничьте CPS в настройках генератора вызовов:
; Ограничение параллельных каналов на транке в FreePBX / Asterisk:
; В настройках транка Trunk -> Outbound Concurrency Limit = 30
; Лимитирование через функцию GROUP() в диалплане:
[outbound-trunk]
exten => _X.,1,NoOp(Checking Trunk Capacity)
same => n,Set(GROUP()=outbound_provider)
same => n,GotoIf($[${GROUP_COUNT(outbound_provider)} > 30]?trunk_busy)
same => n,Dial(PJSIP/${EXTEN}@provider,60)
same => n,Hangup()
same => n(trunk_busy),NoOp(Max channels reached! Routing to backup)
same => n,Dial(PJSIP/${EXTEN}@backup_provider,60)3. Мониторинг активных каналов в Asterisk
asterisk -rx "core show channels"
asterisk -rx "pjsip show channelstats"4. Корректный вывод ноды из балансировки (Graceful Drain)
Для предотвращения выдачи 503 клиентам при проведении техработ, переводите Kamailio / Asterisk в режим Drain, чтобы завершить активные звонки без приема новых:
# Отключение приема новых вызовов на интерфейсе:
asterisk -rx "core stop gracefully" Частые вопросы (FAQ)
Что сообщает заголовок Retry-After в ответе 503?
Он указывает клиенту минимальное количество секунд, в течение которых данный ресурс будет недоступен, и запрещает отправлять повторные запросы до истечения этого интервала.
Чем отличается SIP 503 от SIP 486 Busy Here?
Код 486 означает, что занят конкретный вызываемый абонент (его терминал). Код 503 означает отказ инфраструктуры (перегрузка сервера, нехватка каналов оператора или сбой сетевого оборудования).
Что такое лимит CPS и как он вызывает ошибку 503?
CPS (Calls Per Second) — ограничение на количество новых попыток вызовов в секунду. Если кол-центр запускает 50 звонков одновременно при лимите оператора в 10 CPS, избыточные запросы будут сброшены с кодом 503.
Может ли АТС отдавать 503 при нехватке лицензий?
Да, многие проприетарные АТС (Avaya, Cisco CUCM, 3CX) возвращают 503 Service Unavailable, если количество активных вызовов превысило купленный лицензионный пакет.