From e7709609927dadd110bf567f4ef54115ac535239 Mon Sep 17 00:00:00 2001 From: Burak Karahan Date: Fri, 30 Aug 2024 13:28:53 -0400 Subject: [PATCH] TCVP-3037: Added functionality to enable adaptive topology refreshing for Redis through 'ClusterTopologyRefreshOptions' in Lettuce to configure topology refreshing based on certain triggers such as 'moved redirect' and 'cannot reconnect' --- src/backend/oracle-data-api/pom.xml | 4 ++++ .../tco/oracledataapi/config/RedisConfig.java | 23 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/backend/oracle-data-api/pom.xml b/src/backend/oracle-data-api/pom.xml index e2f8ff26b..a80a4f022 100644 --- a/src/backend/oracle-data-api/pom.xml +++ b/src/backend/oracle-data-api/pom.xml @@ -86,6 +86,10 @@ org.springframework.boot spring-boot-starter-data-redis + + io.lettuce + lettuce-core + diff --git a/src/backend/oracle-data-api/src/main/java/ca/bc/gov/open/jag/tco/oracledataapi/config/RedisConfig.java b/src/backend/oracle-data-api/src/main/java/ca/bc/gov/open/jag/tco/oracledataapi/config/RedisConfig.java index d5e9c9bf2..cb5836ba6 100644 --- a/src/backend/oracle-data-api/src/main/java/ca/bc/gov/open/jag/tco/oracledataapi/config/RedisConfig.java +++ b/src/backend/oracle-data-api/src/main/java/ca/bc/gov/open/jag/tco/oracledataapi/config/RedisConfig.java @@ -1,5 +1,7 @@ package ca.bc.gov.open.jag.tco.oracledataapi.config; +import java.time.Duration; + import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,9 +11,13 @@ import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.util.CollectionUtils; +import io.lettuce.core.cluster.ClusterClientOptions; +import io.lettuce.core.cluster.ClusterTopologyRefreshOptions; + @Configuration public class RedisConfig { @@ -45,7 +51,22 @@ else if (redisProperties.getCluster() != null && !CollectionUtils.isEmpty(redisP if(redisProperties.getCluster().getMaxRedirects() != null) config.setMaxRedirects(redisProperties.getCluster().getMaxRedirects()); - return new LettuceConnectionFactory(config); + // Enable adaptive topology refreshing + ClusterClientOptions clientOptions = ClusterClientOptions.builder() + .topologyRefreshOptions(ClusterTopologyRefreshOptions.builder() + // The MOVED_REDIRECT trigger causes a topology refresh when the client receives a MOVED redirect from a Redis server. + // The PERSISTENT_RECONNECTS trigger causes a topology refresh when the client cannot reconnect to a Redis server for a certain period of time. + .enableAdaptiveRefreshTrigger(ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT, ClusterTopologyRefreshOptions.RefreshTrigger.PERSISTENT_RECONNECTS) + // If a topology refresh is triggered, the client will wait for this period of time before triggering another topology refresh. + .adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30)) // default is 30 seconds + .build()) + .build(); + + LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() + .clientOptions(clientOptions) + .build(); + + return new LettuceConnectionFactory(config, clientConfig); } // Standalone mode (for local development) else {