Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

服务优雅下线后,订阅通知不会触发 #104

Open
cc4dogman opened this issue Dec 28, 2022 · 7 comments
Open

服务优雅下线后,订阅通知不会触发 #104

cc4dogman opened this issue Dec 28, 2022 · 7 comments

Comments

@cc4dogman
Copy link

当所有节点都优雅下线后,通知过来的hosts为空,进而nacos-naming/lib/naming/host_reactor.js中去解析消息时
processServiceJSON(json) { const data = JSON.parse(json); const serviceInfo = new ServiceInfo(data); const oldService = this._serviceInfoMap.get(serviceInfo.getKey()); if (!serviceInfo.isValid) { return oldService; } ...
isValid为false,导致不触发通知,建议可以触发一次事件,hosts为空,避免程序需要轮询来解决

@piecepaper
Copy link

一样的问题 有解决吗? 回退版本吗

@piecepaper
Copy link

目前通过屏蔽PushReceiver达到订阅的数据是准的

import PushReceiver from "nacos-naming/lib/naming/push_receiver"
PushReceiver.prototype._handlePushMessage = () => {}

不过有一个缺点 没法立即知道变化

只能通过他自己的http不间断查询 默认10s

所以最长可能得20s后才能知道服务下线了

@svenjia
Copy link

svenjia commented Apr 7, 2024

一样的问题,所有hosts都下线了时,直接 触发了 host_reactor.js源码中的 processServiceJSON方法中的

if (!serviceInfo.isValid) {
      return oldService;
}
get isValid() {
    const valid = !!this.hosts;
    // 如果 this.hosts 是空数组要返回 false
    if (valid && Array.isArray(this.hosts)) {
      return this.hosts.length > 0;
    }
    return valid;
  }

看源码,作者应该是特意这么写的,但是不懂其中的缘由。
@ugrg

@keke1103
Copy link

我看 isValid 使用的地方只有在 host_reactor.js 使用了, 我强行改成 return true ,到达了预期效果。

get isValid() {
    const valid = !!this.hosts;
    if (valid && Array.isArray(this.hosts)) {
      return true;
    }
    return valid;
  }

@wyhooo
Copy link

wyhooo commented Apr 20, 2024

看了 Java 和 Go 的代码,发现这里对于 hosts 为空的处理逻辑是一致的,会返回上次缓存的数据。

@ugrg
Copy link
Contributor

ugrg commented Apr 26, 2024

我现在也被这个问题坑在这,所有的服务都下线了,getAllInstances还能看到最后一个下线的服务。

@JxJPu9bD
Copy link

我也是, 我现在就想监控服务运行状态,
无论subscribe还是 getAllInstances 都不会变化, 只有控制台的
[HostReactor] updateServiceNow() serviceName:

才能感知到

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants