Я собираюсь использовать Jersey SSE для замены текущей механики опроса тысяч ресурсов REST. Подход к опросу не очень хорошо масштабируется с увеличением количества зарегистрированных узлов.
У меня есть один клиент, который управляетмного серверов в том смысле, что с помощью клиента можно зарегистрировать до 10 000 узлов / серверов, тогда как каждый узел имеет набор ресурсов REST.Некоторые из этих ресурсов опрашиваются, скажем, с 30-секундным интервалом в настоящее время, чтобы поддерживать клиента в курсе информации, полученной из ресурсов REST.Информация обычно представлена в виде свободной памяти, дискового пространства, использования процессора и т. Д. Подумайте о мониторинге некоторого процесса JVM (с контейнером сервлета и Джерси), выполняющегося на разрозненных хостах через HTTP / REST.Хотя это в основном данные мониторинга, для клиента не так важно быть на одном уровне с состоянием серверов с точностью до секунды (в настоящее время опрос использует интервал 30 секунд), однако, с другой стороны, некоторые очень важные функцииклиента зависит от того, подключен ли конкретный REST-сервер и в каком состоянии он находится.
Данные, которые сами опрашиваются, не должны изменяться очень часто, поэтому я начал изучать SSE с мыслью, чтоклиент / сервер используют какой-то умный подход NIO, чтобы не занимать процесс, если в данный момент нет данных / событий, которые должны быть переданы по проводам.
Итак, я скачал последний дистрибутив Джерси и началсмотря на это.Я быстро запустил базовый пример SSE.
Ресурс SSE точно такой же, как в примере, а клиент - что-то вроде этого.COUNT_EVENT_SOURCE может достигать 10 000:
public static void main(String[] args) {
Client client = ClientBuilder.newBuilder().register(SseFeature.class)
.build();
for (int i = 0; i < COUNT_EVENT_SOURCE; i++) {
WebTarget target = client.target(Constants.ENDPOINT);
EventSource eventSource = EventSource.target(target).build();
final int count = i;
EventListener listener = new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
System.out.println("listener no. " + count + " event name: " + inboundEvent.getName()
+ "; " + inboundEvent.readData(String.class));
}
};
eventSource.register(listener, "message-to-client");
eventSource.open();
}
}
Я запустил jvisualvm и заметил, что для каждого клиента создается новый поток, который сохраняется, пока соединение с ресурсом SSE в порядке..
Таким образом, если у меня есть клиент, который хочет использовать SSE для связи с 10 000 ресурсов SSE, находящихся на разных хостах / портах, это будет означать, что у меня будет 10 000 долгоживущих потоков для каждого изРесурсы SSE постоянно занимают процессорное время и 10 000 долгоживущих клиентских сокетов, а также верно?
Что опять-таки не похоже на очень масштабируемый подход ...
Может ли пул потоков с некоторыми разумнымиразмер будет использоваться вместо?В целом, считаете ли вы, что SSE является хорошим решением для такого варианта использования, как этот?