-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Labels
Milestone
Description
nacos版本:2.4.3
问题
目前发现永久实例调用deregisterInstance注销后,即使过了元数据过期时间,再次进行注册,原来的运维时元数据依然存在。临时实例不存在此问题。
根据官方文档介绍,元数据生命周期这里存在一些疑问,想请教一下:
- 对于永久实例来说,运维时元数据是否应该在实例被注销后自动删除,还是说设计上就是需要主动调用updateInstance来删除,目前看起来运维时元数据过期只对临时实例有效。
- 如果不调用updateInstance来删除,运维时元数据是否永久存在。目前看运维时元数据走raft协议落盘,按理来说committed的数据不会丢失,但《Nacos架构与原理》中有一段描述:Raft 协议不必多言,基于 Leader 进行写入,其 CP 也并不是严格的,只是能保证⼀半所见⼀致,以及数据的丢失概率较小。请问这个数据的丢失概率较小主要是指什么情况会丢失数据呢?那是否走raft协议持久化后的运维时元数据也有小概率会被丢失?
复现步骤
代码分析
永久实例
在永久实例注销时会删除client注册的服务:
NamingMetadataManager处理ClientDisconnectEvent时这里已获取不到client的服务信息,因此不会将元数据设置为过期:
日志信息:
临时实例
在临时实例注销时会同时发送InstanceMetadataEvent,NamingMetadataManager处理InstanceMetadataEvent会将元数据设置为过期,因此临时实例不存在该问题: