轴突:单个聚合的多命令
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 以跟踪它的进度。
希望这对您有所帮助,本杰明!
我对细粒度 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 以跟踪它的进度。
希望这对您有所帮助,本杰明!