Оптимизируете Jetty для обнаружения сердцебиения тысяч машин?

У меня есть большое количество машин (тысячи и более), которые каждые X секунд будут выполнять HTTP-запрос к серверу Jetty, чтобы уведомить, что они живы. При каком значении X следует использовать постоянные HTTP-соединения (которые ограничивают количество отслеживаемых машин количеством одновременных подключений) и при каком значении X клиент должен повторно устанавливать TCP-соединение (что теоретически позволит контролировать больше машин). с тем же сервером Jetty).

Как изменится ответ для соединений HTTPS? (Предполагая, что ЦП не является ограничением)

Этот вопрос намеренно игнорирует масштабирование с несколькими веб-серверами Jetty.

Обновление: в основном вопрос можно свести к наименьшему рекомендуемому значению lowResourcesMaxIdleTime.


person itaifrenkel    schedule 21.12.2012    source источник


Ответы (2)


Я бы сказал, что это не столько проблема масштабирования причала, сколько проблема масштабирования сети, и в этом случае «это зависит» от вашей сетевой инфраструктуры. Только вы действительно знаете, как устроена ваша сеть и какие задержки задействованы, чтобы получить значение X.

С точки зрения накладных расходов постоянные HTTP-соединения, конечно, будут иметь незначительный эффект (ну, я говорю незначительный, но зависит от вашей сети), а HTTPS снова будет иметь большее влияние... но только с точки зрения объема трафика, поскольку вы предполагая, что ЦП не является ограничением.

Таким образом, с точки зрения причала, на самом деле не нужно участвовать в этом вопросе, вы, похоже, в конечном итоге просите помощи в оптимизации байтов трафика в сети, поэтому на самом деле вы ищете лучший протокол на данный момент. Поскольку с HTTP вам приходится возиться с заголовками для каждого запроса, вы можете хорошо обслуживаться, глядя на что-то вроде spdy или websocket, которые дадут вам постоянные соединения, но оптимизированы для низких сетевых накладных расходов в оба конца. Но... они кажутся излишними для удара сердца. :)

person jesse mcconnell    schedule 21.12.2012
comment
Как насчет накладных расходов на открытие TCP-соединения по сравнению с ограничением количества одновременных TCP-соединений? Разве websocket не предполагает открытое TCP-соединение? Возможно, я не понимаю, откуда берется ограничение одновременных TCP-соединений. Может ли Jetty обрабатывать больше TCP-соединений только потому, что меньше трафика (Websocket против HTTP)? - person itaifrenkel; 21.12.2012
comment
в конечном итоге я хочу сказать, что, учитывая высказанные опасения, сама пристань вряд ли будет узким местом, о котором вам нужно беспокоиться или настраивать. я упоминаю веб-сокет, потому что вы упомянули постоянные http-соединения, и веб-сокет, вероятно, будет иметь меньше байтов, передаваемых накладными расходами, чем постоянные http-соединения, если вы принимаете во внимание заголовки в каждом запросе, и это будет хорошим протоколом сердцебиения в случае, я думаю, что вы описываете. - person jesse mcconnell; 21.12.2012
comment
Я не уверен, что хочу постоянных соединений. Jetty поставляется с предопределенным временем ожидания соединения, после которого постоянное соединение разрывается, и клиенту необходимо его восстановить. Клиенту не нужно ждать, пока Jetty закроет соединение, он может сделать это явно (я полагаю). Должен ли? При каких значениях X он должен это делать? Например, если X равно 1 минуте, то мне придется использовать постоянные соединения, и в этом случае Websocket более оптимален, чем HTTP. Но если X равно 1 секунде, то я бы предпочел отключить TCP-соединение и позволить другим машинам подключаться к серверу. - person itaifrenkel; 21.12.2012
comment
Я не думаю, что существует жесткое и быстрое рекомендуемое значение X для того, что вы ищете ... это компромисс, который вы должны решить, учитывая ваши настройки и степень детализации времени безотказной работы, которую пытается определить ваше сердцебиение. - person jesse mcconnell; 21.12.2012
comment
Хорошо, в этом случае я бы спросил о предварительно настроенном тайм-ауте по умолчанию и спросил, подходит ли он для моего варианта использования. Мне нужно иметь грубую оценку. - person itaifrenkel; 21.12.2012
comment
тайм-ауты обычно составляют около 30 секунд бездействия, что обычно является временным интервалом, превышающим то, как долго кто-то будет ждать загрузки страницы без обратной связи, и достаточно долго, чтобы разумно предположить, что без активности что-то, вероятно, произошло в сети. - person jesse mcconnell; 21.12.2012
comment
Отлично. Есть ли рекомендуемое значение для lowResourcesMaxIdleTime? Насколько низким он может быть установлен, не влияя на накладные расходы соединения TCP? - person itaifrenkel; 22.12.2012
comment
для этого нет «рекомендуемого» значения, кроме значения по умолчанию, оно зависит от ваших конкретных потребностей и опыта. Другими словами, это одна ручка, полезная при настройке существующей настройки, которую вы можете настроить... но если у вас нет фактических проблем, такая настройка разъема является преждевременной оптимизацией. Выберите свой протокол, исходя из реальных потребностей (heartbeat — это очень простые пакеты ping/pong в веб-сокете). - person jesse mcconnell; 26.12.2012
comment
Я разработал программное обеспечение, которое отслеживало более 40 тысяч одновременных клиентов на одной машине, поэтому я не вижу причин переключаться с http на какой-либо другой протокол. В конечном счете это зависит от мощности машины, но это определенно возможно. Хотя мы не использовали Jetty, но я уверен, что это один из самых быстрых контейнеров сервлетов, так что все должно быть в порядке... - person TheZuck; 28.12.2012
comment
Я просто выбрасываю этот блог Симоны Борде, коллеги по причалу и разработчику кометд, в котором рассказывается о некоторых графиках производительности http и веб-сокета с кометд (spdy, который является основой для http/2.0, результаты еще лучше). webtide.intalio.com/2011/09/cometd -2-4-0-веб-сокеты - person jesse mcconnell; 29.12.2012
comment
кроме того, у нас было 200 подключений, отправляющих 20 000 сообщений в секунду, и мы могли бы легко увеличить этот показатель... так что spdy показывает некоторые результаты в этой ветке здесь: webtide.intalio.com/2012/10/spdy-push-demo-from-javaone-2012 - person jesse mcconnell; 29.12.2012
comment
#TheZuck — Все ли 40 000 клиентов поддерживали постоянное TCP-соединение с сервером? Если нет, то каково минимальное время ожидания автоматического отключения сервера. - person itaifrenkel; 03.01.2013

Как насчет того, чтобы просто сделать запрос в разное время? Предположим, что первый запрос машины, затем вы выбираете время для ответа на эту машину, как в следующий раз, когда будет сердцебиение этой машины (также сохраните идентификатор/время на сервере причала), второй запрос машины, вы можете выбрать другое время для ответа на вторая машина.

Таким образом, вы можете заставить каждую машину выполнять запрос сердцебиения в разное время, чтобы не возникало одновременных проблем.

Вы также можете использовать случайное время для первого удара сердца, если все машины могут запускаться одновременно.

person benbai123    schedule 30.12.2012
comment
Учитывая достаточное количество машин, я предполагаю, что распространение будет достаточно хорошим и без его оркестровки. Даже если они конфликтуют, http-клиент может повторить попытку. Обратите внимание, однако, что вы предполагаете, что каждая машина создает новое соединение. Что я и спрашиваю. Должен ли? Каковы накладные расходы? - person itaifrenkel; 03.01.2013