Какая рекомендуемая конфигурация Redisson, чтобы избежать тайм-аутов при подключении к AWS Elasticache? - PullRequest
0 голосов
/ 31 октября 2018

Мы используем Redisson для подключения к реплицированному Redis на AWS эластичной с 1 главным и 2 узлами реплики.

Приложение использует несколько RLocalCachedMap с, Lock с и несколько тысяч Topics для отслеживания состояния пользователя. (Темы и подписки приходят и уходят, когда пользователи переходят в онлайн и офлайн).

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

Нагрузка на узлы AWS Elasticache всегда незначительна, наш сервер развернут на экземпляре AWS EC2, поэтому должен иметь относительно хорошие возможности подключения!

2 исключения, которые мы получаем по количеству, это либо взятие замков, либо подписка на темы:

Caused by: org.redisson.client.RedisTimeoutException: Subscribe timeout: (7500ms)
at org.redisson.command.CommandAsyncService.syncSubscription(CommandAsyncService.java:142) ~[redisson-3.8.2.jar!/:na]
at org.redisson.RedissonLock.lockInterruptibly(RedissonLock.java:149) ~[redisson-3.8.2.jar!/:na]
at org.redisson.RedissonLock.lockInterruptibly(RedissonLock.java:136) ~[redisson-3.8.2.jar!/:na]
at org.redisson.RedissonLock.lock(RedissonLock.java:118) ~[redisson-3.8.2.jar!/:na] 

и

java.util.concurrent.CompletionException: org.redisson.client.RedisTimeoutException
at org.redisson.misc.RedissonPromise.await(RedissonPromise.java:197) ~[redisson-3.8.2.jar!/:na]
at org.redisson.misc.RedissonPromise.await(RedissonPromise.java:206) ~[redisson-3.8.2.jar!/:na]
at org.redisson.command.CommandAsyncService.syncSubscription(CommandAsyncService.java:141) ~[redisson-3.8.2.jar!/:na]
at org.redisson.RedissonTopic.addListener(RedissonTopic.java:133) ~[redisson-3.8.2.jar!/:na]
at org.redisson.RedissonTopic.addListener(RedissonTopic.java:109) ~[redisson-3.8.2.jar!/:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_111]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_111]
at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_111]
Caused by: org.redisson.client.RedisTimeoutException: null
at org.redisson.pubsub.PublishSubscribeService$4.run(PublishSubscribeService.java:220) ~[redisson-3.8.2.jar!/:na]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:670) ~[netty-common-4.1.30.Final.jar!/:4.1.30.Final]
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:745) ~[netty-common-4.1.30.Final.jar!/:4.1.30.Final]
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:473) ~[netty-common-4.1.30.Final.jar!/:4.1.30.Final]

Наша конфигурация:

"subscriptionConnectionMinimumIdleSize":32,
"subscriptionConnectionPoolSize":128,
"slaveConnectionMinimumIdleSize":32,
"slaveConnectionPoolSize":128,
"masterConnectionMinimumIdleSize":64,         
"masterConnectionPoolSize":128,
"subscriptionsPerConnection": 1000,
"timeout": 3000,
"retryAttempts": 3,
"retryInterval": 1500,
"readMode": "SLAVE",
"subscriptionMode": MASTER

Я прочитал FAQ по Redisson по тайм-аутам, наши исключения тайм-аута явно не серверные или клиентские, поэтому не уверены, какой параметр тайм-аута лучше настроить, кроме того, учитывая, что они составляют 7,5 секунд, что довольно много для запросов пользователей на ждать Точно так же я не могу найти документацию по рекомендуемым значениям для размеров пула соединений или подписок на соединение и каковы были бы разумные значения для производственного развертывания.

...