java - Lettuce Redis 客户端:SocketOptions 中的 connectTimeout 和 RedisClusterClient 中的 defaultTimeout 的区别
问题描述
我的应用程序使用 Lettuce Redis 客户端连接到 AWS Elasticache。我正在尝试遵循本指南来提高我的服务弹性。建议的要点之一是关于套接字超时:
确保客户端的套接字超时设置为至少一秒(相对于几个客户端中典型的“无”默认值)。当服务器负载很高时,将超时设置得太低可能会导致大量超时。将其设置得太高可能会导致您的应用程序需要很长时间才能检测到连接问题。
我如何创建连接的伪代码是:
RedisClusterClient redisClusterClient = RedisClusterClient.create(clientResources, redisUrl);
// Topology refresh and periodic refresh
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.enablePeriodicRefresh(true)
.enableAllAdaptiveRefreshTriggers()
.build();
// Update cluster topology periodically
redisClient.setOptions(ClusterClientOptions.builder()
.topologyRefreshOptions(topologyRefreshOptions)
.build());
StatefulRedisClusterConnection connection = redisClusterClient.connect(new ByteArrayCodec());
我正在浏览生菜文档,发现有两个可用的超时选项:
- 在 SocketOptions 中使用 connectTimeout 字段
- 在 RedisClusterClient 中使用 defaultTimeout 字段
如果有人可以帮助我了解两者之间的区别以及哪一个更适合我的用例,我将不胜感激。
编辑:这是我到目前为止所尝试的:
我尝试一次使用两者SocketOptions
和deafultTimeout()
一个并进行了一些测试。
这是我所做的: 测试用例 1
- 设置
connectTimeout
为SocketOptions
1s 并使用方法更新redisClient
对象。setOptions()
- 使用Litmuschaos将 >1 秒的延迟添加到对 AWS Elasticache 的调用中。
- 使用Elasticache 故障转移 API关闭 redis 集群中的一个节点。
测试用例 2
- 设置
defaultTimeout
为redisClient
1s。 - 使用Litmuschaos将 >1 秒的延迟添加到对 AWS Elasticache 的调用中。
- 使用Elasticache 故障转移 API关闭 redis 集群中的一个节点。
观察(对于两个 TC):
- 生菜日志表明它无法连接到被关闭的节点(这是意料之中的,因为 AWS 仍在更换它的过程中)。
- 一旦 redis 节点在 AWS EC 中启动,Lettuce 日志显示它能够成功地重新连接到该节点(这是出乎意料的,因为我已经在对 AWS EC 的调用中增加了延迟)。
我在这里缺少一些配置吗?
解决方案
推荐阅读
- php - 通过 http 从 PHP 到 Angular 6 的二进制数据
- kotlin - 如何处理kotlin中的多态性
- android - 我的应用程序屏幕在物理设备上显示错误
- graphql - Apollo / GraphQL 具有不同参数的相同查询
- node.js - Passport.authenticate 不在 Node/MongoDB 应用程序中调用
- excel - 更改数据透视图的标题
- javascript - 使用语言环境解析时日期无效
- javascript - 解压缩文件并以角度将内容上传到Firestore后如何调用函数?
- c++ - 当状态发生变化时,是否有 QML 元素来通知辅助功能树?
- many-to-many - 谁能解释为什么我的数据库是一对一、一对多、多对一或多对多的?