标签: event-sourcing

使用Kafka作为(CQRS)Eventstore.好主意?

虽然我之前遇到过Kafka,但我最近才意识到Kafka可能会被用作CQRS,eventstore(的基础).

Kafka支持的要点之一:

  • 事件捕获/存储,当然都是HA.
  • 发布/子结构
  • 能够重放事件日志,允许新订户在事后注册系统.

诚然,我不是100%精通CQRS /事件采购,但这看起来非常接近eventstore应该是什么.有趣的是:我真的找不到关于Kafka被用作事件存储的那么多,所以也许我必须遗漏一些东西.

那么,卡夫卡缺少什么东西才能成为一个好的活动商店?会有用吗?用它生产?对洞察力,链接等感兴趣

基本上,系统的状态是根据系统收到的事务/事件保存的,而不是仅仅保存系统的当前状态/快照,这是通常所做的.(将其视为会计总帐:所有交易最终都会累加到最终状态)这允许各种很酷的事情,但只需阅读所提供的链接.

cqrs event-sourcing dddd apache-kafka

200
推荐指数
6
解决办法
5万
查看次数

使用RDBMS作为事件源存储

如果我使用RDBMS(例如SQL Server)来存储事件源数据,架构可能是什么样的?

我从抽象的意义上看到了一些变化,但没有具体的.

例如,假设有一个"产品"实体,对该产品的更改可以采用以下形式:价格,成本和描述.我很困惑我是否:

  1. 有一个"ProductEvent"表,其中包含产品的所有字段,其中每个更改表示该表中的新记录,以及"适当的人员,内容,地点,原因,时间和方式".当成本,价格或描述发生变化时,会添加一个全新行来表示产品.
  2. 将产品成本,价格和描述存储在使用外键关系连接到Product表的单独表中.当发生对这些属性的更改时,请根据需要使用WWWWWH写入新行.
  3. 在"ProductEvent"表中存储WWWWWH以及表示事件的序列化对象,这意味着必须在我的应用程序代码中加载,反序列化并重新播放事件本身,以便为给定产品重新构建应用程序状态.

特别是我担心上面的选项2.极端情况下,产品表几乎是每个表一个表,在这里加载给定产品的应用程序状态需要从每个产品事件表加载该产品的所有事件.这桌爆炸对我来说有点不对劲.

我确信"这取决于",虽然没有单一的"正确答案",但我试图了解可接受的内容,以及完全不可接受的内容.我也知道NoSQL可以在这里提供帮助,其中事件可以存储在聚合根目录中,这意味着只有一个请求数据库来获取事件来重建对象,但是我们没有使用NoSQL数据库.那一刻,所以我在寻找替代品.

cqrs event-sourcing

107
推荐指数
2
解决办法
3万
查看次数

CQRS事件采购:验证UserName唯一性

我们来看一个简单的"帐户注册"示例,这里是流程:

  • 用户访问网站
  • 点击"注册"按钮并填写表格,点击"保存"按钮
  • MVC控制器:通过从ReadModel读取来验证UserName的唯一性
  • RegisterCommand:再次验证UserName唯一性(这是问题)

当然,我们可以通过读取MVC控制器中的ReadModel来验证UserName的唯一性,以提高性能和用户体验.但是,我们仍然需要在RegisterCommand中再次验证唯一性,显然,我们不应该在命令中访问ReadModel.

如果我们不使用Event Sourcing,我们可以查询域模型,这样就没问题了.但是如果我们使用Event Sourcing,我们无法查询域模型,那么我们如何验证RegisterCommand中的UserName唯一性?

注意: User类具有Id属性,UserName不是User类的键属性.在使用事件源时,我们只能通过Id获取域对象.

顺便说一句:在要求中,如果已经输入了UserName,则网站应向访问者显示错误消息"抱歉,用户名XXX不可用".显示一条消息是不可接受的,例如"我们正在创建您的帐户,请稍后,我们会通过电子邮件将注册结果发送给您"给访问者.

有任何想法吗?非常感谢!

[UPDATE]

一个更复杂的例子:

需求:

下订单时,系统应该检查客户的订购历史,如果他是一个有价值的客户(如果客户在去年每月至少订购10个订单,他是有价值的),我们会在订单上减价10%.

执行:

我们创建PlaceOrderCommand,在命令中,我们需要查询订购历史记录以查看客户端是否有价值.但是我们怎么能这样做呢?我们不应该在命令中访问ReadModel!正如Mikael 所说,我们可以在帐户注册示例中使用补偿命令,但如果我们在此订购示例中也使用补偿命令,那么它将太复杂,并且代码可能难以维护.

domain-driven-design unique cqrs event-sourcing

69
推荐指数
6
解决办法
1万
查看次数

EventStore与MongoDb

我想知道使用EventStore有什么好处(http://geteventstore.com)比在MongoDb中自己实现事件采购.

我问的原因是,我们公司有很多人每天与MongoDb合作.但它们不适用于Event Sourcing.虽然他们并没有完全关注这个主题,但他们也不打算在任何地方开始实施.

我即将开始一个非常适合Event Sourcing的项目.大约有16个定义明确的事件,大约有7个定义明确的预测.我说"关于"因为我知道一旦他们看到产品在使用中就会有更多的预测和事件需求.

这种方法将首先是API,我们组织的其他部分将使用REST Api.

虽然我已经按照Greg Young定义的方式阅读了很多关于事件采购的内容,但我从未实际实施过Event Sourcing解决方案.

这是一个绿色的田野项目.没有技术限制,因为我们将把所有内容公开为REST接口.因此,如果有人有使用MongoDb的EvenStore或Event Sourcing的工作经验,请赐教.

关于事件采购的几乎完全不相关的问题:您是否曾直接查询事件存储?或者您是否总是创建新的预测和重播事件以填充这些预测?

mongodb event-sourcing get-event-store

43
推荐指数
2
解决办法
1万
查看次数

没有事件采购的CQRS - 有哪些缺点?

除了缺少事件采购的一些好处之外,在没有事件采购部件的情况下,将现有架构适应CQRS还有其他任何缺点吗?

我正在开发大型应用程序,开发人员应该能够在接下来的几个月内将现有架构分离为命令和查询,但要求他们在此阶段添加事件源,这将是一个巨大的资源问题.透视.我是不是因为不包括事件采购而亵渎神灵?

cqrs event-sourcing ncqrs

37
推荐指数
4
解决办法
9542
查看次数

使用事件采购和CQRS有哪些缺点?

事件采购和CQRS是伟大的,因为它会赶走被卡住它的开发者一起工作的应用程序的生命周期,除非有一个大的数据迁移项目一个预建模的数据库开发人员.CQRS和ES还有其他好处,如扩展事件存储,审计日志等已经遍布互联网.

但有什么缺点呢?

以下是在研究和编写小型演示应用程序后我可以想到的一些缺点

  1. 复杂:有人说ES很复杂.但是我要说复杂的应用程序比复杂的数据库模型更好,在这种模型上你只能使用查询语言(多个连接,索引等)运行非常有限的查询.我的意思是像Scala这样的编程语言有非常丰富的集合库,它可以非常灵活地生成一些非常复杂的聚合,而且还有Apache Spark可以轻松查询分布式集合.但是数据库总是受限于它的查询语言功能,分发数据库比分布式应用程序代码更难(只需在另一台机器上部署另一个实例!).
  2. 磁盘空间使用率过高:事件存储最终可能会占用大量磁盘空间来存储事件.但是我们可以每隔几周安排一次清理并创建快照,也许我们可以在外部HD上本地存储历史事件,这只是因为我们将来需要旧事件吗?
  3. 高内存使用率:每个域对象的状态都存储在内存中,这可能会增加RAM的使用量,而且我们所有的RAM都是多么昂贵.大问题!!因为我很穷!任何解决方案?可能是使用Sqlite而不是在内存中存储状态?我是否通过在我的应用程序中引入多个Sqlite实例来使事情变得更复杂?
  4. 启动时间较长:失败或软件升级启动速度很慢,具体取决于事件的数量.但我们可以使用快照来解决这个问题吗?
  5. 最终的一致性:某些应用程序的问题.想象一下,如果Facebook使用CQRS的事件采购来存储帖子并考虑到facebook系统的繁忙程度,如果我发布帖子,我会在第二天看到我的fb帖子:)
  6. 事件存储中的序列化事件:事件存储将事件存储为序列化对象,这意味着我们无法查询事件存储中的事件内容.而且我们将来无法为该事件添加其他属性.解决方案是将事件存储为JSON对象而不是序列化事件?但这是个好主意吗?或者添加更多事件以支持对orignal事件对象的更改?

有人可以评论我在这里提出的不利因素,如果我错了就纠正我,并建议我可能错过任何其他的吗?

cqrs event-sourcing

30
推荐指数
5
解决办法
9517
查看次数

事件采购和读取模型生成

假设Stack Overflow域问题和以下事件定义:

UserRegistered(UserId, Name, Email)
UserNameChanged(UserId, Name)
QuestionAsked(UserId, QuestionId, Title, Question)
Run Code Online (Sandbox Code Playgroud)

假设事件存储的状态如下(按出现顺序):

1) UserRegistered(1, "John", "john@gmail.com")
2) UserNameChanged(1, "SuperJohn")
3) UserNameChanged(1, "John007")
4) QuestionAsked(1, 1, "Help!", "Please!")
Run Code Online (Sandbox Code Playgroud)

假设以下非规范化读取模型列出问题列表(对于SO的第一页):

QuestionItem(UserId, QuestionId, QuestionTitle, Question, UserName)
Run Code Online (Sandbox Code Playgroud)

以下事件处理程序(构建非规范化读取模型):

public class QuestionEventsHandler
{
    public void Handle(QuestionAsked question)
    {
        var item = new QuestionItem(
            question.UserId, 
            question.QuestionId, 
            question.Title, 
            question.Question, 
            ??? /* how should i get name of the user? */);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何找到提出问题的用户的姓名?或者更常见的是:如果我的非规范化读取模型需要在特定事件中不存在的附加数据,我应该如何处理事件?

我已经研究CQRS包括现有的样本SimpleSQRS格雷格年轻的Fohjin马克Nijhof的样品.但在我看来,他们只使用事件中包含的数据.

domain-driven-design cqrs event-sourcing

28
推荐指数
2
解决办法
4412
查看次数

最佳事件采购数据库战略

我想设置一个小型的事件采购库.我在网上阅读了一些教程,到目前为止一切都被理解了.

唯一的问题是,在这些不同的教程中,有两种不同的数据库策略,但没有任何注释,为什么他们使用他们使用的那个.

所以,我想问你的意见.重要的是,为什么您更喜欢您选择的解决方案.

  1. 解决方案是db结构,您可以在其中为每个事件创建一个表.

  2. 解决方案是db结构,您只需创建一个通用表,并将事件作为序列化字符串保存到一列.

在这两种情况下,我都不确定它们如何处理事件更改,也许它们会创建一个全新的事件.

亲切的问候

database cqrs event-sourcing

28
推荐指数
3
解决办法
3万
查看次数

活动采购资源

寻找关于事件采购主题的有用讨论组,文章,成功案例,参考应用程序和工具(.Net)的一些建议.

我已经熟悉了:

福勒的文章:http://martinfowler.com/eaaDev/EventSourcing.html

Greg Young的文章(评论中已下载的文档):http://codebetter.com/gregyoung/2010/02/20/why-use-event-sourcing/

Greg Young关于DDDD的优秀(草案)文章:http://abdullin.com/storage/uploads/2010/04/2010-04-16_DDDD_Drafts_by_Greg_Young.pdf

还有什么我应该阅读和看的?

.net c# cqrs event-sourcing

26
推荐指数
2
解决办法
1万
查看次数

CQRS + DDD +事件采购中的集合间通信

在使用事件源聚合后端构建在DDD原则的环境中,如何将单独的聚合根(AR)相互通信?

例如,我有一个Facility聚合根(AR),它有一个负责创建BookingAR 的工厂方法.这BookingPersonAR和FacilityAR 的时间敏感组合.A Person只能预订一个Facility.

在DDD中,我会保留对Bookingin PersonPersonin的引用Facility.但是,当生成用于事件源的事件时,我认为尝试从后端处理事件反序列化将变得令人望而却步.因此,我只采用了对基于对象的值唯一id的引用.然而,这会带来一个新问题,当AR上的方法需要在另一个AR上调用另一个方法时 - 您如何处理这种情况?从域AR命中事件源存储库?

这种情况下的一般用例是什么?我接近这一切都错了吗?

domain-driven-design cqrs event-sourcing

25
推荐指数
1
解决办法
6903
查看次数