a. 微软技术文档
b. Axon框架指南
c. AxonFramework github地址
CQRS 代表 Command and Query Responsibility Segregation,一种将数据存储的读取和更新操作分开的模式。在您的应用程序中实施 CQRS 可以最大限度地提高其性能、可伸缩性和安全性。迁移到 CQRS 所产生的灵活性允许系统随着时间的推移更好地发展,并防止更新命令导致域级别的合并冲突。
许多用户并行访问相同数据的协作域。CQRS 允许您定义具有足够粒度的命令,以最大限度地减少域级别的合并冲突,并且可以通过命令合并确实出现的冲突。
基于任务的用户界面,用户可以通过一系列步骤或复杂的域模型来引导用户完成复杂的过程。写入模型具有完整的命令处理堆栈,包括业务逻辑、输入验证和业务验证。写入模型可以将一组关联对象视为数据更改的单个单元(聚合,在 DDD 术语中),并确保这些对象始终处于一致状态。读取模型没有业务逻辑或验证堆栈,只返回一个 DTO 以在视图模型中使用。读模型最终与写模型一致。
数据读取性能必须与数据写入性能分开微调的场景,尤其是在读取次数远大于写入次数时。在这种情况下,您可以扩展读取模型,但仅在少数实例上运行写入模型。少量的写入模型实例也有助于最大限度地减少合并冲突的发生。
一个开发团队可以专注于作为写入模型一部分的复杂域模型,而另一个团队可以专注于读取模型和用户界面的场景。
预计系统会随着时间的推移而发展并可能包含模型的多个版本,或者业务规则定期更改的场景。
与其他系统集成,尤其是与事件溯源相结合,其中一个子系统的临时故障不应影响其他子系统的可用性。
在以下情况下不建议使用此模式:
域或业务规则很简单。
一个简单的 CRUD 风格的用户界面和数据访问操作就足够了。
CQRS(命令查询责任分离)和事件溯源有什么区别?我认为事件溯源是一种CQRS。事件溯源与其他类型的CQRS有什么区别?谢谢, 最佳答案 CQRSCQRS由GregYoung引入;hisexplanationin2010CQRSissimplythecreationoftwoobjectswheretherewaspreviouslyonlyone.Theseparationoccursbaseduponwhetherthemethodsareacommandoraquery(thesamedefinitionthatisusedb
我们在我们的应用程序中实践CQRS架构,即我们有许多类实现ICommand每个命令都有处理程序:ICommandHandler.数据检索也是如此——我们有IQUery与IQueryHandler.这几天很常见。一些查询经常使用(用于页面上的多个下拉列表),缓存它们的执行结果是有意义的。所以我们有一个围绕IQueryHandler的装饰器来缓存一些查询执行。查询实现接口(interface)ICachedQuery和装饰器缓存结果。像这样:publicinterfaceICachedQuery{StringCacheKey{get;}intCacheDurationMinutes{get
出于性能原因,我们的系统结构化模型(大约30个具有多种关系的不同实体)完全保存在内存(大约10Gb)中。在这个模型上我们必须做3种操作:更新一个或几个实体查询特定数据(这通常需要读取数千个实体)获取统计数据(使用了多少内存,有多少种查询等)目前该体系结构是一个相当标准的体系结构,具有使用共享模型的servlet线程池。在模型内部有很多并发集合,但仍然有很多等待,因为一些实体“更热”并且大多数线程想要读/写它们。另请注意,通常查询比写入消耗更多的CPU和时间。我正在研究切换到Disruptor架构的可能性,将模型保持在单个线程中,将所有可能的东西(有效性检查、审计等)从模型中转移到单独的
我写了我的项目,就是论坛的游戏Mafia。我使用CQRS事件源+MongoDB。当游戏开始时,游戏需要给每个玩家一个随机的角色。我怎么能意识到,如果聚合根将应用事件,例如,“角色给定”,来自数据库(不是事件,现在已经保存),总是会调用随机函数,这将返回不同的结果? 最佳答案 通常你会有一个命令来触发一些域行为(即分配随机角色),然后角色将保存在数据库中的一个事件中,即角色分配。这将在玩家下次通过重播事件恢复游戏时保留角色。您不会在处理事件的代码中分配随机角色,它会在命令处理程序中完成,不会重播。publicvoidHandle(){
我们使用MongoDb作为我们应用程序的数据源,该应用程序是使用cqrs和事件源构建的。我们今天面临的问题是什么是实现事件映射(非规范化)以读取数据库的最佳方式。例如,我们有一个用户MongoDb集合,其中包含有关用户的所有信息。我们有这样的事件:[Serializable]publicclassPasswordChangedEvent:DomainEvent{privatestring_hashedPassword;privatestring_salt;publicPasswordChangedEvent(){}publicPasswordChangedEvent(stringhas
我正在设计一个cqrs事件源系统(不是我的第一个),其中我的读取模型是非规范化的,并存储在一个读取优化文档数据库(mongodb)中。没什么特别的。现在,这个特定的读取模型是一个文档,它包含一个用户id和一个潜在的大型组数组,用户是该组的成员:{"userId":1,"userName":"aaron","groups":[{"groupId":1,"name":"group1"},{"groupId":2,"name":"group2"}]}可能有10万个用户是一个组的成员(就像一个例子:假设每个工作人员都是一个组的成员)。请记住,我首先使用cqr的原因是,我需要扩展我的读操作(或者
我们正在启动一个新项目,我们希望在该项目中使用MongoDB实现CQRS+事件溯源架构。我们已经对CQRS方法有了一些经验:在我们之前的项目中,我们以Fohjin框架为起点(好吧,我们对其进行了重大重构)。我们使用Oracle作为存储,并且在这种情况下还使用TransactionScope实现了2PC。但是对于我们的新项目,由于其可扩展性和性能,我们希望使用MongoDB。我们绝对希望将它用于读取(报告)部分并将其用于事件存储。这里的替代方法是使用SQLServer进行事件存储。所以我们需要做出选择。我不喜欢混合解决方案的是TransactionScope,它既昂贵又缓慢,而且必须支持
我正在尝试创建一个守护进程来对我的数据库进行非规范化。我使用ActiveMQ作为队列管理器我有2个数据库:关系数据库(写入+复制)和非规范化数据库(用于读取)我的问题是对我的真实数据库进行非规范化的最佳做法是什么我有一些想法:读取队列的MySQL代理(带lua)(这可能吗)MySQL中的触发器Java守护进程作为读取队列的服务Cron选项卡?(但我会有很长一段时间的潜伏期 最佳答案 我不确定这是否是官方的“最佳”做法,但总的来说,我发现事件溯源和使用事件来驱动对读取模型的写入和更新是一个很好的做法。通过事件溯源,写入模型本身并不作为
我正在使用CQRS(命令和查询责任分离)并为其寻找iOS实现/库,知道在哪里可以找到它吗?谢谢。 最佳答案 CQRS非常适合偶尔连接的客户,尤其是当您添加事件溯源时。它们通常是齐头并进的,但CQRS可以在没有ES的情况下完成。我不了解iOS,但可以应用相同的原则。偷看here.可在此处找到GregYoung(CQRS领先专家之一)的精彩演讲:CQRS,notjustforserversystems请记住,CQRS是一种模式(不是框架),您可以将其应用于您的解决方案(应用程序)。CQRS变得有点“更主流”-请参阅MSPatternsa
在我看来,CQRS(命令和查询责任分离)方法可能适合在GAE上实现强大且响应迅速的社交应用程序服务器,因为:CQRS不需要SQL数据库(GAE不提供)它确实需要一个能够保存序列化对象的数据库,GAE实际上提供了这种数据库它需要事件队列,GAE也提供了它支持非阻塞、异步、基于消息的架构,巧妙地解决了GAE对长时间运行事务的限制它被宣传为高度可扩展的,这毕竟是乐观主义者选择GAE的原因问题是,我是一个生锈的Java程序员,对这种选择没有什么经验,我非常感谢任何同时使用过这两者的人的任何评论,或者至少从使用经验中研究过使用一个另一个。我认为我的主要问题是:对于新应用的早期阶段,CQRS是否过