nacos icon indicating copy to clipboard operation
nacos copied to clipboard

特殊场景下,listen 未推送最新值

Open Cczzzz opened this issue 5 months ago • 10 comments

特殊场景:

  • 一个主机同时启动两个进程
  • 两个进程都先get,然后做业务方法,然后listen 配置
  • 同时另外一个客户端会进行更新配置

因为两个进程会公用同一个磁盘缓存目录,第一次listen 时会读取磁盘上的md5值。所以以下情况时

时间 服务端客户端 服务端A 服务端B 磁盘缓存
T1 写入T1      
T2   Get V1   V1
T3 写入T2      
T4     Get V2 V2
T4   Listen 无返回 Listen 无返回 V2

如果配置不再更新,那么服务端A 将永远无法拿到V2 的值

Cczzzz avatar Feb 26 '24 03:02 Cczzzz

现在想到的方式是为磁盘缓存目录追加pid ,但是如何清理历史的目录就是个问题

Cczzzz avatar Feb 26 '24 03:02 Cczzzz

md5应该是内存级别的比对, 如果是不同的两个进程,内存是不共享的,应该不会出现这个情况。

KomachiSion avatar Feb 27 '24 01:02 KomachiSion

md5应该是内存级别的比对, 如果是不同的两个进程,内存是不共享的,应该不会出现这个情况。

第一次listen 是会读磁盘的

Cczzzz avatar Feb 27 '24 01:02 Cczzzz

可以通过不同进程指定不同缓存目录避免,或者指定nacos.cache.data.init.snapshot=false,让首次listen必定回调callback

KomachiSion avatar Feb 27 '24 01:02 KomachiSion

nacos.cache.data.init.snapshot

nacos.cache.data.init.snapshot go 客户端中 好像没这个配置项,java我看到了

Cczzzz avatar Feb 27 '24 01:02 Cczzzz

正常不同的服务端的本地缓存目录是不同的,不会相互影响

shiyiyue1102 avatar Feb 27 '24 01:02 shiyiyue1102

正常不同的服务端的本地缓存目录是不同的,不会相互影响 业务可能会使用固定目录

Cczzzz avatar Feb 27 '24 01:02 Cczzzz

本地

业务只能指定缓存目录的主目录,实际访问每个服务端的缓存目录nacos内部会在主目录下创建不同的缓存子目录

shiyiyue1102 avatar Feb 27 '24 06:02 shiyiyue1102

我看到

在go语言sdk中也可以加上这个机制

shiyiyue1102 avatar Feb 27 '24 09:02 shiyiyue1102

本地

业务只能指定缓存目录的主目录,实际访问每个服务端的缓存目录nacos内部会在主目录下创建不同的缓存子目录

我知道,但是现在就是他们访问的是同一个服务端

Cczzzz avatar Feb 27 '24 11:02 Cczzzz