Джерси SSE масштабируемость на клиенте - PullRequest
0 голосов
/ 23 октября 2018

Я собираюсь использовать 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 является хорошим решением для такого варианта использования, как этот?

...