Как обрабатывать тайм-ауты enquire_link в SMPP-соединении без потери сообщений

Как обрабатывать тайм-ауты enquire_link в SMPP-соединении без потери сообщений

Отправляйте пакет enquire_link каждые 30–60 секунд для проверки активности соединения. Если шлюз не отвечает, фиксируйте тайм-аут, разрывайте сокет, возвращайте зависшие сообщения в очередь и запускайте переподключение с помощью команд BIND_TRANSCEIVER или BIND_TRANSMITTER. Протокол SMPP предназначен для непрерывного обмена информацией, поэтому правильная обработка разрывов исключает потерю трафика и зависание потоков.

Как настроить интервал enquire_link и тайм-аут сокета

Задайте таймер отправки пакета проверки связи на уровне вашего TCP-клиента. Установите время ожидания ответа от SMS-центра. Обычно этот интервал равен 10–15 секундам. Если за это время подтверждение не пришло, считайте соединение разорванным.

  • Установите таймер отправки enquire_link ровно на 30 секунд.
  • Задайте таймаут чтения сокета в 15 секунд.
  • При срабатывании таймаута принудительно закройте сетевое соединение.
  • Передайте невысланные пакеты обратно во внутреннюю очередь системы.

Как обрабатывать Throttling error при сбое связи

При получении ошибки Throttling error немедленно верните сообщение в очередь отправки. Выдержите обязательный таймаут на данном соединении ровно в 1 секунду перед следующей попыткой. Это защитит шлюз от перегрузки и предотвратит блокировку аккаунта со стороны провайдера. Дополнительные алгоритмы описаны в материале про настройку повторной отправки SMS при сбое SMPP-соединения.

Контролируйте скорость отправки пакетов на стороне приложения. Превышение лимитов приводит к принудительному сбросу сессии со стороны шлюза. Логируйте каждый случай получения ошибки для быстрой диагностики сетевых проблем.

Как выполнить переподключение за 10 секунд

У клиента есть ровно 10 секунд для установки нового соединения через шлюз SMPP после разрыва. В течение этого окна программа обязана отправить команду BIND_TRANSCEIVER или BIND_TRANSMITTER. Медленная инициализация приводит к сбросу сессии на стороне сервера и потере пакетов в буфере.

  1. Закройте старый дескриптор сокета операционной системы.
  2. Откройте новый TCP-сокет до хоста SMS-центра.
  3. Отправьте пакет аутентификации BIND_TRANSCEIVER в течение 10 секунд.
  4. Дождитесь ответа с кодом успешной авторизации.
  5. Возобновите отправку сообщений из очереди.

Какие параметры учесть при работе с очередью сообщений

Ответ на команду submit_sm означает только прием сообщения в обработку шлюзом или SMSC. Он не подтверждает доставку на телефон конечного абонента. Итоговый статус передается позже в отчете о доставке, если провайдер поддерживает эту функцию. Учитывайте этот фактор при возврате пакетов в очередь после срабатывания тайм-аута соединения.

Событие Причина Действие системы
Тайм-аут enquire_link Нет ответа от SMSC Закрыть сокет, вернуть пакеты в очередь
Throttling error Превышена скорость отправки Выдержать паузу 1 секунду, повторить
Разрыв TCP-соединения Сетевой сбой или таймаут редиректа Выполнить bind за 10 секунд

Как распределить приоритеты трафика и потоков

Если ваша система отправляет разные типы уведомлений, разделите их потоки по разным портам или сессиям. Для критических сервисных сообщений используйте выделенные соединения. Подробности читайте в руководстве про настройку приоритета SMS через SMPP для микробизнеса Беларуси.

Мониторьте состояние очереди в реальном времени. При росте числа неотправленных сообщений увеличивайте количество параллельных сокетов в пределах разрешенных лимитов вашего договора с провайдером.

3 шага для проверки обработки тайм-аутов сегодня:

  1. Искусственно заблокируйте пакеты enquire_link на фаерволе тестового контура.
  2. Замерьте время реакции приложения на срабатывание тайм-аута сокета.
  3. Убедитесь, что неподтвержденные submit_sm вернулись в очередь без дублирования.
Полезные ссылки сервис рассылок RocketSMS