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 秒才能超时,具体取决于重试策略。