IDDD红皮书:第13章整合有界上下文,RESTful时间解耦
书的第458页 “尽管如此,我们可以通过制造依赖性在一定程度上克服这一点 在RESTful资源上,消费者自主性的障碍较小。 即使RESTful(或者RPC)是您唯一的方法 要集成,可以创建时间解耦的幻觉 通过在你自己的系统中使用定时器或消息传递 您的系统将仅在 计时器超时或收到消息时。如果 系统不可用,可以取消计时器阈值,或 如果使用消息传递,则可以对消息进行负面确认 “经纪人和重新交付” 上下文:IDDD红皮书:第13章整合有界上下文,RESTful时间解耦,rest,domain-driven-design,integration,bounded-contexts,Rest,Domain Driven Design,Integration,Bounded Contexts,书的第458页 “尽管如此,我们可以通过制造依赖性在一定程度上克服这一点 在RESTful资源上,消费者自主性的障碍较小。 即使RESTful(或者RPC)是您唯一的方法 要集成,可以创建时间解耦的幻觉 通过在你自己的系统中使用定时器或消息传递 您的系统将仅在 计时器超时或收到消息时。如果 系统不可用,可以取消计时器阈值,或 如果使用消息传递,则可以对消息进行负面确认 “经纪人和重新交付” 上下文: 我有一个客户服务C 我有一个服务器服务 C--调用-->S 我想增加C的自治性,减少对S的依赖
- 我有一个客户服务C
- 我有一个服务器服务
- C--调用-->S
- 我想增加C的自治性,减少对S的依赖
- 书中说(在上面的段落中),我可以使用定时器或消息传递来使用“时间解耦”。对我来说,这意味着C不再需要阻塞并等待S的立即响应?对吗?
- 使用计时器的时间解耦:C仅在计时器过期时对S进行调用,如果远程系统不可用,则会取消计时器阈值。这是什么意思?你能澄清一下吗?
我知道C只在定时器超过10秒的时候才调用,例如?对吗?
不清楚“计时器阈值已后退”对此有何帮助? - 使用消息传递的时间解耦:C仅在收到消息时对S进行调用,如果远程系统不可用,则会对消息进行负面确认。这是什么意思?你能澄清一下吗?
C仅在从何处收到“收到消息”时调用S?
如果未收到消息,则“…消息可以向代理进行负面确认并重新发送”,不清楚此处的事件顺序
C --POLL--> S @ 00:00
C --POLL--> S @ 00:10
C --POLL--> S @ 00:20
C --POLL--> S @ "every 10 sec"
S is-down
C --POLL--> S @ 00:00 (timer is backed-off)
S is-down
C --POLL--> S @ 00:00 (timer is backed-off)
S is-up
C --POLL--> S @ 00:10
C --POLL--> S @ 00:20
C --POLL--> S @ "every 10 sec"
使用消息传递的时间解耦:C仅在
收到消息,如果远程系统不可用,则
消息被否定地确认。这是什么意思?你能
澄清?C仅在从接收到“收到消息”时调用S
哪里如果没有收到任何消息,那么“…消息可以
向经纪人进行负面确认并重新交付”,不清楚
这里的事件顺序
每次C接收到由客户端BC内的内部代理发布的消息(不是C和S之间的消息队列)时,都会进行轮询,而不是使用计时器。向代理返回否定的确认是对代理说它必须重新传递消息(因为无法执行对S的调用)。因此,代理将再次向C发送相同的消息,C将重试对S的调用
更新:
以下是沃恩·弗农(Vaughn Vernon)在其另一本书《DDD蒸馏》中关于该主题的论述:
“与REST异步运行
可以使用基于REST的轮询连续增长的资源集来完成异步消息传递。使用后台处理,客户端将连续轮询提供不断增加的域事件集的服务Atom提要资源。这是一种安全的方法来维护服务和客户端,同时提供服务中继续发生的最新事件。如果服务因某种原因变得不可用,客户端只需在正常时间间隔重试,或通过重试退出,直到提要资源再次可用
在实现域驱动设计时详细讨论了这种方法。“确实需要了解C和S所做工作的更多细节,但这可能值得一读。我在上面添加了一个计时器示例。我理解计时器被退回的方式是它回到零,对吗?在这里使用计时器的好处是,如果客户端看到00:00,它应该至少等待10秒吗?如果它看到非零,那么它知道S很有可能仍然可用?在消息传递的情况下,我假设代理正在持续发送消息,而这些消息仅作为轮询S的触发器?在这种情况下,如果C接收到轮询S的代理消息,并且S关闭:C应该只等待下一个prod消息,即看不到来自C的NAK消息的使用?我从来没有实现过该算法(在红皮书IDDD中,我认为有实现),我不知道这是否意味着重置计时器(或者干脆停止它)。我所知道的是,如果服务在