Задержка вызовов API между несколькими параллельными процессами - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над добавлением SMS-уведомлений в веб-приложение C #. В двух словах, пользователь входит в интерфейс, набирает сообщение, выбирает получателей и сохраняет их. Я использую Hangfire для ускорения фоновых заданий - эти задания обрабатывают фактическое здание, а затем отправляют SMS-сообщения через провайдера (в настоящее время Nexmo).

Nexmo, а также большинство других провайдеров SMS,есть API в их API, который ограничивает возможность ставить в очередь исходящие сообщения до скорости X / сек, причем скорость варьируется в зависимости от уровня вашей учетной записи. В целях тестирования я ограничиваюсь 1 / сек.

В настоящее время, когда начинается мой фоновый процесс, я отслеживаю количество времени, которое прошло между вызовами API, и, если оно меньше 1 сек, яположить поток спать на количество оставшегося времени. Кажется, это работает довольно хорошо, однако проблема, с которой я сталкиваюсь, заключается в том, что существует возможность одновременной работы нескольких параллельных фоновых процессов, например, когда два пользователя запускают исходящие SMS-сообщения нав то же время. Есть еще одна сложность, при которой, если вы используете 2 исходящих номера, ваши ограничения API фактически удваиваются (1 сообщение в секунду из каждого используемого номера). Я игнорирую это в настоящее время и просто откладываю между всеми вызовами API.

Я ищу любой совет о том, как обойти эту проблему. Моя единственная идея состоит в том, чтобы полностью отделить обработку сообщений от фонового задания - с помощью задания зависания, просто создавшего сообщения и помечающего их как очереди для отправки, и отдельного однопоточного приложения, которое выступает в основном как наблюдатель и отправляет сообщения FIFO. .

любые предложения будут оценены!

1 Ответ

1 голос
/ 23 октября 2019

Регулирование запросов API будет различным в зависимости от того, какую страну и тип номера вы используете. Как правило, ограничение составляет 30 запросов API в секунду на ключ - но это зависит от региональных ограничений, см.:

https://help.nexmo.com/hc/en-us/articles/203993598-What-is-the-Throughput-Limit-for-Outbound-SMS-

https://help.nexmo.com/hc/en-us/sections/200622473-Country-Specific-Features-and-Restrictions

Например, если выпри использовании длинного виртуального номера США (LVN), в отличие от короткого кода или бесплатного номера, ограничены 1 сообщением за LVN в секунду и 250 сообщениями в день. Если это ограничение, с которым вы сталкиваетесь, вы можете рассмотреть тип номера, который вы используете, так как US LVN на самом деле не предназначен для сообщений P2P sms.

Обновление:

Вы можете установить параметр конфигурации

"appSettings": {
    "Nexmo.Api.RequestsPerSecond": "30"
  }

для вашего appsettings.json - это сделает настройку конфигурации его HTTP-клиентом для использования ThrottlingMessageHandler - каклюбой клиент Nexmo API использует единичный экземпляр конфигурации (и, следовательно, это http-клиент), что фактически не даст вам отправлять больше, чем ограниченное количество запросов в секунду.

...