From fbac5fa25e7a0b5d8104e70bf15edd873b68d66e Mon Sep 17 00:00:00 2001 From: guoquanwei <31917049+guoquanwei@users.noreply.github.com> Date: Thu, 16 May 2024 10:04:49 +0800 Subject: [PATCH] fix(contrib/registry/nacos): Abnormal blocking of the Subscribe and Next methods. (#3320) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(contrib/registry/nacos):Abnormal blocking of the Subscribe and Next methods. This submission can solve the channel blocking problem during service discovery, as well as the channel message missing problem when the GRPC idle state changes.  The first scenario is when both the configuration center and registration center are initialized at the same time during service startup, and the SubscribeCallback method will be triggered twice, throwing the error "over time discovering the creation of observers", resulting in a discovery failure. The second scenario occurs after NotLoadCacheAtStart: true. When grpc exits the idle state, calling newWatcher again will not trigger the SubscribeCallback method, causing the Next function to be blocked and the service to be unable to communicate. * Another implementation, the effect remains unchanged --- contrib/registry/nacos/watcher.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contrib/registry/nacos/watcher.go b/contrib/registry/nacos/watcher.go index 6fd59b378a2..7f1dc84663a 100644 --- a/contrib/registry/nacos/watcher.go +++ b/contrib/registry/nacos/watcher.go @@ -41,10 +41,17 @@ func newWatcher(ctx context.Context, cli naming_client.INamingClient, serviceNam Clusters: clusters, GroupName: groupName, SubscribeCallback: func(services []model.SubscribeService, err error) { - w.watchChan <- struct{}{} + select { + case w.watchChan <- struct{}{}: + default: + } }, } e := w.cli.Subscribe(w.subscribeParam) + select { + case w.watchChan <- struct{}{}: + default: + } return w, e }