MaxConnectionsPerHost 与 MaxRequestsPerConnection Cassandra 驱动程序

MaxConnectionsPerHost vs MaxRequestsPerConnection Cassandra driver

我正在处理 C* 的大量查询集。我已经用

限制了异步查询执行器
Semaphore maxInFlight = new Semaphore(MAX_REQUEST_PER_CON_REMOTE);
...
maxInFlight.acquireUninterruptibly();
ResultSetFuture future = executeAsync(...);
Futures.addCallback(future, new FutureCallback<ResultSet>() {
     @Override
     public void onSuccess(ResultSet rs) {
     ...
     maxInFlight.release();
     }

     @Override
     public void onFailure(Throwable t) {
     ...
     maxInFlight.release();
     }, executor);

其中 MAX_REQUEST_PER_CON_REMOTE 是 MaxRequestsPerConnection 参数。 MaxConnectionsPerHos 默认等于 1,我没有更改它。

我相信,随着节点数量的增加或复制因子的增加,我可以增加 MaxConnectionsPerHos 或 MaxRequestsPerConnection 来提高生产率。 增加一个或那个有什么好处吗?

然后我想改变信号量许可的依赖性,但实际上不知道如何。这个想法是在添加或删除主机时添加侦听器并更新 maxInFlight。

如果您没有使用白名单或黑名单策略,那么驱动程序将分别连接到每个主机(当然取决于配置,如果您使用的是 DC 感知策略)。因此,当您添加新节点时,驱动程序将向该节点添加一个新连接,并且负载将被重新分配(如果您的查询没有 "hot" 分区)。如果你增加复制因子,那么它也没有多大关系,因为向副本发送请求不是由驱动程序完成的,而是由 "coordinator" 节点...

所以当你在本地DC有N个节点时,那么理论上你最多可以发送N * MaxInFlighConnections个请求(但这取决于你请求中数据的分布)。

此外,我看到您正在使用 MAX_REQUEST_PER_CON_REMOTE - 最好只向本地 DC 的节点发送请求。您还可以为每个连接配置最多 32k 个请求,在大多数情况下,这对于一个执行请求的客户端来说绰绰有余。

您可以在 Driver's documentation 中找到更多信息。

P.S。我有一个 separate class 与 Semaphore 使用相同的方法,但会自动添加侦听器 - 请随意使用它。