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

Nacos1.4+版本服务监听异常 #6864

Closed
HTFX-Cloud opened this issue Sep 13, 2021 · 14 comments
Closed

Nacos1.4+版本服务监听异常 #6864

HTFX-Cloud opened this issue Sep 13, 2021 · 14 comments
Labels
priority/low Not important, can be finish by new contributors. status/need feedback

Comments

@HTFX-Cloud
Copy link

本地使用nacos1.3.2与nacos1.4.2客户端分别对nacos已存在注册的服务进行监听。
服务端代码截图:
分别在不同命名空间下注册不同端口的web应用
image

客户端截图:
1.本地尝试进行nacos1.4.2客户端模拟,如图所示。服务的event与namingservice不能一一对应
image
2.本地使用同样测试代码,nacos1.3.2客户端模拟,如图所示。可以保证服务的event与namingservice可以一一对应
image

目前不清楚,nacos1.4.2+(本地使用nacos 2.0+也存在该问题)这个客户端呈现的效果【namingevent给所有的Subscriber都发送通知】,是bug还是设计。要是设计,那我们需要对客户端的使用进行改造。

望尽快答复。谢谢

@realJackSun
Copy link
Collaborator

目前不清楚,nacos1.4.2+(本地使用nacos 2.0+也存在该问题)这个客户端呈现的效果【namingevent给所有的Subscriber都发送通知】,是bug还是设计。

从你的描述看,nacos1.4.2似乎出现了和你预期不一致的现象?你预期看到的是什么现象可以描述清楚么?

@realJackSun realJackSun added status/need feedback priority/low Not important, can be finish by new contributors. labels Sep 13, 2021
@HTFX-Cloud
Copy link
Author

HTFX-Cloud commented Sep 13, 2021

我贴了图片,不知道能不能看见。如同上面的图片二所示。

【简单描述】
nacos客户端对【不同命名空间】下的【同名服务】进行监听(本地测试使用了两个namingservice)。在nacos控制台上任选其中【一个命名空间的服务】进行上下线,会接受到【两个服务通知】。

【期待效果】
希望能与同样的测试代码在nacos1.3.2上测试结果一致,【保证namingservice与namingevent一一对应】。即nacos控制台上任选其中【一个命名空间的服务】进行上下线,只接受到【所属namingservice】的【一个服务通知】。

【源码跟踪】
跟踪nacos1.3.2的源码发现,事件通知堆栈信息如下
Daemon Thread [com.alibaba.nacos.naming.client.listener] (Suspended (breakpoint at line 499 in NacosRegistry))
NacosRegistry.lambda$subscribeEventListener$10(URL, String, NotifyListener, Event) line: 499
535910992.onEvent(Event) line: not available
EventDispatcher$Notifier.run() line: 177
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1149
ThreadPoolExecutor$Worker.run() line: 624
Thread.run() line: 748
跟踪nacos1.4.2的源码发现,事件通知堆栈信息如下
Daemon Thread [nacos.publisher-com.alibaba.nacos.client.naming.event.InstancesChangeEvent] (Suspended)
NacosRegistry(AbstractRegistry).notify(URL, NotifyListener, List) line: 409
NacosRegistry(FailbackRegistry).doNotify(URL, NotifyListener, List) line: 372
NacosRegistry(FailbackRegistry).notify(URL, NotifyListener, List) line: 364
NacosRegistry.notifySubscriber(URL, NotifyListener, Collection) line: 534
NacosRegistry.lambda$subscribeEventListener$10(URL, String, NotifyListener, Event) line: 512
1678856266.onEvent(Event) line: not available
InstancesChangeNotifier.onEvent(InstancesChangeEvent) line: 125
InstancesChangeNotifier.onEvent(Event) line: 39
DefaultPublisher$1.run() line: 198
DefaultPublisher.notifySubscriber(Subscriber, Event) line: 208
DefaultPublisher.receiveEvent(Event) line: 186
DefaultPublisher.openEventHandler() line: 117
DefaultPublisher.run() line: 94

@HTFX-Cloud
Copy link
Author

目前不清楚,nacos1.4.2+(本地使用nacos 2.0+也存在该问题)这个客户端呈现的效果【namingevent给所有的Subscriber都发送通知】,是bug还是设计。

从你的描述看,nacos1.4.2似乎出现了和你预期不一致的现象?你预期看到的是什么现象可以描述清楚么?

能看见最上面issue中的图片二么

@HTFX-Cloud
Copy link
Author

HTFX-Cloud commented Sep 13, 2021

目前不清楚,nacos1.4.2+(本地使用nacos 2.0+也存在该问题)这个客户端呈现的效果【namingevent给所有的Subscriber都发送通知】,是bug还是设计。

从你的描述看,nacos1.4.2似乎出现了和你预期不一致的现象?你预期看到的是什么现象可以描述清楚么?

【1.4+现状描述】
nacos客户端对【不同命名空间】下的【同名服务】进行监听(本地测试使用了两个namingservice)。在nacos控制台上任选其中【一个命名空间的服务】进行上下线,会接受到【两个服务通知】。

【期待效果】
希望与nacos1.3.2上测试结果一致,【保证namingservice与namingevent一一对应】。即nacos控制台上任选其中【一个命名空间的服务】进行上下线,只接受到【所属namingservice】的【一个服务通知】。

@HTFX-Cloud
Copy link
Author

@realJackSun

@lpaz010
Copy link
Contributor

lpaz010 commented Nov 11, 2021

@realJackSun @HTFX-Cloud 两位看这样理解是否合理哈:
同一个jvm虚拟机实例里面NotifyCenter是单例,所以用不同的NamingService实例注册监听器都在一个单例里面,对一个Naming事件触发都会通知到各自监听器里面,所谓的跨namespace了。

结论:一个应用实例(jvm实例)一个namespace才是本来设计。

@JasonMing
Copy link

@realJackSun @HTFX-Cloud 两位看这样理解是否合理哈: 同一个jvm虚拟机实例里面NotifyCenter是单例,所以用不同的NamingService实例注册监听器都在一个单例里面,对一个Naming事件触发都会通知到各自监听器里面,所谓的跨namespace了。

结论:一个应用实例(jvm实例)一个namespace才是本来设计。

这个解释站不住脚。。。
比如我有多个区域的,互相隔离的,优先使用本地区域,出问题使用非本地区域。。。

这种多naming service的场景比比皆是,设计上NamingService之间本来就应该是完整隔离的,一个NotifyCenter把东西都乱窜了。。。
我是不知道是基于什么样的目的搞得static满天飞,nacos是这样,sentinel是这样,fastjson/dubbo也喜欢这样。。。
搞到现在我对阿里系的框架都没信心了。。。

@JasonMing
Copy link

@horizonzy 请关注下这个问题

2020 年这个 PR #4137 中,把专用的 eventDispatcher 改为全局共享的 NotifyCenter
这个改动导致了nacos 1.4.1以后的所有版本在订阅多个注册中心时,任何一个注册中心触发变更都会广播到所有 NamingService 中。

想问问当时出于什么目的改为这种全局共享的通知?现在可以提供一个PR修复吗?

@horizonzy
Copy link
Collaborator

当时这个 pr 是重构,统一事件的通知。看起来确实是有问题

@liqipeng
Copy link
Contributor

应该与我前面提的 #8428 是一个问题,修复思路见 #8433 (comment)

@horizonzy
Copy link
Collaborator

应该与我前面提的 #8428 是一个问题,修复思路见 #8433 (comment)

👌

@horizonzy
Copy link
Collaborator

@JasonMing @HTFX-Cloud 请测试下新版本,看起来已经修复了。

@elvislou
Copy link

elvislou commented Jul 1, 2022

@horizonzy 哪个版本修复了?

@liqipeng
Copy link
Contributor

liqipeng commented Jul 4, 2022

@elvislou 目前还只是在开发分支上,可能会在1.4.4或2.1.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
priority/low Not important, can be finish by new contributors. status/need feedback
Projects
None yet
Development

No branches or pull requests

7 participants