2017-08-27 66 views
1

我正在考虑使用cockroachdb以ACID保证的方式在第三范式中写入数据。所以所有的写作都会被转移到cockroachdb。CQRS与polyglot设置中的cockroachdb

这些读取可能都是基于rowkey到Cassandra的点查找。我相信这样的读取设置将消除对Redis缓存的需要,因为Cassandra会自行快速读取。所以Cassandra表将根据访问路径进行非规范化。

可能存在基于事件的同步插入/更新/删除内部cockroachdb规范化模式插入/更新/删除cassandra denormalzied模式。

问题1:

这是否读/写分离成适合使用cockroachdb有效的用例?其目的是减少连接并快速读取以及写入。蟑螂数据库也成为单一的事实源头,摄取事件源类数据。而像cassandra和elasticsearch这样的其他数据库就成为最终保持同步的查询投影。

问题2:

此安装配合,其中N报表需要进行自动完成的金融交易?根据我的理解,让我们假设在cockroachdb 3NF模式中有事务性地执行了N个SQL语句。在此之后,读取从Cassandra/ElasticSearch发生,由于同步延迟,这些读取将不会同步。在这种最终的一致性方案中,如果用户发送另一个命令以并行地从其他机器获得相同的结果,则将转到将在cockroachdb中查找的命令处理程序。我认为既然CockroachDb符合ACID标准,那么在查找cockroachdb后,在命令验证步骤期间,我们将确保无效命令。我相信这个cockroachdb会抛出乐观锁定异常,因为写入同一个表的一个事务已经在进行中。所以问题是 - 在这种情况下,我们是否应该阅读CockroachDB而不是Cassandra/ElasticSearch?

问题3

最后用例我脑子里想的是让cockroachdb起什么火花集群将做卡桑德拉相对于聚合作用。我们可以在cockroachdb中进行聚合,这个聚合包含所有的数据并存储在cassandra的预聚合表中。虽然ElasticSearch也能够进行聚合,但这里有个问题 - 这个用例是否听起来正确w.r.t使用cockroachdb而不是elasticsearch进行聚合?

回答

2

作为一般指导原则,我建议从零开始设计系统,而不是从如此复杂的体系结构开始。如果您从CockroachDB开始,将其作为您的“单一来源”,那么您可以单独使用CockroachDB多远?您是否有只能通过缓存层满足的性能要求?你需要一个单独的系统来进行汇总/报告吗?如果答案是“是”,那么然后你可以开始考虑这些组件应该采取什么形式。

可能存在基于事件的同步插入/更新/删除内部cockroachdb规范化模式插入/更新/删除cassandra denormalzied模式。

注意CockroachDB还没有以流更新到外部系统的好方法,所以这不会是容易的事情。

为了您的具体问题:

  1. 读缓存可以是一个有价值的除了一个系统,但同时也增加了很多复杂的,所以不要引进一个,直到你知道你需要它。您也可以在SQL数据库中对事物进行规范化处理,而像CockroachDB的interleaved tables等功能可以减少对非规范化的需求。

  2. 您只有在事务中转到CockroachDB的读取事务保证。这里的确切行为将取决于您的交易如何编写。例如,根据您的模式,两个“添加评论”事务可以同时应用而不会相互冲突。您可能需要通过提供适当的唯一ID或在事务开始时执行SELECT来防止出现这种情况,以确保数据库的状态符合您的预期。 (另外,不要对“乐观锁定例外”做出太多假设,CockroachDB的并发性是乐观和悲观模型的组合)

  3. 同样,这取决于。 ElasticSearch可以做很多CockroachDB无法做到的事情,而CockroachDB也没有做过多的预聚合。但是SQL是一种用于聚合和报告的非常灵活的语言,因此您可以在CockroachDB中执行所需的操作。

+0

感谢您的详细回复。我仍然有关于全文搜索的问题,请问cockroachdb中的当前选项是什么? – fortm

+0

CockroachDB目前没有任何种类的全文索引。它在[本期]中进行了追踪(https://github.com/cockroachdb/cockroach/issues/7821)。我们希望有一天能做到,但还没有安排。 –