当前位置: 首页 > 知识库问答 >
问题:

在datastax java驱动程序中Cassandra如何处理阻塞执行语句

皮弘博
2023-03-14
public ResultSet execute(Statement statement);

从com.datastax.driver.core.session非阻塞执行fethod

public ResultSetFuture executeAsync(Statement statement);

此方法不会阻塞。一旦查询传递到基础网络堆栈,它将立即返回。特别是,从此方法返回并不能保证查询是有效的,甚至不能保证查询已经提交到活动节点。访问{@link ResultSetFuture}时,将引发与查询失败有关的任何异常。

我有02个关于它们的问题,因此如果你能帮助我理解它们将是非常好的。

共有1个答案

壤驷瑾瑜
2023-03-14

如果我有n个线程,那么所有线程将拥有它们需要发送到数据库的相同数量的记录。它们都继续使用阻塞执行调用向cassandra发送多个insert查询。如果我增加n的值,是否也有助于加快将所有记录插入Cassandra所需的时间?

在某种程度上。让我们稍微脱离客户端实现的细节,从“并发请求的数量”的角度来看问题,因为如果使用ExecuteAsync,不需要为每个正在进行的请求设置线程。在我的测试中,我发现,虽然拥有大量并发请求有很大的价值,但存在一个阈值,在该阈值下,收益递减或性能开始下降。我的一般经验法则是(节点数*native_transport_max_threads(默认值:128)*2),但或多或少可以找到更优的结果。

这里的想法是,将比cassandra一次处理的更多的请求排队没有太大的价值。在减少飞行请求数量的同时,限制了驱动程序客户端和Cassandra之间连接的不必要拥塞。

通过get等待ResultSetFuture是一个途径,但是如果您正在开发一个完全异步的应用程序,您希望尽可能避免阻塞。使用番石榴,您最好的两个武器是futures.addcallbackfutures.transform

>

  • futures.addcallback允许您注册一个futurecallback,当驱动程序收到响应时执行该函数。onsuccess在成功案例中执行,否则onfailure执行。

    futures.transform允许您有效地将返回的resultsetfuture映射到其他内容。例如,如果您只想要1列的值,则可以使用它将ListenableFuture 转换为ListenableFuture ,而不必阻塞ResultSetFuture上的代码,然后获取字符串值。

    在编写dataloader程序的上下文中,可以执行以下操作:

    1. 为了简单起见,使用信号量或具有固定数量许可的其他构造(这将是飞行请求的最大数量)。无论何时使用ExecuteAsync提交查询,都要获得许可。您实际上应该只需要1个线程(但可能需要引入一个#cpu核大小的池来实现这一点),它从信号量中获取许可并执行查询。它只会阻止获取,直到有可用的许可。
    2. 对从executeAsync返回的future使用futures.addcallback。在onsuccessonfailure的情况下,回调应该调用sempahore.release()。通过释放许可,这将允许步骤1中的线程继续并提交下一个请求。

    为了进一步提高吞吐量,您可能需要考虑使用BatchStatement并分批提交请求。这是一个很好的选择,如果您的批处理保持较小(50-250是一个好数字),如果您在一个批中的插入都共享相同的分区键。

  •  类似资料:
    • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

    • 我使用python脚本,它传递给卡桑德拉批处理查询,如下所示: 这是一段时间的工作,但在启动脚本失败并打印后约2分钟内: 我将超时从 更改为: read_request_timeout_in_ms:15000 range_request_timeout_in_ms:20000 write_request_timeout_in_ms:20000 cas_contention_timeout_in_m

    • null null 为了进行简单的开发,我使用在独立集群模式下(8个工作者、20个内核、45.3G内存)执行了我的Python代码。现在我想为性能调优设置执行器内存或驱动程序内存。 在Spark文档中,执行器内存的定义是 每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512M、2G)。

    • Vext.x核心手册建议使用< code>executeBlocking()执行阻塞代码,以防止事件循环被阻塞。尽管如此,它还指出: 阻止代码 [] 应阻止合理的时间(即不超过几秒钟)。长阻塞操作...被排除在外。当阻止操作持续超过10秒时,将在控制台上打印一条消息[...]。长阻塞操作应使用由应用程序管理的专用线程,该线程可以使用事件总线或 runOnContext 与顶点进行交互 所以我不能在

    • 问题内容: 我有一棵divs树: 在div上单击时,将使其子级不可见-即单击“ a”将使“ b”和“ c”不可见。 问题是:单击“ b”将调用“ a”的单击,并使“ b”和“ c”不可见。如何使用jQuery禁用对“ a”的点击? 谢谢 问题答案: 您可以为孩子添加一个处理程序,以防止click事件蔓延: 这样一来,点击不会传播到。都不会单击以转到,因此也不会。

    • 在我的用例中,我有一个带有Reactor Netty的Spring Webflux微服务,我有以下依赖项: null 由于(版本0.7.6版)已包含在最新的(版本2.0.1版)中,因此不能再使用:,请参阅->https://github.com/reactor/reactor-netty/issues/312 我的代码段: 这适用于版本2.0.0.release,但由于升级到版本2.0.1.rel