Это может указывать на большее, чем ожидалось, время, в течение которого ваши хосты НЕ активно обрабатывают сообщения.
Из вашего примера 2000 потребителей, опрашивающих с интервалом в 2 с, но только с максимальным значением в 600 в сообщениях о полете - некоторая очень грубая математика (600/2000=0.3
) будет означать, что ваши хосты тратят только 30% своего времени на фактическую обработку. В простейшем случае это может произойти, если опрос / обработка / удаление сообщения занимает всего 600 мс, а среднее время простоя между удалением одного сообщения и получением следующего составляет 1400 мс.
Хорошим шаблоном для обработки сообщений большого объема является представление об обработке сообщений в терминах пулов потоков - один для извлечения сообщений, один для обработки и один для удаления (с локальной памятью очередь для передачи сообщений между каждым пулом). Каждый пул имеет очень специфическое назначение, и его можно легко настроить, чтобы действительно хорошо выполнить эту задачу:
- Иметь достаточно сборщиков (использующих пакетный API ReceiveMessage), чтобы разблокировать процессоры
- Ограничить размер очереди в памяти между сборщиками и процессорами, чтобы один хост не отправлял слишком много сообщений (блокируя их обработку другими хостами)
- Добавьте столько процессорных потоков, сколько может обработать ваш хост
- Сохраняйте метрики относительно того, сколько времени занимает обработка, и предоставьте возможность прервать обработку, если она превышает определенный порог времени (связанный с тайм-аутом видимости)
- Использовать достаточное количество средств удаления, чтобы не отставать от обработки (также используя пакетный API DeleteMessage)
Записывая метрики на каждом этапе и очереди в памяти между каждым этапом, вы можете легко определить, где находятся ваши узкие места, и выполнить более точную настройку системы.
Другие вопросы для рассмотрения:
- Использовать длинный опрос - установить свойство WaitTimeSeconds в API ReceiveMessage, чтобы минимизировать пустые ответы
- Когда вы видите низкую пропускную способность, убедитесь, что ваша очередь насыщена - если в очереди очень мало элементов и много процессоров, многие из этих процессоров будут бездействовать в ожидании сообщений.
- Не опрашивать с интервалом - опрашивайте, как только вы закончите обработку предыдущих сообщений.
- Используйте пакетирование для запроса / удаления нескольких сообщений одновременно, сокращая время, затрачиваемое на вызовы в оба конца на SQS