[apache/dubbo]同一个ip,身份由 provider 跳变为 consumer,会导致死循环调用?

2023-12-18 703 views
8

背景:有某IP pod,一开始是作为A服务的provider,端口号20880。后来该IP POD下线。 过了一段时间后,一个新的consumer 使用了该IP,端口号也为20880。

现象:新的consumer 使用了该IP后,原先A服务的consumer一直持续调用该IP,报错: “ Failed to invoke the method xxx in the service xxx. Tried 3 times of the providers [IP:20880] (1/1) from the registry nacos-headless:8848 ” 其实A服务还有其他若干个provider,但是不知道为什么,在该IP上调用失败后,不会容错地调用其余的几个provider。

Environment
  • Dubbo version: 3.0.9
  • Nacos version:2.0.2
  • Operating System version: xxx
  • Java version: 17

回答

2

之前进程强制关闭的么,还是正常停止的

0

是服务部署,该ip下线,进程应该属于正常停止

3

先断网后关闭的进程么

5

我大概明白你意思,可能是断网导致IP没有发送出去下线通知。 没有优雅下线。 这个是可能的。 但是我目前的重点疑问是在,即使该IP没有正常下线,为什么调用该IP失败后dubbo不会去尝试调用其他的provider,这个问题上。provider列表数量变为了1,只有这个IP。其他的provider丢失了。

9

你看下你这个问题是必现的么,如果非必现可以看下默认的负载均衡算法: RandomLoadBalance 的算法思想比较简单,在经过多次请求后,能够将调用请求按照权重值进行“均匀”分配。当然 RandomLoadBalance 也存在一定的缺点,当调用次数比较少时,Random 产生的随机数可能会比较集中,此时多数请求会落到同一台服务器上。这个缺点并不是很严重,多数情况下可以忽略。RandomLoadBalance 是一个简单,高效的负载均衡实现,因此 Dubbo 选择它作为缺省实现。 https://cn.dubbo.apache.org/zh-cn/docsv2.7/dev/source/loadbalance/

5

“Tried 3 times of the providers [IP:20880] (1/1) ” 看起来,我的providers列表是1. 应该不是N选1由于概率问题一直选到某一个,而是只有一个,所以100%命中了那个。

0

即命中源码中的这个逻辑了: // 如果 invokers 列表中仅有一个 Invoker,直接返回即可,无需进行负载均衡 if (invokers.size() == 1) return invokers.get(0);