【问题标题】:Perform multiple inserts per POST request每个 POST 请求执行多次插入
【发布时间】:2021-07-21 21:00:21
【问题描述】:

我们有一个场景,在给定 id_1 的情况下,每个插入发生在 id_2,对于以下架构,在 Cassandra 中:

CREATE      TABLE  IF    NOT    EXISTS my_table (
  id_1                   UUID,
  id_2                   UUID,
  textDetails            TEXT,
  PRIMARY KEY (id_1, id_2)
);

单个 POST 请求正文包含多个 id_2 值的详细信息。这会在单个表上触发每个 POST 请求的多个插入。

每个 INSERT 查询执行如下所示:

insertQueryString = "INSERT INTO my_table (id_1, id_2, textDetails) " + "VALUES (?, ?, ?) IF NOT EXISTS"
    cassandra.Session.Query(insertQueryString, 
    id1,                            
    id2,        
    myTextDetails).Exec();

1

Cassandra 是否确保每个 POST 请求在单个表上多次插入的数据一致性?每个 POST 请求都在 Go-routine(线程)上处理。后续 GET 请求应确保检索到一致的数据(通过 POST 插入)

使用 BATCH 语句在暂存和生产中存在“批量太大”问题。 https://github.com/RBMHTechnology/eventuate/issues/166

2

我们有两个数据中心(用于 Cassandra),每个数据中心有 3 个副本节点。

写查询操作(POST请求)和就绪查询操作(GET请求)需要设置什么一致性级别,才能保证完全一致

【问题讨论】:

  • 我们为什么选择 Cassandra? 1)当设计适当的数据库架构时存在限制 2)由于数据不一致问题而无法执行数据库查询(根据需要).....是否仅适用于 RDBMS 不支持的分布式数据架构?

标签: database cassandra cql gocql


【解决方案1】:

这里有多个问题:

  • 应使用批处理very carefully in Cassandra - 仅当您将数据插入同一分区时。如果您将数据插入多个分区,那么最好使用并行执行的separate queries(但您可以为每个分区键收集多个条目并进行批处理)。
  • 你正在使用IF NOT EXISTS,它是针对同一个分区完成的——结果它会导致多个节点之间的冲突(参见lightweight transactions 上的文档),而且它需要从磁盘读取数据,因此会大大增加负载到节点上。但是你真的需要在行不存在时才插入数据吗?如果行已经存在,有什么问题?在进行 INSERT 时仅覆盖 Cassandra 中的数据会更容易,因为它不需要从磁盘读取数据。

关于一致性级别 - QUORUM(或 LWT 的 SERIAL)将为您提供强一致性,但代价是延迟增加(因为您需要等待另一个 DC 的回答),并且缺乏容错性 - 如果您输了另一个 DC,那么您的所有查询都将失败。在大多数情况下,LOCAL_QUORUM 就足够了(LWT 的情况下是 LOCAL_SERIAL),它会提供容错。我建议阅读this whitepaper,了解在 Cassandra 之上构建容错应用程序的最佳实践。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多