Axon框架的真实生活体验

作为研究与项目一起使用的CQRS的一部分,我碰到了Axon框架 ,我想知道是否有人有任何真实的生活经验。 要清楚的是,我正在询问框架,而不是CQRS作为一种架构模式。

我的项目已经使用了Spring和Spring Integration,它非常适合Axon自己的需求,但在我投入大量时间之前,我想知道是否有人有第一手的经验。 特别是我感兴趣的是我可能从文档中看不到的陷阱。

框架在很大程度上依赖于事件源,这意味着所有的状态改变都作为事件写入数据存储。 “

这完全是不真实的,它不依赖于事件采购。 在这个框架中存储集合的实现之一使用了事件源,但是你也可以很容易地使用提供的类来使用标准的关系模型。

事件采购更好。

所以你有一个所有数据的历史参考。 这很好,但是在生产完成之后,更改您的域名是一个非常令人畏缩的主张,特别是当您在系统的“强大的可审计性”上销售客户时

我不认为使用只存储当前状态的标准关系模型会更容易。

该框架鼓励对数据进行非规范化,直到某些人build议在应用程序中为每个视图添加一个表。 这使得你的应用程序非常难以维护,特别是当原来的开发人员离开“

这与框架无关,而与使用的架构模式(CQRS)无关。 抱歉提到,但有一个denormalizer /视图是一个好主意,因为它保持一个简单的对象。

所以维护很容易,因为SQL请求/插入也很容易。 所以这个说法不是很强。 如何使用1000表模型,内部连接和复杂的SQL查询?

同样,CQRS也有帮助,因为基本上,视图数据只是对应视图的表中的一个SELECT *。

如果你在某个事件处理程序中犯了一个错误,你唯一的select就是“重放”事件日志,这取决于你的数据的大小可能需要很长的时间。 但是,这个工具是不存在的。

我同意这一观点,即目前缺乏重播活动的工具,这可能需要很长时间。 但是,从理论上讲,只能重放一部分事件,而不能重放事件存储的所有内容。

回放可能有副作用,所以开发人员会害怕这样做

重播事件有副作用 – >这是不真实的。 对我来说副作用意味着修改系统的状态。 在事件源CQRS应用程序中,状态存储在事件存储中。 重播事件不会修改事件存储。 你可以在模型的查询端有副作用。 但是你不在乎你是否犯了错误,因为你仍然能够纠正错误并重新播放事件。

开发人员使用这个框架是非常容易的。 如果他们没有在事件中存储对领域对象的更改,那么下次您重放事件时就会出现意外。

那么如果你滥用和误解的架构,这个概念等,那么我同意你的意见。 但也许这个问题不是这里的框架。

你应该存储三angular洲? 绝对值? 如果你不关注你的开发人员>你一定会得到这两个,你会被发现

我可以说,对于每一个系统,我都会说它和框架本身没有直接关系。 这就像是说:“Java是垃圾,因为如果有人编写了hashCode的一个不好的实现,并且等于方法,你就可以搞砸了。

对于你的评论的最后一部分,我已经看到了像Spring框架的helloWorld样本。 当然这是一个简单的例子,完全没用。

在您的评论中小心,以区分概念(CQRS + EventSourcing)和框架。 请有所作为。

既然你已经说过你想为你的项目使用CQRS(我假设JVM是你的目标平台),我认为Axon Framework是一个很好的select。

我已经build立了一个相当复杂的交易平台(不,交易样本不复杂),我还没有看到任何明显的框架的缺陷。

由于我使用EventSourcing,所以testing装置使得BDD风格非常容易编写“给定,时间,然后”testing。 这可以让你把一个聚合对象看作一个黑盒子,集中精力检查当你input某个命令时,正确的事件组合。

关于陷阱:在跳入之前,确保

  1. 你有CQRS的概念想通了。
  2. 做一个列表(纸,白板,无论)你所有的聚合,命令处理程序,事件处理程序,传奇,命令和事件。 这是构build系统的难点,弄清楚它应该做什么以及如何做。 在此之后,参考手册应该告诉你如何将它与Axon连接在一起。

一些非Axon的具体问题:

能够从事件重build视图存储是一个EventSourcing的概念,而不是Axon独有的东西,但是我发现创build一个服务会很容易,这个服务会把所有的事件从一个聚合types,聚合id或者某个特定的事件types。

在项目启动一年后能够build立一个新的报告组件,并立即获得项目启动和以后的数据报告是非常棒的。

我在为一家大银行开发的一个复杂项目中使用了AxonFramework一年以上。

要求苛刻,客户期望高,发布时间缩短。

我select了AxonFramework,因为在项目启动的那一刻,它是Java中提供的最完整和最好的CQRS实现,devise良好,易于集成,testing和扩展。
经过一年多的时间,我认为这些考虑依然是有效的。

另一个考虑引导了我的select:我希望对这样一个困难的项目的承诺,成为我和其他团队成员的培训机会。

我们开始使用AxonFramework版本1.0进行开发,随着新版本的发布,我们开始移植到1.4版本。

我们在CQRS方面的经验以及由AxonFramework提供的实施是绝对正面的。

它为我们提供了一致而统一的方式来发展每一个引导我们并使你感到轻松的特色。

没有它,应用程序的某些function将会变得更加复杂。 我主要指的是需要处理的各种长期运行stream程以及相关的薪酬逻辑,还涉及许多必要的业务逻辑部分,这些部分在事件驱动的体系结构中很好地与非连接由CQRS推动。

我们的select是在写模型中保守,所以我们更喜欢基于JPA的持久化,而不是事件源。

查询模型由视图组成。 我们试图确保每个视图在必要时使用中间视图包含来自单个页面的所有必需数据。

无论如何,当我们应用事件采购时,我们开发了写模型,所以我们只关心通过事件来修改聚集的状态。 当客户要求一个非常复杂的聚合的克隆function时,只需要将源事件(通过uuid翻译)重播到一个全新的实例 – 在这种情况下,这个事件就是事件上传(但是这个function是在即将到来的2.0版本中大大改进)。

就像在开发过程中的每个项目中一样,我们在代码中主要发现了很多错误,但是在应用程序服务器,IoC容器,caching,工作stream引擎以及其他一些组件中也应该是成熟和稳定的组件很容易在任何大型J2EE应用程序中find的库。

就像任何其他人类产品一样,AxonFramework也无法抵御错误,但是对于这样一个年轻的小众项目来说,它们一直很less,并不是很关键,而且很快就能通过新版本得到解决。

笔者在邮件列表中提供的那种亲切的支持是另一个非常宝贵的特性,当我遇到困难时帮助了我很多。

该应用程序在一年前发布,目前正在维护和积极开发新function。

客户满意,并要求更多。

何时使用AxonFramework更多的是何时使用CQRS。 有关回复,请务必返回官方文档: http : //www.axonframework.org/docs/1.4/introduction.html#d4e51

在我们的案例中肯定是值得的。

OP特别询问了与Axon框架有关的缺陷,而不是CQRS。 这使得这个问题很难回答,因为Axon开始作为Eric Evans着名书籍的忠实实施者

主要优势在于它完全符合锡上的要求:它为您处理基于CQRSdevise的难题:聚合,传奇,事件采购,命令处理程序,事件处理程序,BASE一致性等。当您遵循最佳实践,你最终得到一个高度响应和水平可伸缩的应用程序。 如果您在事件采购中使用它,则您的数据是完全可审计的,至less在理论上,您可以确定您的应用程序在任何时间点的状态。 没有提供工具来做到这一点; 你将不得不推出自己的。

这个框架的主要开发人员是非常平易近人,非常熟悉Java中高性能和可伸缩计算的主题。 他倾向于在几个小时内回复邮件列表中的所有问题。 这是一个优势和主要陷阱:在这个时候(2014年初),轴突框架严重依赖于一个人。 我想提到的其他陷阱可能更多的是事件源的结果比CQRS或轴突。

预先非常小心地devise您的数据模型。 虽然很容易添加,但对数据模型进行根本性更改可能非常困难。 如果你在数据模型中犯了一个根本的错误,那么你的应用程序可能performance不好,甚至根本无法工作。 例如,如果select一个树形数据模型(在顶部有一个长寿命的聚合根),则此聚合可能会随着时间累积越来越多的事件而变得非常大,并且可能需要很长时间来加载和存储。 我不知道会发生什么,直到聚合的一个实例不再适合RAM,但我想可能是坏的。 不要这样做。

另一个陷阱(与事件源相关)是经过多次修改之后,可能会越来越难以推断聚合的状态,因为有时候不仅要记住代码今天的function,还要记住它在过去做过。 这绝对使得重放事件存储(的一部分)来重build视图表是一件不平凡的任务。

修复数据错误比使用“传统”devise更困难。 而不是一个简单的SQL语句,你通常需要做一个命令来改变你的应用程序的状态。 如果数据中的错误是由错误的事件处理程序引起的,那么通常可以修复该错误,清除快照并让其聚合的事件被重放。 如果您的错误导致虚假事件被应用,那么修复问题就更麻烦了。 有故障的事件将停留在事件存储区中,您可能需要应用一些新事件将数据恢复到正确的状态,或者更改代码以忽略或修复其行为。

我目前正在与一个团队合作,在今年夏天推出我们的品牌Casumo的在线赌场平台。 这个领域和平台是使用Axon Framework构build的,到目前为止它已经为我们提供了坚实的基础。

节省了大量的时间,不必构build命令处理,事件路由,事件采购,快照等所需的所有基础架构,这些API真的很好用。 到目前为止,我们在框架中发现的一个bug在12小时之后得到了修复,Allard总是很快就新function提出build议,并讨论如何利用框架来满足您的需求。

虽然这个框架本身写得不错,但是在现实世界的项目中使用它却毫无噩梦,这个框架的select是这个项目失败的主要原因。

该框架在很大程度上依赖于事件源,这意味着所有状态更改都以事件的forms写入数据存储区。 所以你有一个所有数据的历史参考。 这很不错,但是在你投入生产之后,改变你的域名是一个非常令人畏缩的主张,特别是如果你把客户卖给了系统的“强大的可审计性”

您不能让操作人员对数据库进行临时更改

该框架鼓励对数据进行非规范化,以至于有人build议在应用程序中为每个视图提供一个表。 这使得你的应用程序非常难以维护,特别是当原来的开发人员不在时

如果你以某种方式在事件处理程序中犯了一个错误,那么唯一的select就是“重放”事件日志,这取决于你的数据的大小可能需要很长时间。 但是,这个工具是不存在的。 回放可能有副作用,所以开发人员会害怕这样做

开发人员使用这个框架是非常容易的。 如果他们没有在事件中存储对域对象的更改,那么下次您重放事件时,您会感到惊讶。 你应该存储三angular洲? 绝对值? 如果你不注意你的开发人员,你一定会得到这两个,你会被发现

几乎没有采用这个框架,所以用Googlesearch答案不会有什么好处

即使这个框架还不支持分发,但是它的写法与api是一个痛苦的工作,因为它。 事件的触发是asynchronous的,如果你想检查是否引发了一个exception,执行这个命令,说一个重复的用户名exception,你需要把一个监听器传递给你的commandhandler,这是一个未来,然后你等待未来结果进来,处理任何检查exception,interuptedexception等,然后你可以抓住从未来抛出的exception。 当然一个命令可以提出的例外从api中是不明显的。 打败检查exception的目的

看看一些示例应用程序 。 我不知何故需要一个单位的工作监听器来创build一个地址簿应用程序? 我的天啊…

Interesting Posts