在 DDD 中,命令是否严格同步 API 调用?
In DDD, are Commands strictly synchronous API calls?
当我读到有关 DDD 上下文中的命令时,它通常被描述为 API 调用。
在本例中,服务A向服务B发送命令。
serviceA -> serviceB
在我的理解中,命令是对某事的具体行动。所以从技术上讲,这也可以以异步形式出现。也许在消息队列中发送命令消息。
serviceA -> queue -> serviceB
命令是严格同步的 API 调用,还是可以是异步的?
domain-driven 设计上下文中的命令:
命令 - 在 domain-driven 设计的上下文中 - 代表在系统中发生某事的意图,这会导致某些期望的结果执行后。所以它可以看作是一些对象,包含了命令接收者执行命令所需的所有信息。
因此,在 domain-driven 设计中谈论命令 时 在 中没有技术定义或限制 命令可以通过什么方式被触发和传输 或所需信息的表示方式.
命令应该首先从业务角度进行描述,以找出系统上下文中的什么或谁将触发它以及何时触发。以及命令执行后的预期状态。
命令可以是triggered/transmitted,例如以下几种方式:
- 当用户单击网站上的按钮时执行一些同步 REST 请求
- 将异步消息(例如从一个微服务)发送到命令接收器(例如另一个微服务)的消息队列
- 执行 gRPC 调用(例如,从一个微服务到另一个微服务)
- 单击桌面应用程序 UI 中的按钮
- 正在执行计划的后台任务
业务上下文中的命令可以是,例如:
- 在在线商店中检查当前的购物篮以启动订单
- 在 Whosebug 上投票和回答并增加答案的投票
在 domain-driven 设计的上下文中 如果命令是同步或异步执行的,它只是一些实现细节 。重要的是,执行成功后,预期的结果就会发生。
执行同步API调用时触发命令的组件可以获得反馈 如果命令通过,则通过同步应答。
而在异步命令传输(如消息传递)中,您只会知道消息已传递到某个队列,但命令的成功执行必须以其他方式来感知。通过查询所涉及域实体的当前状态,或者通过利用一些event-based 机制 执行命令后发布事件,任何感兴趣的各方都可以订阅这些事件。
TL;DR
回到你的问题:
When I read about Command in the DDD Context, it is usually described as an API call.
API调用本身只是命令的技术数据表示和传递
Are Commands strictly synchronous API calls, or can be asynchronous?
相同的命令可以以不同的方式触发(参见前面的示例),然后以不同的方式再次传输。但无论如何触发或如何传输,它都必须包含相同的所需信息,并在执行后在整个系统中产生相同的预期结果。
所以,是的它当然也可以是异步的。
当我读到有关 DDD 上下文中的命令时,它通常被描述为 API 调用。
在本例中,服务A向服务B发送命令。
serviceA -> serviceB
在我的理解中,命令是对某事的具体行动。所以从技术上讲,这也可以以异步形式出现。也许在消息队列中发送命令消息。
serviceA -> queue -> serviceB
命令是严格同步的 API 调用,还是可以是异步的?
domain-driven 设计上下文中的命令:
命令 - 在 domain-driven 设计的上下文中 - 代表在系统中发生某事的意图,这会导致某些期望的结果执行后。所以它可以看作是一些对象,包含了命令接收者执行命令所需的所有信息。
因此,在 domain-driven 设计中谈论命令 时 在 中没有技术定义或限制 命令可以通过什么方式被触发和传输 或所需信息的表示方式.
命令应该首先从业务角度进行描述,以找出系统上下文中的什么或谁将触发它以及何时触发。以及命令执行后的预期状态。
命令可以是triggered/transmitted,例如以下几种方式:
- 当用户单击网站上的按钮时执行一些同步 REST 请求
- 将异步消息(例如从一个微服务)发送到命令接收器(例如另一个微服务)的消息队列
- 执行 gRPC 调用(例如,从一个微服务到另一个微服务)
- 单击桌面应用程序 UI 中的按钮
- 正在执行计划的后台任务
业务上下文中的命令可以是,例如:
- 在在线商店中检查当前的购物篮以启动订单
- 在 Whosebug 上投票和回答并增加答案的投票
在 domain-driven 设计的上下文中 如果命令是同步或异步执行的,它只是一些实现细节 。重要的是,执行成功后,预期的结果就会发生。
执行同步API调用时触发命令的组件可以获得反馈 如果命令通过,则通过同步应答。
而在异步命令传输(如消息传递)中,您只会知道消息已传递到某个队列,但命令的成功执行必须以其他方式来感知。通过查询所涉及域实体的当前状态,或者通过利用一些event-based 机制 执行命令后发布事件,任何感兴趣的各方都可以订阅这些事件。
TL;DR
回到你的问题:
When I read about Command in the DDD Context, it is usually described as an API call.
API调用本身只是命令的技术数据表示和传递
Are Commands strictly synchronous API calls, or can be asynchronous?
相同的命令可以以不同的方式触发(参见前面的示例),然后以不同的方式再次传输。但无论如何触发或如何传输,它都必须包含相同的所需信息,并在执行后在整个系统中产生相同的预期结果。
所以,是的它当然也可以是异步的。