选择NoSQL数据库用于在CQRS设计的应用程序中存储事件

问题描述 投票:3回答:3

我正在寻找一个好的,最新的和“决定帮助”解释如何选择NoSQL数据库引擎来存储CQRS设计的应用程序中的所有事件。

我目前是NoSQL所有事物的新手(但是学习):请明确并且毫不犹豫地以(几乎太多)精确的方式解释你的观点。这篇文章可能值得像我这样的其他新人。

该数据库将:

  • 每个前视图询问的更新能够插入2到10行(在我的情况下,更新频繁)。想想每分钟有数千次更新,它会如何扩展?
  • 因为事件是应用程序真实性的来源,所以非常需要保持一致性和故障安全性
  • 实体之间不需要任何链接(比如RDBMS),除了用户ID / GUID(我不知道它是否关键或需要)
  • 接收包含3到10个“列”的事件(序列ID,事件名称,日期时间,JSON /二进制编码参数包,一些上下文信息......)。如果没有在面向列的数据库类型中定位您的观点,如果它适合所有其他要求,它可能是面向文档的
  • 用作队列或从外部AMQP系统发送/读取,如RabbitMQ或ZeroMQ(如果您还可以参数/解释那么,还没有工作那部分),因为视图投影将基于事件构建
  • 需要通过序列ID进行某种过滤,例如SELECT * FROM events WHERE sequence_id > last_sequence_id,以便订户(或队列系统)能够从给定点进行同步

我听说过用于CQRS事件存储的HBase,但MongoDB可能适合吗?甚至Elasticsearch(不会打赌那个......)?我也对RDBMS持开放的一致性和可用性..但是分区容差部分呢?

真的我迷路了,我需要争论才能做出相应的选择。

domain-driven-design cqrs consistency nosql
3个回答
2
投票

https://geteventstore.com/是专为事件流设计的数据库。

他们非常重视事实来源(你的事件)的一致性和可靠性,我自己用它来读/写一秒钟的数千个事件。


4
投票

我有qazxsw poi的qazxsw poi作为qazxsw poi。它被working, in production implementation + MongoDB基于Event store的应用程序使用。

为了提供100%无交易但类似事务的保证,一次性持续多个事件(所有事件或没有事件)我使用CQRS作为Event sourcing,事件为CRM。如你所知,MongoDB documentevents commit

对于并发性,我使用乐观锁定,为每个nested documents使用MongoDB属性。 document level locking由dublet(version x Aggregate steam)识别。

事件存储还使用每个Aggregate stream上的Aggregate class以相对顺序存储提交,在每次提交时递增,使用乐观锁定进行保护。

每个Aggregate ID包含以下内容:

  • aggregateId:string,可能是sequence
  • aggregateClass:string,
  • version:integer,对于每个aggregateId x aggregateClass递增,
  • 序列,整数,每次提交递增,
  • createdAt:UTCDateTime,
  • authenticatedUserId:string或null,
  • 事件:commit列表,

每个commit包含GUID和有效负载作为字符串(实际事件的序列化版本)。

EventWithMetadata集合具有以下索引:

  • EventWithMetadataevent class/typeMongoDB as aggregateId
  • aggregateClassversion
  • unique
  • 查询优化的其他索引

这些索引用于强制执行常规事件存储规则(没有为相同版本的events.eventClass存储事件)和查询优化(客户端只能按类型从所有流中选择某些事件)。

你可以使用sequence进行分片来缩放,如果你去除事件的全局排序(sequence属性)并将你的责任转移到Aggregate但是这会使aggregateId需要保持同步(即使在失败的情况下!)时也会复杂化。 sequence。我建议只在你需要时才这样做。

这个实现的基准(在event publisherevent publisherevent store):

  • 总聚合写入时间为:7.99,速度:每秒写入12516个事件
  • 总聚合读取时间为:1.43,速度:每秒读取35036个事件
  • 总读取模型读取时间为:3.26,速度:每秒读取30679个事件

我注意到Intel I78GB上的事件数量很少。我不知道为什么,但我不在乎,因为我不需要这个功能。

我建议使用RAM作为MongoDB


0
投票

我有一个.NET核心事件采购实施项目counting

我从使用实体框架核心的关系数据库(SQL Server和MySQL)开始。然后转移到AWS,所以我写了一个DynamoDB扩展。

我的经验是,关系数据库可以完美地完成工作,但这取决于需求和技术堆栈。如果您的项目是基于云的,那么最佳选择可能是云提供商的无数据库数据库,如AWS DynamoDB或Azure CosmosDB,它们在proformance中功能强大并提供其他功能(例如DynamoDB可以触发通知或lambda函数)

© www.soinside.com 2019 - 2024. All rights reserved.