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

关于永久实例的元数据生命周期的疑问 #13027

Open
HUWEIWEI0105 opened this issue Jan 9, 2025 · 2 comments
Open

关于永久实例的元数据生命周期的疑问 #13027

HUWEIWEI0105 opened this issue Jan 9, 2025 · 2 comments

Comments

@HUWEIWEI0105
Copy link

HUWEIWEI0105 commented Jan 9, 2025

nacos版本:2.4.3

问题

目前发现永久实例调用deregisterInstance注销后,即使过了元数据过期时间,再次进行注册,原来的运维时元数据依然存在。临时实例不存在此问题。

根据官方文档介绍,元数据生命周期这里存在一些疑问,想请教一下:

  1. 对于永久实例来说,运维时元数据是否应该在实例被注销后自动删除,还是说设计上就是需要主动调用updateInstance来删除,目前看起来运维时元数据过期只对临时实例有效。
  2. 如果不调用updateInstance来删除,运维时元数据是否永久存在。目前看运维时元数据走raft协议落盘,按理来说committed的数据不会丢失,但《Nacos架构与原理》中有一段描述:Raft 协议不必多言,基于 Leader 进行写入,其 CP 也并不是严格的,只是能保证⼀半所见⼀致,以及数据的丢失概率较小。请问这个数据的丢失概率较小主要是指什么情况会丢失数据呢?那是否走raft协议持久化后的运维时元数据也有小概率会被丢失?

复现步骤

  1. 首先注册一个永久实例。
  2. 在console/API添加运维时元数据。
  3. 注销永久实例。
  4. 等待一段时间(超过元数据过期时间)再次注册此永久实例。之前添加的运维时元数据还存在,没有过期被删除。
    image

代码分析

永久实例

在永久实例注销时会删除client注册的服务:
image
NamingMetadataManager处理ClientDisconnectEvent时这里已获取不到client的服务信息,因此不会将元数据设置为过期:
image
日志信息:
image

临时实例

在临时实例注销时会同时发送InstanceMetadataEvent,NamingMetadataManager处理InstanceMetadataEvent会将元数据设置为过期,因此临时实例不存在该问题:
image

@KomachiSion
Copy link
Collaborator

意思是持久化服务的实例,元数据不会被标记为过期,不会被移除吗?

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

No branches or pull requests

2 participants