Cassandra read_request_timeout_in_ms 为外部(客户端)请求设置
Cassandra read_request_timeout_in_ms set up for external(Client) request
根据文档和 Internet 上给定的知识。似乎下面给出的属性
- request_timeout_in_ms
- write_request_timeout_in_ms
- read_request_timeout_in_ms
仅适用于内部(服务器端)Cassandra 请求。当我将 cassandra.yaml
文件中的这些参数设置为 80000
时,我什至确信这一事实,但仍然通过以下两种方式对我的 Select 查询中的超时错误查询到更大的记录:
1) 当我尝试在没有附加参数的情况下通过 cqlsh 连接到 Cassandra 时 --request-timeout=80000
。通过添加此参数,我能够成功 运行 select 上次失败的声明。
2) 当我尝试使用 Cassandra 驱动程序通过 java 客户端更新相同的记录时,没有在 Cluster.Builder
创建中设置 new SocketOptions().setReadTimeoutMillis(80000)
。
问题:
有没有办法将这些 request_timeout 参数设置为 Cassandra 以用于外部(客户端)请求(因此我不必在通过 Cqlsh 或 javaclient 或 DataStax 的 DevCenter 连接时提及这些值)?
服务器也不能真正强制执行客户端超时,因为服务器外部会发生延迟。一个例子是 linux 内核在发送请求时引入的延迟,然后是 300 毫秒的跨 DC 延迟尖峰,您的客户端在应用程序发送请求后 500 毫秒收到请求。
更糟糕的是 GC,即 C* 发送响应,但随后有 2 秒的 STW gc 暂停。从服务器的角度来看,请求已 "completed" 但客户端将有额外的 2 秒延迟。如果您的服务器配置不当,您可以很容易地定期看到 8 秒的 GC。服务器端的超时是最好的,因为它可以处理超出其控制范围的给定不可知(或至少不可知)因素。如果您有严格的超时,最好在客户端处理它。我建议在您的请求处理程序中执行此操作。
ListenableFuture result = Futures.withTimeout(session.executeAsync(/*statement*/),
8, TimeUnit.SECONDS, executor)
setReadTimeoutMillis
有点细微差别,它是每个请求,但 execute/executeAsync
最终可能是多个请求,因为它可能会尝试多个主机作为查询计划的一部分 (retry/speculative重试)。因此,例如 LOCAL_ONE 上 setReadTimeoutMillis
为 2 的 RF=3 请求实际上可能需要 6 秒才能超时,具体取决于重试策略。
根据文档和 Internet 上给定的知识。似乎下面给出的属性
- request_timeout_in_ms
- write_request_timeout_in_ms
- read_request_timeout_in_ms
仅适用于内部(服务器端)Cassandra 请求。当我将 cassandra.yaml
文件中的这些参数设置为 80000
时,我什至确信这一事实,但仍然通过以下两种方式对我的 Select 查询中的超时错误查询到更大的记录:
1) 当我尝试在没有附加参数的情况下通过 cqlsh 连接到 Cassandra 时 --request-timeout=80000
。通过添加此参数,我能够成功 运行 select 上次失败的声明。
2) 当我尝试使用 Cassandra 驱动程序通过 java 客户端更新相同的记录时,没有在 Cluster.Builder
创建中设置 new SocketOptions().setReadTimeoutMillis(80000)
。
问题:
有没有办法将这些 request_timeout 参数设置为 Cassandra 以用于外部(客户端)请求(因此我不必在通过 Cqlsh 或 javaclient 或 DataStax 的 DevCenter 连接时提及这些值)?
服务器也不能真正强制执行客户端超时,因为服务器外部会发生延迟。一个例子是 linux 内核在发送请求时引入的延迟,然后是 300 毫秒的跨 DC 延迟尖峰,您的客户端在应用程序发送请求后 500 毫秒收到请求。
更糟糕的是 GC,即 C* 发送响应,但随后有 2 秒的 STW gc 暂停。从服务器的角度来看,请求已 "completed" 但客户端将有额外的 2 秒延迟。如果您的服务器配置不当,您可以很容易地定期看到 8 秒的 GC。服务器端的超时是最好的,因为它可以处理超出其控制范围的给定不可知(或至少不可知)因素。如果您有严格的超时,最好在客户端处理它。我建议在您的请求处理程序中执行此操作。
ListenableFuture result = Futures.withTimeout(session.executeAsync(/*statement*/),
8, TimeUnit.SECONDS, executor)
setReadTimeoutMillis
有点细微差别,它是每个请求,但 execute/executeAsync
最终可能是多个请求,因为它可能会尝试多个主机作为查询计划的一部分 (retry/speculative重试)。因此,例如 LOCAL_ONE 上 setReadTimeoutMillis
为 2 的 RF=3 请求实际上可能需要 6 秒才能超时,具体取决于重试策略。