Kannel и ненадежные HTTP-сервисы

Продолжаем ликбез по Kannel ;-)

Наиболее распространенный способ обращения Kannel к бизнес-логике конкретного сервиса - отправка HTTP-запроса. Простой и понятный API позволяет создавать сервисы даже начинающим программистам. В моей личной практике встречались приложения в 2-3 строки, из которых первая была shebang'ом, но речь пойдет о повышении надежности и сглаживании нагрузки.

 

Ситуация 1: недоступность сервиса в момент запроса

Причины могут быть очень разные - ненадежная сеть, чрезмерная нагрузка, регламентные работы на сервере (абонентам по барабану), да и просто кривые руки разработчиков.

По умолчанию, Kannel после неудачной попытки просто отправит абоненту ответное сообщение о недоступности сервиса. Но можно сделать следующие изменения в конфигурации (группа smsbox):

http-request-retry = 5
http-queue-delay = 60

Первая строка означает, что нужно сделать 5 попыток доставки, а уж потом признать сервис помершим. Вторая строка задает периодичность повторных попыток (60 секунд). Так что теперь наш сервис может пролежать пару минут, не пугая пользователя.

Ситуация 2: тяжелая бизнес-логика и ограничение нагрузки

Допустим, нашему SMS-сервису необходимо для выдачи результата произвести большое количество вычислительной работы или перелопатить террабайты данных. При этом, нагрузка у нас неравномерная, а пропускная способность на SMSC выдана с хорошим запасом. Во многих случаях это светит лавинообразным ростом нагрузки, т.к. запросы могут поступать быстрее, чем их получается обработать, из-за чего плодятся обработчики, пока машинка не сдохнет.

Чтобы такого не происходило, в той же группе smsbox нужно добавить примерно такую строчку:

max-pending-requests = 10

Теперь одновременно Kannel будет отправлять не более 10 HTTP запросов, содержащих MO SMS или DLR. Для справки: ограничение по умолчанию составляет 512 одновременных запросов.