Изменение топологии redis в Lettuce вызывает много ошибок OutOfMemoryErrors - PullRequest
0 голосов
/ 09 мая 2019

Я экспериментирую с добавлением нового узла redis в существующий кластер, когда мое приложение работает (в настоящее время выполняется тестирование производительности), и я получаю кучу "[io.netty.util.concurrent.DefaultPromise.rejectedExecution] [ main] Не удалось отправить задачу уведомления слушателя. Завершение цикла события?

java.lang.OutOfMemoryError java.lang.OutOfMemoryError: невозможно создать новую нить "ошибки.

Вот код для подключения к кластеру:

final List<RedisURI> redisServerSeeds = Lists.newArrayList();
    for(final HostAndPort redisServer: redisClusterServers) {
        final RedisURI redisUri = RedisURI.Builder
                .redis(redisServer.getHostText(), redisServer.getPort())
                .withPassword(mayBeRedisPwd.orElse(""))
                .build();
        redisServerSeeds.add(redisUri);
    }


    final ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
            .enablePeriodicRefresh(Duration.ofSeconds(60)) // Configuration for periodic refresh
            .enableAllAdaptiveRefreshTriggers()
            .adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30)) // Configuration for adaptive refresh
            .closeStaleConnections(true)
            .dynamicRefreshSources(true)
            .build();
    // Setup Redis Client
    final RedisClusterClient client = RedisClusterClient.create(redisServerSeeds);
    client.setOptions(ClusterClientOptions.builder()
            .topologyRefreshOptions(topologyRefreshOptions)
            .autoReconnect(true)
            .pingBeforeActivateConnection(true)
            .validateClusterNodeMembership(true)
            .build());

А вот код доступа к данным:

return asyncCommands.mget(keySet.toArray(new Long[0])).get( 5, TimeUnit.SECONDS ).stream().filter(keyValue -> keyValue.hasValue()). map(keyValue -> keyValue.getValue()).collect(Collectors.toSet());

Эти ошибки появляются только после масштабирования кластера redis. Что я делаю неправильно? Как избежать ошибок OOME при масштабировании кластера?

...