轴突:单个聚合的多命令

Axon: Multi Command for single Aggregate

我对细粒度 API 命令处理有一个很好的想法。

我们的网络 API 应该提供单个简单的 update 端点,但您可以向它提供多个命令。像这样:

POST /myAggregate/12345/update
[
  { command1Name: "command1Data" },
  { command2Name: "command2Data" },
  { command3Name: "command3Data" }
]

在 Axon 内部,这似乎很难处理。特别是结合 @AggregateVersion.


我的第一个想法是拥有一个新的 UpdateWrapperCommand。内部有一个 List commands。然后在聚合中,您使用反射调用正确的 @CommandHandler 方法:

class UpdateWrapperCommand {
  List commands;
}

@Aggregate
class MyAggregate {
  // id, version, constructor, etc. pp.

  @CommandHandler
  public void handle(SomeCommand cmd) { ... }

  @CommandHandler
  public void handle(UpdateWrapperCommand cmd) {
    // iterate over cmd.commands
    // iterate over this.getClass().getMethods()
    // find correct method(s), and invoke it
  }
}

但是当 @CommandHandler 也使用 @MetaData and/or Spring Bean 注入时,它变得非常困难。


我的第二个想法是在循环中简单地调用 commandGateway.send。但这会爆炸,因为必须为每个命令设置 @TargetAggragateVersion,并且您必须等待每个命令完成,然后才能发送下一个命令。不好看。


你对此有什么想法吗?

它应该加载聚合一次,然后 运行 所有命令。

甚至可能有一些类似事务的行为:应用所有结果事件,或 none。

如果交易意味着要么全有要么全无,那么每个命令的边界可能没有很好地建模。

在不了解域的情况下,我会说选项是:

1 将所有命令包装在一个中,并应用于一个 handle-all 聚合。

2 独立应用所有命令,如果出现任何故障,则应用补偿操作。

3 根本不使用命令,只是将事务逻辑应用于更简单的事情。

我认为您最好立即解决此问题,而无需等待 issue you've added to Axon Framework's issue tracker, is to add an External Command Handler

外部命令处理程序只是一个带有 @CommandHandler 注释函数的常规组件。该方法将处理您的 UpdateWrapperCommand 并知道为包含它的每个命令有效负载发出单独命令的工作。

您所建议的聚合加载优化实际上与实施批处理命令解决方案有关。虽然这在框架中绝对可行,但此功能尚未到位。 我建议您继续跟踪您创建的 issue 以跟踪它的进度。

希望这对您有所帮助,本杰明!