Количество одновременных запросов, которые может обработать клиент GemFire ​​на основе Spring - PullRequest
0 голосов
/ 12 мая 2019

Мы используем Spring Session для управления с использованием Pivotal GemFire ​​в нашем приложении.

В производстве, когда увеличивается нагрузка, приложение не отвечает (полностью зависает).Мы получаем ошибку, как будто клиент занесен в черный список.Мы проверили количество запросов, и это похоже на 15k.

Приложение развернуто в контейнерах.Используемый протокол - Http11AprProtocol, а максимальное число потоков установлено на 200.Мы проверили дамп потока.Ошибка приведена ниже.

Мы не уверены, что объем груза не может быть обработан контейнерами или GemFire.В GemFire ​​есть какой-то конкретный параметр, который определяет количество потоков, которые он может обработать.Любая помощь приветствуется.

Cache Client Updater Thread  on server Id=14397 in RUNNABLE (running in native)
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
- locked java.lang.Object@2f2e340
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
- locked sun.security.ssl.AppInputStream@1ce48525
at org.apache.geode.internal.cache.tier.sockets.Message.fetchHeader(Message.java:809)

]

1 Ответ

1 голос
/ 16 мая 2019

GemFire ​​не должен иметь проблем с обработкой 15K запросов в секунду / минуту (??).Не уверен, в каком измерении вы находитесь, но секунда / минута действительно не должны иметь значения.Это может потребовать некоторой настройки, но GemFire ​​должен быть в состоянии справиться с этим, будь то минуты или секунды.

Несколько вещей, о которых нужно подумать:

1) Во-первых, посмотрите здесь.

2) Разумеется, вы можете настроить обе стороны топологии клиент / сервер.

На клиенте вы можете использовать PoolFactory для настройки параметров, таких как соединения min / max, prSingleHopEnable, socketBufferSize, threadLocalConnections и т. д.

Используя Spring Session для Pivotal GemFire, этот Pool используется на клиенте (веб-приложение, GemFire ​​ClientCache) настраивается с использованием класса SDG ClientCacheFactoryBean при использовании GemFire ​​* DEFAULT Pool, который вы часто объявляете сами, например so или PoolFactoryBean класс, если вы используете определенный, «именованный» Pool с Spring Session для Pivotal GemFire, в этом случае он будет выглядеть примерно так ...

@SpringBootApplication
@EnableGemFireHttpSession(poolName = "SessionPool", ...)
class MySpringSessionGemFireClientApplication {


  @Bean("SessionPool")
  PoolFactoryBean sessionPool() {

    PoolFactoryBean sessionPool = new PoolFactoryBean();

    sessionPool.setMaxConnections(..);
    sessionPool.set...

    return sessionPool;
  }
}

На сервере,это действительно зависит от того, как вы запустили узлы (например, Gfsh , uпеть весна и т. д.).Но, по сути, все сводится к настройкам CacheServer.Например: loadPoolInterval, maxConnections, socketBufferSize, maxThreads и т. Д.

3) Я бы также сказал, что сначала нужно собрать информацию, чтобы определить, где может быть проблема, просматривая журналы сервера, статистику и т. Д. И т. Д.Эта информация должна быть рекомендована в пункте 1 выше.

4) Есть и другие факторы, о которых следует подумать, например, размер данных.

5) Есть вещи, которые вы должны рассмотреть с точки зрения сети.и добавление «контейнеров» добавляет целый другой уровень сложности, поэтому он будет зависеть от UC, архитектуры, инфраструктуры.

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

Не уверен, почему вы думаете, что дамп потока выше - "ошибка".Да, " Cache Client Updater Thread " удерживает блокировку объекта, однако поток также остается в состоянии RUNNABLE (в обслуживании).Тот факт, что этот поток удерживает блокировку, является проблемой только в том случае, если другой поток (1 или более) находится в состоянии ожидания или блокировки, ожидает этой блокировки и начинает использовать ресурсы или блокирует / ухудшает некоторые рабочие процессы приложения.

Я подозреваю, что у вас есть проблема между GemFire ​​и контейнером, но я не могу сказать это наверняка.

...