数据存储区/ BigTable ACID和密钥更新通知

时间:2018-01-25 17:42:33

标签: apache-kafka google-cloud-platform google-cloud-datastore google-cloud-bigtable

我已经获得了Kafka主题,其中包含以下命令的目录数据:

  1. item_upsert
  2. partial_item_update
  3. delete_item
  4. DELETE_ALL
  5. 现在我需要使用这个主题,可能流式传输100k msgs / sec,到一些数据库,这将帮助我将原始命令流转换为项状态流。因此,DB中只有当前的项状态。基本上DB将用于查找。

    我的想法是:

    1. 在数据存储中插入/更新/删除项目,
    2. 处理完特定邮件后,我会向另一个流发送新邮件,告知下游消费者某些项目已插入/已更新/已删除。这些消费者随后将从数据存储中读取项目的当前状态并将项目状态提取到另一个Kafka主题。
    3. 我担心的是数据存储区的ACID。怎么" ACID"是吗?它甚至适合这种用例吗?

      我也在考虑使用更便宜的BigTable,但对于这个用例来说,这似乎不是正确的选择。

      如果您有任何想法/建议如何解决此问题,我会很高兴。

2 个答案:

答案 0 :(得分:1)

Bigtable可以使用10节点集群处理100K的速率(我已经运行了多达3,500个节点的测试,每秒处理35M更新)。 Bigtable对单行upserts具有很强的一致性。 Bigtable用户设计的模式将所有事务数据整合到一行中。

Cloud Bigtable支持upserts,并且insertupdate之间没有区别。还有一个范围删除,理论上可以用于delete_all案例。

高交易率和低成本是使用Cloud Bigtable的正确理由。或者,您可以考虑使用Cloud Spanner,它适用于高吞吐量的事务数据。

答案 1 :(得分:0)

首先关注的是消息率。数据存储不能维持每个实体组写入速率超过1 /秒(每个实体是实体组的一部分),请参阅Limits。因此,如果您希望每秒有多个项目/实体更新,则数据存储区不适用。

要使用Cloud Datastore实现ACID,您需要避免Eventual Consistency。这是可能的。 From Eventual Consistency when Reading Entity Values

  

可以避免读取实体值的最终一致性   使用仅键查询,祖先查询或按键查找(   get()方法)。我们将讨论这些不同类型的查询   更深入。

我会抛弃祖先查询作为一种可能性,因为它会要求所有相应的实体都在同一个实体组中,从而放大了上述写入限制的影响。另请参阅Updates to a single entity group

棘手的部分是upsert操作,更具体地说是创建新实体和更新/删除现有实体之间的区别。

如果您无法始终从商​​品数据中生成/确定唯一商品标识符(或传递前一阶段确定的商品标识符),那么这意味着您需要一个查询,该查询可以在事务中执行,其结果将受最终一致性的影响。在这种情况下,数据存储区也不适合。

但是如果可以获得这样的唯一标识符,那么您可以将其用作实体密钥标识符并且事情很简单:upsert操作变为通过该密钥对get实体进行简单的事务性尝试(强烈一致)和(在同一交易中):

  • 如果get因未存在的代码而失败,则使用该密钥创建新实体
  • 如果get成功更新实体并将其保存回来