Не удается достичь лимита отправки Amazon SES из-за ошибок регулирования

мы отправляем сообщения с помощью Amazon SES, используя SES API. Наша скорость отправки теперь составляет 90 сообщений в секунду. Но мы получаем исключение дросселирования, даже когда мы не достигайте этого предела, а просто пытайтесь приблизиться к нему.

Сейчас мы можем стабильно отправлять со скоростью 30 сообщений в секунду. Вопрос в том, как быстрее отправить.

Позвольте мне углубиться в некоторые детали и прояснить вопрос.

  • Выполнение одного запроса на отправку API может занять от 0,3 до 3 секунд. Вот почему, если мы будем отправлять сообщения последовательно, мы вряд ли получим скорость 1 сообщение в секунду.
  • К счастью, мы можем отправлять сообщения параллельно, и это то, что мы делаем.
  • Для каждого потока мы проверяем, что он не отправляет больше разрешенного количества сообщений в секунду. Например, если у нас есть 40 потоков, мы не разрешаем каждому потоку отправлять более 2 сообщений в секунду. Да, это не оптимально.
  • Мы регистрируем каждое отправленное сообщение и время, когда запрос API был завершен (когда мы получили ответ от API). Это позволяет получить некоторую статистику.
  • Когда мы ограничиваем лимит отправки меньше разрешенного лимита (например, 60 вместо 90), все работает нормально.
  • Когда мы пытаемся отправить на максимальном лимите, мы начинаем получать ошибки регулирования. Например, когда мы достигаем скорости 80 запросов в секунду, мы начинаем получать исключения.

Это позволяет мне задавать вопросы:

В: Как отправлять сообщения с максимально допустимой скоростью?

Начнем с другого вопроса: «Как SES рассчитывает количество сообщений для проверки скорости отправки?»

Дай угадаю. Когда мы отправляем новый запрос, они смотрят на количество запросов, отправленных за последнюю секунду с текущего момента, и если это число меньше нашего лимита, запрос принимается.

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

Исследовательская работа

Есть отличный сообщение в блоге Amazon SES об использовании ограничений. Мы пытаемся применить этот подход, но пока не добились успеха.

Мы используем PHP в нашем приложении и PHP SES SDK.

Думаю, это довольно распространенная задача, но мне почему-то не повезло найти полное решение.


Любая помощь или идеи будут приняты с благодарностью. Спасибо.


person Victor Smirnov    schedule 27.02.2013    source источник


Ответы (1)


Ключевой вывод:

На скорость отправки могут влиять различные факторы, например размер сообщения, производительность сети или доступность Amazon SES.

Исходя из того, что вы сказали, похоже, что вы используете немного нечеткой логики, чтобы попытаться вычислить, сколько сообщений вы отправляете. Это не будет идеально, поэтому, если ваш предел AWS составляет 90p / s, то установка кода ниже, например, до 60p / s имеет смысл (опять же, все зависит от того, насколько точны ваши оценки).

Вам следует рассмотреть другие упомянутые вами подходы, такие как «экспоненциальная отсрочка», как описано в предоставленной вами ссылке.

Еще одна вещь, которую вы можете рассмотреть, - это использование очереди, например SQS. Таким образом, вы можете выбрать задачи из списка как можно быстрее, а если вы немного поторопитесь, вы всегда можете отступить, а затем вернуться в очередь как можно скорее.

person Drew Khoury    schedule 12.09.2013
comment
Мы используем PHP SES SDK и выполняем массовые рассылки. SDK отключается для нас в случае дросселирования или других ошибок. Мы обнаружили оптимальную конфигурацию для количества потоков и сообщений в пакете, которая нам подходит. Мы не отправляем с максимально возможной скоростью, но, в конце концов, у нас все в порядке с тем, что у нас есть. Мы используем Gearman вместо SQS, а сценарий, отвечающий за отправку сообщений, не выполняет ничего, кроме отправки. Я думаю, это то, что вы предложили. Спасибо за комментарий. - person Victor Smirnov; 30.10.2013
comment
Если вас устраивает мой ответ как решение, не стесняйтесь отмечать его как правильный ответ. - person Drew Khoury; 07.12.2013