虽然我之前遇到过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 所说,我们可以在帐户注册示例中使用补偿命令,但如果我们在此订购示例中也使用补偿命令,那么它将太复杂,并且代码可能难以维护.
强调事件的体系结构中的命令和事件之间有什么区别?我能看到的唯一区别是命令通常由系统外的actor来源/调用,而事件似乎是由处理程序和系统中的其他代码提供的.但是,在我看到的许多示例应用程序中,它们具有不同(但功能相似)的接口.
关于命令是否应该具有返回值似乎存在无穷无尽的混淆.我想知道这种混乱是否仅仅是因为参与者没有陈述他们的背景或情况.
以下是混淆的例子......
Udi Dahan说命令"不会向客户端返回错误",但在同一篇文章中他展示了一个图表,其中命令确实将错误返回给客户端.
微软新闻商店文章指出"命令......不会返回响应",但接着提出了一个含糊不清的警告:
随着围绕CQRS的战场经验的增长,一些实践巩固并倾向于成为最佳实践.部分地与我们刚才所说的相反......今天人们普遍认为命令处理程序和应用程序都需要知道事务操作是如何进行的.必须知道结果......
那么,命令处理程序是否返回值?
从Jimmy Bogard的" CQRS神话 "中得到启示,我认为这个问题的答案取决于你所说的程序/语境"象限":
+-------------+-------------------------+-----------------+
| | Real-time, Synchronous | Queued, Async |
+-------------+-------------------------+-----------------+
| Acceptance | Exception/return-value* | <see below> |
| Fulfillment | return-value | n/a |
+-------------+-------------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)
命令"Acceptance"主要指验证.推测验证结果必须与调用者同步,无论命令"履行"是同步还是排队.
但是,似乎许多从业者不会从命令处理程序中启动验证.从我所看到的,它要么是因为(1)他们已经找到了在应用层处理验证的绝妙方法(即ASP.NET MVC控制器通过数据注释检查有效状态)或者(2)架构假设命令被提交给(进程外)总线或队列.后面这些异步形式通常不提供同步验证语义或接口.
简而言之,许多设计人员可能希望命令处理程序将验证结果作为(同步)返回值提供,但它们必须遵守它们使用的异步工具的限制.
关于命令的"履行",发出命令的客户端可能需要知道新创建的记录的scope_identity或者可能需要知道故障信息 - 例如"帐户透支".
在实时设置中,似乎返回值最有意义; 不应使用例外来传达与业务相关的失败结果.但是,在"排队"环境中......返回值自然没有意义.
这是所有困惑可能总结的地方:
许多(大多数?)CQRS从业者假设他们现在或将来会合并异步框架或平台(总线或队列),从而宣称命令处理程序没有返回值.但是,一些从业者无意使用此类事件驱动的构造,因此他们将支持(同步)返回值的命令处理程序.
因此,例如,我相信Jimmy Bogard提供此示例命令界面时会假设同步(请求 - 响应)上下文:
public interface ICommand<out TResult> { }
public interface ICommandHandler<in TCommand, out TResult>
where TCommand : …Run Code Online (Sandbox Code Playgroud) 我和我的团队一直在讨论使用CQRS(Command Query Responsibility Segregation)设计模式,我们仍在努力评估使用它的优缺点.根据:http://martinfowler.com/bliki/CQRS.html
我们还没有看到CQRS在该领域的足够用途,但仍然有信心我们理解其优缺点
那么你们怎么想?问题什么时候需要使用CQRS呢?
我正在学习什么是CQRS模式,并且开始知道还有CQS模式
当我试图搜索时,我发现了很多图表,关于CQRS的信息但是没有发现很多关于CQS的信息
CQRS模式的关键点
在cqrs中,有一个要编写的模型(命令模型)和一个要读取的模型(查询模型),它们是完全独立的.
CQS如何与CQRS区分开来..?
两者都有区别的关键点是什么..?
任何援助将不胜感激 :)
据我所知,这三个概念都与长期运行的交易有关.
据我所知,进程管理器是一个有限状态机,它简单地响应事件并发出命令.它不包含任何业务逻辑,只是路由.它的目标是让您进入最终状态,在那里您知道您的交易成功或失败.
到现在为止还挺好.
但是现在我的理解开始了:
任何人都可以解释这些差异,并且 - 我特别感兴趣的是 - 这些概念中的哪一个对于什么是好的,什么时候你需要什么.它们是互相排斥的吗?你可以只用其中一个一路走吗?您是否需要多个场景?...?
我对CQRS的看法是严格遵循你的命令不返回任何东西(返回类型为void),所以我的例子非常简单:如何在创建时检索ID?
例如,在创建信用卡交易时,返回交易ID似乎非常重要,或者在创建客户时,如果您获得了您创建的客户或客户ID,那么浏览器可以自动导航到该客户页面会更容易例如.
一种解决方案可能是首先要求提供ID,然后使用该ID创建客户或交易,但这看起来很奇怪.
有没有人有这方面的经验,或者现在应该如何以最有效的方式完成?也许我误会了什么?
cqrs ×10
architecture ×2
apache-kafka ×1
c# ×1
command ×1
dddd ×1
events ×1
frameworks ×1
ncqrs ×1
unique ×1