我已经获得了Kafka主题,其中包含以下命令的目录数据:
现在我需要使用这个主题,可能流式传输100k msgs / sec,到一些数据库,这将帮助我将原始命令流转换为项状态流。因此,DB中只有当前的项状态。基本上DB将用于查找。
我的想法是:
我担心的是数据存储区的ACID。怎么" ACID"是吗?它甚至适合这种用例吗?
我也在考虑使用更便宜的BigTable,但对于这个用例来说,这似乎不是正确的选择。
如果您有任何想法/建议如何解决此问题,我会很高兴。
答案 0 :(得分:1)
Bigtable可以使用10节点集群处理100K的速率(我已经运行了多达3,500个节点的测试,每秒处理35M更新)。 Bigtable对单行upserts
具有很强的一致性。 Bigtable用户设计的模式将所有事务数据整合到一行中。
Cloud Bigtable支持upserts
,并且insert
和update
之间没有区别。还有一个范围删除,理论上可以用于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
成功更新实体并将其保存回来