Skip to content

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

@HUWEIWEI0105

Description

@HUWEIWEI0105

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/Namingkind/bugCategory issues or prs related to bug.

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions