我正在寻找一个好的,最新的和“决定帮助”解释如何选择NoSQL数据库引擎来存储CQRS设计的应用程序中的所有事件。
我目前是NoSQL所有事物的新手(但是学习):请明确并且毫不犹豫地以(几乎太多)精确的方式解释你的观点。这篇文章可能值得像我这样的其他新人。
该数据库将:
SELECT * FROM events WHERE sequence_id > last_sequence_id
,以便订户(或队列系统)能够从给定点进行同步我听说过用于CQRS事件存储的HBase,但MongoDB可能适合吗?甚至Elasticsearch(不会打赌那个......)?我也对RDBMS持开放的一致性和可用性..但是分区容差部分呢?
真的我迷路了,我需要争论才能做出相应的选择。
https://geteventstore.com/是专为事件流设计的数据库。
他们非常重视事实来源(你的事件)的一致性和可靠性,我自己用它来读/写一秒钟的数千个事件。
我有qazxsw poi的qazxsw poi作为qazxsw poi。它被working, in production implementation + MongoDB
基于Event store
的应用程序使用。
为了提供100%无交易但类似事务的保证,一次性持续多个事件(所有事件或没有事件)我使用CQRS
作为Event sourcing
,事件为CRM
。如你所知,MongoDB document
有events commit
。
对于并发性,我使用乐观锁定,为每个nested documents
使用MongoDB
属性。 document level locking由dublet(version
x Aggregate steam
)识别。
事件存储还使用每个Aggregate stream
上的Aggregate class
以相对顺序存储提交,在每次提交时递增,使用乐观锁定进行保护。
每个Aggregate ID
包含以下内容:
sequence
,commit
列表,每个commit
包含GUID
和有效负载作为字符串(实际事件的序列化版本)。
EventWithMetadata
集合具有以下索引:
EventWithMetadata
,event class/type
,MongoDB
as aggregateId
aggregateClass
,version
unique
这些索引用于强制执行常规事件存储规则(没有为相同版本的events.eventClass
存储事件)和查询优化(客户端只能按类型从所有流中选择某些事件)。
你可以使用sequence
进行分片来缩放,如果你去除事件的全局排序(sequence
属性)并将你的责任转移到Aggregate
但是这会使aggregateId
需要保持同步(即使在失败的情况下!)时也会复杂化。 sequence
。我建议只在你需要时才这样做。
这个实现的基准(在event publisher
与event publisher
的event store
):
我注意到Intel I7
在8GB
上的事件数量很少。我不知道为什么,但我不在乎,因为我不需要这个功能。
我建议使用RAM
作为MongoDB
。
我有一个.NET核心事件采购实施项目counting
我从使用实体框架核心的关系数据库(SQL Server和MySQL)开始。然后转移到AWS,所以我写了一个DynamoDB扩展。
我的经验是,关系数据库可以完美地完成工作,但这取决于需求和技术堆栈。如果您的项目是基于云的,那么最佳选择可能是云提供商的无数据库数据库,如AWS DynamoDB或Azure CosmosDB,它们在proformance中功能强大并提供其他功能(例如DynamoDB可以触发通知或lambda函数)