【问题标题】:How to run multiple queries in Scylla using "Non Atomic" Batch/Pipeline如何使用“非原子”批处理/管道在 Scylla 中运行多个查询
【发布时间】:2021-08-17 20:04:27
【问题描述】:

我知道 Scylla 允许这样的批处理语句。

BEGIN BATCH
<insert-stmt>/ <update-stmt>/ <delete-stmt>
APPLY BATCH

这些语句具有性能影响,因为它确保了原子性。但是,我只是有许多插入语句,我想在单个 IO 中从我的node 客户端执行这些语句。这些插入之间的原子性是不需要的。知道我该怎么做吗?什么都找不到。

【问题讨论】:

    标签: node.js cassandra datastax scylla


    【解决方案1】:

    在 Cassandra 世界中批量插入多个插入通常是一种反模式(除非它们进入一个分区,请参阅 docs)。当您在一个批次中将插入发送到多个分区时,协调节点将需要注意从该批次中获取数据并将它们发送到拥有数据的节点。这给协调节点增加了额外的负担,首先需要备份批处理的内容,以免在执行过程中崩溃时丢失,然后需要执行所有操作,等待执行结果再发送它返回给调用者(请参阅this diagram 以了解所谓的日志批处理是如何工作的)。

    当您不需要原子性时,最好的性能是发送多个并行插入,并等待它们的执行 - 它会更快,它会减少节点上的负载,并且驱动程序可以使用令牌感知负载平衡策略,因此请求将被发送到拥有数据的节点(如果您使用的是prepared statements)。在 node.js 中,您可以通过使用 Concurrent Execution API 来实现这一点 - 它的用法有多种变体,因此最好查看文档以选择最适合您的用例。

    【讨论】:

    • 嗨@Alex Ott,谢谢你..我想我现在明白了..但我面临的另一个问题是我的节点 IO 进程曾经由于大量的 IO 而急剧下降操作(大约 4k-5k IO 操作/秒)。我通过减少 IO 操作的数量来修复它。因此,我想做单个 IO 而不是并行 IO。
    • 您可以尝试将针对同一分区的多个插入合并到批次中,但这需要您进行额外的编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2021-07-11
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多