虽然我之前遇到过Kafka,但我最近才意识到Kafka可能会被用作CQRS,eventstore(的基础).
Kafka支持的要点之一:
诚然,我不是100%精通CQRS /事件采购,但这看起来非常接近eventstore应该是什么.有趣的是:我真的找不到关于Kafka被用作事件存储的那么多,所以也许我必须遗漏一些东西.
那么,卡夫卡缺少什么东西才能成为一个好的活动商店?会有用吗?用它生产?对洞察力,链接等感兴趣
基本上,系统的状态是根据系统收到的事务/事件保存的,而不是仅仅保存系统的当前状态/快照,这是通常所做的.(将其视为会计总帐:所有交易最终都会累加到最终状态)这允许各种很酷的事情,但只需阅读所提供的链接.
如果我使用RDBMS(例如SQL Server)来存储事件源数据,架构可能是什么样的?
我从抽象的意义上看到了一些变化,但没有具体的.
例如,假设有一个"产品"实体,对该产品的更改可以采用以下形式:价格,成本和描述.我很困惑我是否:
特别是我担心上面的选项2.极端情况下,产品表几乎是每个表一个表,在这里加载给定产品的应用程序状态需要从每个产品事件表加载该产品的所有事件.这桌爆炸对我来说有点不对劲.
我确信"这取决于",虽然没有单一的"正确答案",但我试图了解可接受的内容,以及完全不可接受的内容.我也知道NoSQL可以在这里提供帮助,其中事件可以存储在聚合根目录中,这意味着只有一个请求数据库来获取事件来重建对象,但是我们没有使用NoSQL数据库.那一刻,所以我在寻找替代品.
我们来看一个简单的"帐户注册"示例,这里是流程:
当然,我们可以通过读取MVC控制器中的ReadModel来验证UserName的唯一性,以提高性能和用户体验.但是,我们仍然需要在RegisterCommand中再次验证唯一性,显然,我们不应该在命令中访问ReadModel.
如果我们不使用Event Sourcing,我们可以查询域模型,这样就没问题了.但是如果我们使用Event Sourcing,我们无法查询域模型,那么我们如何验证RegisterCommand中的UserName唯一性?
注意: User类具有Id属性,UserName不是User类的键属性.在使用事件源时,我们只能通过Id获取域对象.
顺便说一句:在要求中,如果已经输入了UserName,则网站应向访问者显示错误消息"抱歉,用户名XXX不可用".显示一条消息是不可接受的,例如"我们正在创建您的帐户,请稍后,我们会通过电子邮件将注册结果发送给您"给访问者.
有任何想法吗?非常感谢!
[UPDATE]
一个更复杂的例子:
需求:
下订单时,系统应该检查客户的订购历史,如果他是一个有价值的客户(如果客户在去年每月至少订购10个订单,他是有价值的),我们会在订单上减价10%.
执行:
我们创建PlaceOrderCommand,在命令中,我们需要查询订购历史记录以查看客户端是否有价值.但是我们怎么能这样做呢?我们不应该在命令中访问ReadModel!正如Mikael 所说,我们可以在帐户注册示例中使用补偿命令,但如果我们在此订购示例中也使用补偿命令,那么它将太复杂,并且代码可能难以维护.
我想知道使用EventStore有什么好处(http://geteventstore.com)比在MongoDb中自己实现事件采购.
我问的原因是,我们公司有很多人每天与MongoDb合作.但它们不适用于Event Sourcing.虽然他们并没有完全关注这个主题,但他们也不打算在任何地方开始实施.
我即将开始一个非常适合Event Sourcing的项目.大约有16个定义明确的事件,大约有7个定义明确的预测.我说"关于"因为我知道一旦他们看到产品在使用中就会有更多的预测和事件需求.
这种方法将首先是API,我们组织的其他部分将使用REST Api.
虽然我已经按照Greg Young定义的方式阅读了很多关于事件采购的内容,但我从未实际实施过Event Sourcing解决方案.
这是一个绿色的田野项目.没有技术限制,因为我们将把所有内容公开为REST接口.因此,如果有人有使用MongoDb的EvenStore或Event Sourcing的工作经验,请赐教.
关于事件采购的几乎完全不相关的问题:您是否曾直接查询事件存储?或者您是否总是创建新的预测和重播事件以填充这些预测?
除了缺少事件采购的一些好处之外,在没有事件采购部件的情况下,将现有架构适应CQRS还有其他任何缺点吗?
我正在开发大型应用程序,开发人员应该能够在接下来的几个月内将现有架构分离为命令和查询,但要求他们在此阶段添加事件源,这将是一个巨大的资源问题.透视.我是不是因为不包括事件采购而亵渎神灵?
事件采购和CQRS是伟大的,因为它会赶走被卡住它的开发者一起工作的应用程序的生命周期,除非有一个大的数据迁移项目一个预建模的数据库开发人员.CQRS和ES还有其他好处,如扩展事件存储,审计日志等已经遍布互联网.
但有什么缺点呢?
以下是在研究和编写小型演示应用程序后我可以想到的一些缺点
有人可以评论我在这里提出的不利因素,如果我错了就纠正我,并建议我可能错过任何其他的吗?
假设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的样品.但在我看来,他们只使用事件中包含的数据.
我想设置一个小型的事件采购库.我在网上阅读了一些教程,到目前为止一切都被理解了.
唯一的问题是,在这些不同的教程中,有两种不同的数据库策略,但没有任何注释,为什么他们使用他们使用的那个.
所以,我想问你的意见.重要的是,为什么您更喜欢您选择的解决方案.
解决方案是db结构,您可以在其中为每个事件创建一个表.
解决方案是db结构,您只需创建一个通用表,并将事件作为序列化字符串保存到一列.
在这两种情况下,我都不确定它们如何处理事件更改,也许它们会创建一个全新的事件.
亲切的问候
寻找关于事件采购主题的有用讨论组,文章,成功案例,参考应用程序和工具(.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
还有什么我应该阅读和看的?
在使用事件源聚合后端构建在DDD原则的环境中,如何将单独的聚合根(AR)相互通信?
例如,我有一个Facility聚合根(AR),它有一个负责创建BookingAR 的工厂方法.这Booking是PersonAR和FacilityAR 的时间敏感组合.A Person只能预订一个Facility.
在DDD中,我会保留对Bookingin Person和Personin的引用Facility.但是,当生成用于事件源的事件时,我认为尝试从后端处理事件反序列化将变得令人望而却步.因此,我只采用了对基于对象的值唯一id的引用.然而,这会带来一个新问题,当AR上的方法需要在另一个AR上调用另一个方法时 - 您如何处理这种情况?从域AR命中事件源存储库?
这种情况下的一般用例是什么?我接近这一切都错了吗?
event-sourcing ×10
cqrs ×9
.net ×1
apache-kafka ×1
c# ×1
database ×1
dddd ×1
mongodb ×1
ncqrs ×1
unique ×1