命令总是在一个地方处理?
Commands always handles in one place?
我读到过,在 NServiceBus 中,命令总是在一个地方处理。这是一般的 CQRS/event 采购经验法则吗?如果有,有什么好处?为什么横向扩展命令处理节点是个坏主意?
一个命令表示更改业务状态的特定部分的意图。只有一个命令处理程序是有意义的,即实现该功能的一个地方。此外,在命令处理程序中,我们实现了一个业务用例,它有自己的模型和边界。
您可以通过添加更多端点来扩展命令处理程序,但它是相同 代码运行 并行,这是一件有风险的事情,尤其是在分布式应用程序中。垂直扩展更容易也更便宜,但我想说很少有应用程序类型需要扩展命令端。
消息传递的潜在目标可以帮助我们通过保持每个组件和逻辑“服务”的自主性来实现组件之间的松散耦合。
一般来说,通过使用显式命名,应该清楚您希望消息处理程序做什么。结合“单一职责原则”(SRP),我们可以更好地分解我们的系统。例如,“UpdateUser”没有任何意义,而“UpdateUserPhoneNumber”或“ChangeUserPassword”更像是 :-)。
我们要确保我们不会混合逻辑(例如,所有这些都属于我的财务“服务”)和物理可部署服务(流程)。
可能有许多物理进程(windows 服务、IIS/WEB 进程、WCF、桌面应用程序)托管部分逻辑“服务”或混合多个逻辑“服务”。
使用 Command/Event 语义阐明了消息的意图和逻辑边界。
命令:
– 逻辑“服务”边界内组件之间的内部通信是使用命令完成的。
– 命令(顾名思义)可以命令逻辑“服务”边界内的另一个组件。
– 它们改变处理组件的状态。
– 它们包含组件(处理程序)执行其任务所需的数据和上下文。
– 命令被“发送”(使用 bus.Send() 使用 NServiceBus)到一个组件(处理程序)(一对一通信)。
事件:
– 事件用于跨逻辑“服务”通信。
– 他们通知过去发生的事情。
– 它们很轻,只包含 ID 等参考数据和少量上下文数据。
– 发布事件(bus.Publish() 使用 NServiceBus)
– 只有一个逻辑发布者和一个或多个订阅者。
– 事件也可以在内部松耦合组件之间的逻辑“服务”中使用。
总结:
使用带有逻辑“服务”边界内数据的命令来更改状态。
使用带有参考数据的事件进行跨逻辑“服务”通信。
遵循单一职责原则,这将有助于减少工作单元的大小。
降低耦合是我们的objective.
这有意义吗?
我读到过,在 NServiceBus 中,命令总是在一个地方处理。这是一般的 CQRS/event 采购经验法则吗?如果有,有什么好处?为什么横向扩展命令处理节点是个坏主意?
一个命令表示更改业务状态的特定部分的意图。只有一个命令处理程序是有意义的,即实现该功能的一个地方。此外,在命令处理程序中,我们实现了一个业务用例,它有自己的模型和边界。
您可以通过添加更多端点来扩展命令处理程序,但它是相同 代码运行 并行,这是一件有风险的事情,尤其是在分布式应用程序中。垂直扩展更容易也更便宜,但我想说很少有应用程序类型需要扩展命令端。
消息传递的潜在目标可以帮助我们通过保持每个组件和逻辑“服务”的自主性来实现组件之间的松散耦合。
一般来说,通过使用显式命名,应该清楚您希望消息处理程序做什么。结合“单一职责原则”(SRP),我们可以更好地分解我们的系统。例如,“UpdateUser”没有任何意义,而“UpdateUserPhoneNumber”或“ChangeUserPassword”更像是 :-)。
我们要确保我们不会混合逻辑(例如,所有这些都属于我的财务“服务”)和物理可部署服务(流程)。 可能有许多物理进程(windows 服务、IIS/WEB 进程、WCF、桌面应用程序)托管部分逻辑“服务”或混合多个逻辑“服务”。
使用 Command/Event 语义阐明了消息的意图和逻辑边界。
命令: – 逻辑“服务”边界内组件之间的内部通信是使用命令完成的。 – 命令(顾名思义)可以命令逻辑“服务”边界内的另一个组件。 – 它们改变处理组件的状态。 – 它们包含组件(处理程序)执行其任务所需的数据和上下文。 – 命令被“发送”(使用 bus.Send() 使用 NServiceBus)到一个组件(处理程序)(一对一通信)。
事件: – 事件用于跨逻辑“服务”通信。 – 他们通知过去发生的事情。 – 它们很轻,只包含 ID 等参考数据和少量上下文数据。 – 发布事件(bus.Publish() 使用 NServiceBus) – 只有一个逻辑发布者和一个或多个订阅者。 – 事件也可以在内部松耦合组件之间的逻辑“服务”中使用。
总结: 使用带有逻辑“服务”边界内数据的命令来更改状态。 使用带有参考数据的事件进行跨逻辑“服务”通信。 遵循单一职责原则,这将有助于减少工作单元的大小。 降低耦合是我们的objective.
这有意义吗?