мы отправляем сообщения с помощью 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.
Думаю, это довольно распространенная задача, но мне почему-то не повезло найти полное решение.
Любая помощь или идеи будут приняты с благодарностью. Спасибо.