Это может быть то, чего я принципиально не понимаю в настройке эластичного балансировщика нагрузки приложений AWS.
Все очень просто. Балансировщик нагрузки - это общедоступный интерфейс, перенаправляющий весь трафик одной целевой группе.
В целевой группе N контейнеров. В каждом контейнере работает некоторое количество рабочих, скажем X. Пер Документация Amazon рекомендуется иметь контейнеры с включенным keep-alive и иметь более высокое значение, чем время ожидания входящего трафика ELB.
Но по сути это означает, что нет абсолютно никакого смысла создавать более N * X соединений от ELB к целям, потому что запросы, поступающие по дополнительным соединениям, будут просто ждать в очереди к цели, потенциально вечно.
Судя по моим экспериментам, именно это и происходит. ELB открывает столько подключений к целям, сколько получает, и во время всплесков трафика эти дополнительные запросы терпят неудачу.
Вид поражений цель ELB, не так ли?
В идеале была бы опция, которая ограничивала бы количество открываемых соединений для каждой цели, а ELB сохранял бы дополнительные элементы в очереди ожидания на своей стороне, прежде чем перенаправлять цели на их открытые соединения (или новые цели, запускаемые с помощью автомасштабирования).
Я прочитал всю документацию и ответы на часто задаваемые вопросы по Amazon ELB и много искал здесь, но не нашел другого решения, кроме отключения keep-alives.
Я упустил что-то базовое?
Итак, мое основное понимание состоит в том, что ELB открывает соединение из внешнего приложения, пока нет доступных внутренних соединений. Если это верно, то вам не хватает следующего:
ELB должен открывать столько соединений, сколько запросов. Это основная концепция ELB для балансировки нагрузки ваших запросов на максимальное количество зарегистрированных целей. Таким образом, проблема не в вашем ELB, очевидно, он должен принимать весь трафик, который направлен на него. То, что вам здесь не хватает, заключается в том, что у вас должно быть достаточно целей, зарегистрированных в ELB, чтобы убедиться, что ELB может балансировать нагрузку всего трафика, который он получает, без перегрузки целевых объектов, что, говоря простым языком, означает, что вам необходимо настроить правильная политика автоматического масштабирования для учета всплесков трафика и обеспечения доступности достаточного количества целевых серверов для обработки нагрузки.
Надеюсь это поможет!