public class DemoServiceImpl implements DemoService{}
复制代码
Deadline 机制
我们来分析一下以上调用链路以及可能出现的超时情况:
A 调用 B 设置了超时时间 5s,因此 B -> C -> D 总计耗时不应该凌驾 5s,否则 A 就会收到超时非常
在任何情形下,只要 A 等待 5s 没有收到响应,整个调用链路就可以被终止了(如果此时 C 正在运行,则 C -> D 就没有发起的意义了)
理论上 B -> C、C -> D 都有本身独立的超时时间设置,超时计时也是独立计算的,它们不知道 A 作为调用发起方是否超时
在 Dubbo 框架中,A -> B 的调用就像一个开关,一旦启动,在任何情形下整个 A -> B -> C -> D 调用链路都会被完整实行下去,即便调用方 A 已经超时,后续的调用动作仍会继续。这在一些场景下是没故意义的,尤其是链路较长的情况下会带来不必要的资源斲丧,deadline 就是设计用来解决这个问题,通过在调用链路中传递 deadline(deadline初始值即是超时时间,随着时间流逝而减少)可以确保调用链路只在有用期内实行,deadline 斲丧殆尽之后,调用链路中其他尚未实行的任务将被取消。
因此 deadline 机制就是将 B -> C -> D 当作一个整体看待,这一系列动作必须在 5s 之内完成。随着时间流逝 deadline 会从 5s 逐步扣减,后续每一次调用实际可用的超时时间即是当前 deadline 值,好比 C 收到请求时已经过去了 3s,则 C -> D 的超时时间只剩下 2s。