Мы используем 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 секунд, что довольно много для запросов пользователей на ждать Точно так же я не могу найти документацию по рекомендуемым значениям для размеров пула соединений или подписок на соединение и каковы были бы разумные значения для производственного развертывания.