Tôi có ứng dụng Spring Boot kết nối với cụm Redis, sử dụng Jedis Connection Factory:
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisProperties.getCluster().getNodes());
redisClusterConfiguration.setPassword(redisProperties.getPassword());
jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration);
và đọc danh sách các nút từ application.yml:
spring:
redis:
host: 127.0.0.1
port: 6379
timeout: 300s
cluster:
nodes: 127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382
Bây giờ chúng tôi muốn chuyển sang Elasticache vì chúng tôi sẽ lưu trữ cụm Redis của chúng tôi trên AWS. Nó sẽ được thực hiện khá dễ dàng. Nếu lib AmazonElastiCache có thể được sử dụng. Sau đó, chúng tôi chỉ có thể kết nối với cụm đàn hồi với thông tin xác thực AWS, kéo các nút có sẵn đưa nó vào danh sách và chuyển nó đến Jedis thay vì mã hóa chúng trong application.yml, như:
//get cache cluster nodes using AWS api
private List<String> getClusterNodes(){
AmazonElastiCache client = AmazonElastiCacheClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
DescribeCacheClustersRequest describeCacheClustersRequest = new DescribeCacheClustersRequest();
describeCacheClustersRequest.setShowCacheNodeInfo(true);
List<CacheCluster> cacheClusterList = client.describeCacheClusters(describeCacheClustersRequest).getCacheClusters();
List<String> nodeList = new ArrayList<>();
try {
for (CacheCluster cacheCluster : cacheClusterList) {
for(CacheNode cacheNode :cacheCluster.getCacheNodes()) {
String nodeAddr = cacheNode.getEndpoint().getAddress() + ":" +cacheNode.getEndpoint().getPort();
nodeList.add(nodeAddr);
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return nodeList;
}
Nhưng nhóm DevOps nói rằng họ không thể định cấu hình quyền truy cập AWS trên tất cả các phòng thí nghiệm và họ có lý do cho việc này. Ngoài ra, thay vì kết nối với AWS và kéo tất cả các cụm có sẵn, chúng tôi cần kết nối với một cụm cụ thể bằng URL.
Vì vậy, tôi đã cố gắng chuyển trực tiếp url của cụm Elasticache cho Jedis dưới dạng độc lập và dưới dạng cụm trong cấu hình application.yml. Trong cả hai trường hợp, kết nối được thiết lập, nhưng khi Ứng dụng cố gắng ghi vào Elasticache, nó sẽ bị ngoại lệ MOVED:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.data.redis.ClusterRedirectException: Redirect: slot 1209 to 10.10.10.011:6379.; nested exception is redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 1209 10.10.10.102:6379
Theo như tôi hiểu có nghĩa là Ứng dụng đã cố ghi vào một trong các nút trong Elasticache, nhưng không thể kết nối.
Vì vậy, câu hỏi đặt ra là có cách nào để kết nối với cụm Elasticache Redis từ ứng dụng Spring Boot chỉ bằng URL cụm Elasticache không?
Tôi biết rằng nó có thể thực hiện được nếu sử dụng Elasticache Memecache. Ngoài ra trình điều khiển Jedis không phải là một yêu cầu khó khăn.
Cảm ơn bạn.