IDDD红皮书:第13章整合有界上下文,RESTful时间解耦

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的依赖

书的第458页

“尽管如此,我们可以通过制造依赖性在一定程度上克服这一点 在RESTful资源上,消费者自主性的障碍较小。 即使RESTful(或者RPC)是您唯一的方法 要集成,可以创建时间解耦的幻觉 通过在你自己的系统中使用定时器或消息传递 您的系统将仅在 计时器超时或收到消息时。如果 系统不可用,可以取消计时器阈值,或 如果使用消息传递,则可以对消息进行负面确认 “经纪人和重新交付”

上下文:

  • 我有一个客户服务C

  • 我有一个服务器服务

  • C--调用-->S

  • 我想增加C的自治性,减少对S的依赖

问题:

  • 书中说(在上面的段落中),我可以使用定时器或消息传递来使用“时间解耦”。对我来说,这意味着C不再需要阻塞并等待S的立即响应?对吗?

  • 使用计时器的时间解耦:C仅在计时器过期时对S进行调用,如果远程系统不可用,则会取消计时器阈值。这是什么意思?你能澄清一下吗?
    我知道C只在定时器超过10秒的时候才调用,例如?对吗?
    不清楚“计时器阈值已后退”对此有何帮助?

  • 使用消息传递的时间解耦:C仅在收到消息时对S进行调用,如果远程系统不可用,则会对消息进行负面确认。这是什么意思?你能澄清一下吗?
    C仅在从何处收到“收到消息”时调用S?
    如果未收到消息,则“…消息可以向代理进行负面确认并重新发送”,不清楚此处的事件顺序

如果可以,请举例说明。多谢各位

书上说(在上面的段落中)我可以使用“时态” 使用计时器或消息传递“解耦”。这对我来说意味着C不 是否需要更长时间的阻塞和等待S的立即响应?是吗 对吗

是的,当上游BC(服务器)提供RESTAPI而不是将消息发布到中间件队列时,它用于实现两个有界上下文(BC)之间的异步集成

使用计时器的时间解耦:C仅在使用计时器时调用S 时间流逝,如果远程系统不可用,则定时器 阈值被取消。这是什么意思?你能澄清一下吗?我 了解C仅在计时器超过10秒时进行调用 例子?对吗?不清楚“计时器阈值”是如何备份的 “关”能帮上忙吗

因此,下游BC(C)与上游BC(S)的集成是通过在每次计时器经过时轮询S的REST API实现的(例如,如您所说,每10秒轮询一次)。在API不可用时关闭计时器阈值,意味着客户端将在正常时间间隔重试轮询,计时器无关紧要

示例:

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中,我认为有实现),我不知道这是否意味着重置计时器(或者干脆停止它)。我所知道的是,如果服务在