Kannel и несколько подключений в одном ESME

Вообще, сегодняшняя ситуация была из ряда вон выходящей. Одного из наших технологических партнеров угораздило обавестись SMS-шлюзом, который по SMPP на один ESME отдает не более чем 1 DLR (Delivery Report) в секунду.

  • Само собой, если на отправку ограничение выставлено в 10 MT SM/sec, то при отправке большого количества SMS (например, отчет какого-нибудь банка о набежавших за месяц процентах) мы получаем вполне логичный рост очереди DLR в количестве 9 DLR/sec.
  • Естественно, если в какой-то момент времени нам потребуется отправить сообщение  (пускай это тот же банк) о только что прошедшей транзакции, то подтверждение о доставке нам придет не раньше, чем рассосется ранее накопленная очередь этих уведомлений. Ладно там с банком, а для какого-нибудь такси с сообщением "выходите через 5 минут, у подъезда серый Cadillac" это будет очень неприятно.

Однако, спустя несколько недель камлания и плясок с бубном, партнер выяснил, что можно и повысить скорость отправки DLR, если организовать несколько подключений (ESME). При этом, как оказалось, можно вполне спокойно использовать один и тот же system-id на всех этих подключениях.

И тут меня в очередной раз спасла возможность Kannel подключать несколько SMSC с одинаковым system-id, чем я не преминул воспользоваться. Для начала выяснилось, что идентичные настройки нескольких group=smsc вполне нормально воспринимаются. При этом, не возникает проблем с отработкой DLR (пакет deliver_sm, пришедших через подключение, отличное от используемого для отправки MT SM в пакете submit_sm). В результате мы просто создаем десяток идентичных секций конфига с одинаковыми параметрами подключения к SMSC (включая smsc-id, allowed-smsc-id, preferred-smsc-id) и дальше внешние приложения продолжают думать, что у нас только одно подключение, только уведомления о доставке стали приходить заметно большим потоком.

А еще выяснилось, что при использовании команды remove-smsc административного API нужно ее вызвать стольько же раз, сколько идентичных секций прописано. Если же не все соединения удалены, то добавить еще одно с тем же именем Kannel банально не даст.