gpt4 book ai didi

nosql - CQRS 数据存储方式 Nosql 或 Sql Server

转载 作者:行者123 更新时间:2023-12-03 23:32:04 25 4
gpt4 key购买 nike

我正在经历一个新项目的研究阶段,目前我正在与一位同事就该项目的架构进行辩论。

我们已经同意我们将使用 CQRS 和 azure 的事件源创建一个分布式消息传递系统。它将是一个前端使用 angular js 的 SPA,后端将是 Web API。

我们现在已经讨论了如何设置数据库,这就是发生差异的地方。

我们已经同意将数据库拆分为两个数据库,一个用于读取和写入。
我的同事想将 sql server 用于读写数据库,因为他的整个职业生涯都在 sql 中度过,除了 sql 什么都不想听。
另一方面,我一直在研究 NoSql,我觉得它适用于读取数据库,因为它的性能更好。

由于 CQRS 是关于最终一致性的,我已经读到 NoSql 数据库也基于此,这让我现在考虑将 NoSql 也用于写入数据库。

我们还计划为每个聚合根创建一个事件表,而不是一个包含所有事件的通用事件表。
由于这些表不是关系表,这让我想到为什么我们应该使用 sql server。

我的问题更多是关于人们如何创建事件商店的最佳实践或一般方法。

  • 您是为所有事件使用一个表还是为每个聚合根创建一个事件表?
  • 将 NoSql 数据库用于 CQRS 应用程序的写入和读取数据库的优点/缺点是什么?
  • 最后但并非最不重要的一点是,您将如何说服一个与 Sql 结婚的顽固的工作同事转换为 NoSql 方法?
  • 最佳答案

    注:下面我的回答是从 2014 年开始的。时代变了,现在有几个 NoSQL 数据库支持多文档事务。我仍然提倡使用 PostgreSQL 来存储事件,特别是因为它出色的 JSON 支持。

    最后一个问题主要是基于意见的,所以让我们从我的角度回答前两个问题。

    在这样做之前,让我说我们正在为我们的事件存储使用 SQL 服务器 (Postgres)。使用 CQRS+ES,让一个主要的 master 用于写入数据库,从从属读取存储库(不要与 CQRS 读取混淆)是微不足道的。在这个设置中,可扩展性应该不是问题(如果 Reddit 可以在主/从中 scale with Postgres,那么你也可以)。

    我对 NoSQL 存储的各种选项进行了广泛的评估。归根结底,对于 CQRS+ES 设置,我找不到与主/从模式下的 SQL 方法相比的任何优势,IMO 将超过您使用 NoSQL 数据库将获得的劣势。

    特别是,在 SQL 存储中实现乐观锁定是微不足道的(对 streamId 和版本字段的唯一约束),但在简单的 NoSQL 键值存储中实现可靠的乐观锁定非常困难(不可能?)。

    使用某些文档存储是可能的(我认为 NEventStore 仅支持 RavenDB 和 MongoDB 是有原因的。):

  • RavenDB 支持 ACID 事务,但您必须使用/部署 .NET,这对某些人(包括我们)来说不是一个选择。
  • MongoDB 具有您需要的服务器端原子操作
    将事件附加到事件流并提高版本
    原子操作中的数字,但存在一些技术限制(特别是
    最大文档大小),让我远离 MongoDB 作为
    事件商店。另外,我已经阅读了 this article在 InfoQ 上关于
    分区容忍度,而 Postgres 似乎要多得多
    比MongoDB可靠。

  • 在 Postgres 中,我为所有事件使用一个单一的事件表。

    至于第二个问题,我觉得你要区分事件存储和读取模型。我们将 SQL 服务器用于事件存储(出于上述原因),但对于 CQRS 读取模型,我认为 NoSQL“数据库”非常适合,因为最终一致性方法非常适合 NoSQL 范式。此外,人们通常只能通过键来查询读取,因此您可以使用任何您喜欢并满足您需求的键值存储。我们甚至根本不使用数据库,而是使用按需重建的内存网格。

    关于nosql - CQRS 数据存储方式 Nosql 或 Sql Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974646/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com