Skip to Content

Kannel - резервирование подключений к SMSC

Оригинал: http://www.rattler.kiev.ua/ru/kannel-smsc-failover
Автор: Михаил Бочкарев, Net Style

При внедрении SMS-сервисов иногда возникает необходимость организовать возможность отправки сообщений через запасное подключение к SMSC, если основное подключение отсутствует.

Например, как отображено на диаграмме ниже, в нормальной ситуации нужно отправлять сообщения на SMSC 1, но в случае аварии переключаться на отправку через SMSC 2.

Kannel - SMSC failover

Рассмотрим, каким образом можно решить это с помощью Kannel так, чтобы для внешних приложений все оставалось прозрачно.

Опустим здесь настройку параметров SMPP и будем считать, что у нас уже создана конфигурация Kannel с двумя секциями "group = smsc".

Первая секция:

# Основное подключение group = smsc
smsc = smpp
smsc-id = "smsc-1"
...

и вторая:

# Резервное подключение group = smsc
smsc = smpp
smsc-id = "smsc-2"
...

Как видно, эти секции отличаются параметром smsc-id и при отправке сообщения с помощью sendsms API можно указать нужное подключение (например, smsc=smsc-1).

Переходим к изменению настроек Kannel

Сперва мы создадим виртуальный идентификатор smsc, через который будут доступны оба соединения. Для этого используем параметр allowed-smsc-id, который указывает, какие значения HTTP-параметра smsc применимы к соединению.

group = smsc
smsc = smpp
smsc-id = "smsc-1"
allowed-smsc-id = "virt-smsc" ... group = smsc
smsc = smpp
smsc-id = "smsc-2"
allowed-smsc-id = "virt-smsc"

Как видно, у нас появился параметр allowed-smsc-id с одинаковыми значениями в обоих секциях. Теперь, если указать в запросе HTTP параметр smsc=virt-smsc, то сообщение может быть доставлено через любое из указанных подключений.

Теперь перейдем ко второй задаче и укажем, что по возможности нам необходимо передавать сообщения через smsc-1. Для этого мы будем использовать еще один параметр - preferred-smsc-id, который указывает предпочтительное соединение для данного значения параметра smsc.

group = smsc
smsc = smpp
smsc-id = "smsc-1"
allowed-smsc-id = "virt-smsc" preferred-smsc-id = "virt-smsc" ... group = smsc
smsc = smpp
smsc-id = "smsc-2"
allowed-smsc-id = "virt-smsc"

Теперь, если отправить через sendsms API сообщение с указанием smsc=virt-smsc, то оно будет доставляться через smsc-1 при доступном основном подключении, а в случае его недоступности - через smsc-2.

GET 'http://127.0.0.1:13013/cgi-bin/sendsms?user=test&password=test&smsc=virt-smsc&from=1234&to=380012345678'

Данную конфигурацию можно легко проэмулировать с использованием fakesmsc перед тем, как запускать в боевой режим - описанные выше параметры с smsc = fake работают адекватно.