问题标签 [axon]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - CQRS 是在 Google App Engine 上实现社交应用程序的好方法吗?
在我看来,CQRS(命令和查询职责分离)方法可能适合在 GAE 上实现强大且响应迅速的社交应用程序服务器,因为:
- CQRS 不需要 SQL 数据库(GAE 不提供)
- 它确实需要一个能够保存序列化对象的数据库,GAE 实际上确实提供了
- 它需要事件队列,GAE 也提供了
- 它支持非阻塞、异步、基于消息的架构,巧妙地解决了 GAE 对长时间运行事务的限制
- 它被宣传为具有高度可扩展性,这毕竟是乐观主义者选择 GAE 的原因
问题是,我是一个生疏的 Java 程序员,对这个选择几乎没有经验,我非常感谢任何一起使用过这两者的人的任何评论,或者至少从使用另一个的经验中调查使用一个。
我认为我的主要问题是:
java - Axon 框架的真实生活体验
作为研究用于项目的 CQRS 的一部分,我遇到了Axon 框架,我想知道是否有人对它有任何真实的生活经验。为了清楚起见,我问的是框架,而不是 CQRS 作为架构模式。
我的项目已经使用了 Spring 和 Spring Integration,它非常符合 Axon 自己的要求,但是在我投入大量时间之前,我想知道是否有人有一些第一手经验。特别是我对文档中没有立即明显的可能陷阱感兴趣。
java - CQRS 和 EventSourcing 的框架建议
除了Axon 框架之外,还有其他用于 CQRS 和事件溯源的 Java 框架吗?我专门找
- 基于Java的框架。
- 必须支持事件溯源。
domain-driven-design - 在 CQRS 中同步查询端数据 - 不会还有争用吗?
我有一个关于 CQRS 范式的一般问题。
我知道 CommandBus 和 EventBus 将域模型与我们的查询端数据存储区分开,最终一致性的优点,以及能够对查询端的存储进行非规范化以优化读取等。这一切听起来都很棒。
但我想知道,当我开始扩展 Query 端负责更新 Query 数据存储的组件数量时,它们是否不会开始相互竞争以执行更新?
换句话说,如果我们尝试为 EventBus 使用 pub/sub 模型,并且对于特定的事件类型有很多不同的订阅者,他们会不会开始相互竞争更新各种非规范化数据?这不会让我们和 CQRS 之前的情况一样吗?
正如我所听到的那样,听起来 CQRS 应该完全消除这种争用,但这只是一种理想,实际上我们只是真正将其最小化吗?我觉得我可能会在这里遗漏一些东西,但不能指望它。
unit-testing - 如何使用 axon-framework 对域模型进行单元测试
我最近在学习 CQRS,所以我开始了一个带有 axon-framework(一个 java CRQS 框架)的示例项目。
根据快速入门,我得到了以下信息:
测试代码促使我使用 axon-framework 编写域模型和集成代码,但它没有涵盖事件产生的副作用。我在哪里测试它们?例如,当信用分录生效时,它的状态应该是有效的。我是否应该在其他测试方法中创建 CreditEntry 实例并通过调用特定的 on(...Event event) 方法进行测试?
还有一个问题是:我应该把业务验证逻辑放在哪里?在命令处理程序方法中?假设如果 CreditEntry 已经生效,则不能再次生效。
任何想法都值得赞赏,谢谢。
domain-driven-design - 在 CQRS 和 EventSourcing 中同步查询数据库时,我是否编写了重复的域逻辑?
我对如何将数据同步到查询数据库感到困惑。
假设我有一个聚合:CreditAccount和一些命令可能会产生CreditAccountBalanceChangedEvent:
在命令处理程序方面一切正常。然后我开始查询,但我发现我在这里写了一些重复的域逻辑:
你可能注意到了,我在命令端和查询端都写了余额计算代码。我的问题是这在某些情况下是不可避免的还是我在错误的地方编写了域逻辑?
到目前为止,我的研究表明,事件代表了某些事情已经发生,因此它们中没有业务逻辑,它们只是数据持有者(但揭示了用户的意图)。那么我应该向CreditAccountBalanceChangedEvent添加一个“余额”字段并将余额计算代码移动到命令处理程序方法吗?
在这种情况下,我可以使用 event.getBalance() 删除查询端的余额计算。
很抱歉出现全屏问题,任何想法都值得赞赏。
domain-driven-design - 我应该使用命令在 CQRS 中实现域派生吗
我在航空预订应用程序上使用 CQRS。一个用例是帮助客户取消他们的票。但在实际取消之前,客户想知道罚款。
罚款是根据空气规则计算的。我们的一些提供商可以通过暴露 Web 服务来计算惩罚,而其他提供商则不会。(他们发表了一些解释算法的论文)。所以我定义了一个域服务
我的问题是哪一方(命令/查询)负责调用此域服务并在 CQRS 样式应用程序中返回结果?
我想用一个命令:CalculatePenlatyCommand,这样,很容易重用领域模型,但是有点奇怪,因为这个命令不修改状态。
或者如果这是一个查询,我应该检索票的读取模型吗?但是命令端和查询端都需要相同的 DomainService,这也很奇怪。
域派生是查询吗?
cqrs - 如何在现有数据库上开始使用 CQRS 和 Axon 框架
我们有一个使用图形数据库的现有 Web 应用程序,我们希望将其切换到使用带有 Axon 框架的 cqrs 的架构。
我想知道是否有任何最佳实践来处理我们生产数据库中已经存在的数据。我们需要填充一个索引数据库(elasticsearch),我想使用事件监听器来保持更新。该索引需要使用已经在生产中的数据进行初始化,但没有与之关联的事件。
我的第一个想法就是从现有的数据库中生成一堆创建命令,所以索引的填充只用事件来完成。这在第一次运行时可能需要一段时间,但我们可能对此没意见。
这听起来是个好主意吗?对此还有其他想法吗?
saga - 如何确保我的 Axon Saga 收到与 AssociationProperty 匹配的事件的通知?
我有一个正在使用 Axon 开发的项目,但我的 Saga 没有正确执行。
My Saga 包含与此类似的行:
第一个事件正在触发一个开始 saga,并且还触发了 initialiseWorkflow 任务(它正确地创建了一组额外的步骤。)但是,当 SecondEvent 到达时(与 FirstEvent 具有相同的 UUID 关联属性值),saga 不会拿起那第二个事件。
我已经尝试专门包括以下行来增强关联,但这也不起作用:
具有讽刺意味的是,我有一个测试用例,使用正常工作的轴突测试框架,这类似于:
问题出现在我的端到端测试中,我将命令直接放入 CommandGateway,并直接在存储库中检查结果。
我已经仔细检查了 AnnotatedSagaManager 是否正在使用,并且确实如此。
有没有人对可能出现的问题有任何想法,或者我误解了 Sagas 应该如何工作?
编辑:还有一些更新:
1) 我注意到在直接关联 UUID 时需要使用 toString(),所以我尝试将值变成事件的字符串 - 没有进展。
2)我尝试打印出关联的值,发现不需要直接关联行(在start saga过程中关联了uuid)
3)我尝试将@StartSaga 放在 secondEvent 上,这达到了“Processing SecondEvent ...”的代码,但在一个新的传奇中。
更多了解,但还没有解决方案!
java - Axon 能否使用 DistributedCommandBus 和 Clustering Event Bus 保证同步的端到端请求周期?
这是我的想法:
- 用户在 MVC 控制器的表示层中创建命令。
- 该命令在
DistributedCommandBus
. - 命令到达命令处理程序。
- 命令处理程序引发的事件很少。
- 例如,事件在使用 RabbitMQ 的集群事件总线上发送。
- 该事件通过多个不同的 EventListener 进行处理。
- 控制权再次返回给 MVC 的 Controller。
所以基本上我希望一切都同步发生。我怀疑这可能是不可能的,但我想知道使用 DistributedCommandBus 和 Clustering Event Bus 进行同步通信的限制是什么。