Nacos服务发现并发启动scheduleUpdate定时任务
创始人
2024-06-02 23:45:18
0

文章目录

  • 一、前言
  • 二、服务发现“懒加载”机制
    • 1、服务发现流程
    • 2、HostReactor#scheduleUpdateIfAbsent()
    • 3、DCL

一、前言

Nacos系列文章目前已出:

  1. Nacos高可用集群搭建
  2. Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
  3. Nacos优先使用本地Nacos配置文件验证,源头LocalConfigInfoProcessor.getFailover()
  4. 图文详述Nacos服务发现源码分析
  5. 图文详述Nacos服务注册源码分析
  6. Spring ApplicationContext的事件机制是什么?在Nacos中如何应用?
  7. 图文源码分析Nacos如何实时感知服务提供者实例信息/个数的变更?

博主今天复习Nacos源码的时候,发现了一个算是有意思的细节点,这里分享一下。

二、服务发现“懒加载”机制

当nacos客户端运⾏起来之后,它只是去做服务注册、配置获取等操作;并不会立即去请求服务信息;当第一次请求时候,才会去获取服务,即懒加载机制

1、服务发现流程

在这里插入图片描述

Client端做服务发现时,无论是否能从本地缓存中获取到服务实例信息,都会启动一个定时任务(每秒做一次服务实例信息的更新)。然而由于可能多个请求同时要做服务发现,这样总不能每一次做服务发现时都去启动一个定时任务做服务实例信息更新吧。所以肯定要有一个机制去确保针对某一个Cluster下的Service,当前Client只会启动一个定时任务。

2、HostReactor#scheduleUpdateIfAbsent()

HostReactor#scheduleUpdateIfAbsent()方法负责启动做服务实例信息更新的定时任务。
从方法名也能看出来:是当定时任务不存在时,才会启动一个定时任务

在这里插入图片描述

private final Map> futureMap = new HashMap>();public void scheduleUpdateIfAbsent(String serviceName, String clusters) {if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) != null) {return;}synchronized (futureMap) {if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) != null) {return;}ScheduledFuture future = addTask(new UpdateTask(serviceName, clusters));futureMap.put(ServiceInfo.getKey(serviceName, clusters), future);}
}

看一下这个代码逻辑:

  • 为了防止一个实例开启多个这种定时任务,会用一个Map来去重,针对这个Map的数据添加会采用一个类似双重检查锁的机制,确保Map添加数据的线程安全性。
  • 如果futureMap中已经有了当前服务,则方法直接返回。
    • 这一步是为了减少不必要的同步操作。
  • 否则,对futureMap对象加synchronized锁;同步代码块需要再进一步判断futureMap不为空。
    • 因为在多线程并发场景下,可能多个线程判断futureMap中都没有当前服务,都进入到同步代码块,一个线程进入同步代码块,将当前服务添加到futureMap中。
    • 其他线程获取到锁之后再进入到同步代码块,再次判断futureMap中是否含有当前服务,如果含有,则方法直接返回。
    • 假如同步代码中不判空,会重复执行将当前服务添加到futureMap中的操作。

既然是DCL的变种版,为了futureMap没有被volatile关键字修饰,不会有指令重排序的问题吗?

  • 并不会,futureMap.put()是Map的添加数据操作,和对象初始化是两种场景。

3、DCL

Double check Lock确保类单例的代码如下:

public class DoubleCheckLazySingleton {private volatile static DoubleCheckLazySingleton singleton;private DoubleCheckLazySingleton() {}public DoubleCheckLazySingleton getSingleton() {if (singleton == null) {synchronized (this) {//只有在singleton为null的时候才创建实例if (singleton == null) {singleton = new DoubleCheckLazySingleton();}}}return singleton;}
}

相关内容

热门资讯

火爆手机正规红中麻将群@202... 微【ab120590】 【mj120590】【tj525555】等风也等你。喜欢打麻将的兄弟姐妹们、...
谷爱凌劝女孩不要节食减肥,节食... 谷爱凌劝女孩不要节食减肥,节食减肥会如何影响身体健康?节食减肥会导致身体营养不良,影响体内的代谢水平...
校园番剧《青春之旅》中的恋爱情... 校园番剧《青春之旅》中的恋爱情节设计的怎么样?《青春之旅》是一部讲述正值青春年华的少年少女爱情故事的...
很多艺人自己开了公司,哪位艺人... 很多艺人自己开了公司,哪位艺人最有老板风范?应该就是杨幂最有老板的风范,因为她其实气场还是比较强大的...
感伤无法解释 浪漫至死是什么意... 感伤无法解释 浪漫至死是什么意思“感伤无法解释,浪漫至死”的意思是:很多时候人们内心的悲伤是没有办法...
轩辕剑5:星曜石(氏)的收集遇... 轩辕剑5:星曜石(氏)的收集遇到些问题,好头痛!过一阵子再去,在结局之前去看就好了迷宫门口,转个视角...
对妈妈说的心里话(偏心之类的)... 对妈妈说的心里话(偏心之类的)作文 11年前,是你让我这个小生命来到了人间,从此璀璨的星空中便多了一...
关于日剧里的吻戏? 关于日剧里的吻戏?看了很多日剧了,突然发现日剧里很少有吻戏。虽然这样说很不好意思,但是我真的很奇怪!...
精灵梦叶罗丽中,有哪些“土豪”... 精灵梦叶罗丽中,有哪些“土豪”?在叶罗丽中最隐形的富豪应该就是金王子挥金如土,其次我认为就是那个白光...
总是担心家门,车门没锁怎么办 总是担心家门,车门没锁怎么办你好,每次下车记得锁门。出门的时候多检查几遍这属于强迫症的一种,没有办法...
船山公是谁 船山公是谁船山公生平,有哪些突出贡献.  船山公又称王船山,是明末清初著名思想家王夫之。  王夫之(...
罗晋都演过什么? 今年将播出的... 罗晋都演过什么? 今年将播出的又都有哪些? 都上过什么综艺?我那会刚看他的电视剧是叫“美人心计”,不...
求好看的小说,看过还想再看一次... 求好看的小说,看过还想再看一次的!言情小说的话 看古灵的 出嫁从夫系列很棒 其他的也很好看嗨,我...
9款14批次假水玩具硼元素全部... 9款14批次假水玩具硼元素全部超标,这种元素对孩子影响有多大?影响是非常大的,因为这些东西是会影响孩...
世界上真的有叶罗丽仙子吗? 世界上真的有叶罗丽仙子吗?没有。把? 虚构的没有,虚构的。。。只是个动画而已。。。如果者都有,那么...