最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nacos服務發(fā)現(xiàn)并發(fā)啟動scheduleUpdate定時任務的流程分析

 更新時間:2023年02月23日 09:18:17   作者:禿禿愛健身  
這篇文章主要介紹了Nacos服務發(fā)現(xiàn)并發(fā)啟動scheduleUpdate定時任務,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、前言

博主今天復習Nacos源碼的時候,發(fā)現(xiàn)了一個算是有意思的細節(jié)點,這里分享一下。

二、服務發(fā)現(xiàn)“懶加載”機制

當nacos客戶端運?起來之后,它只是去做服務注冊、配置獲取等操作;并不會立即去請求服務信息;當?shù)谝淮握埱髸r候,才會去獲取服務,即懶加載機制;

1、服務發(fā)現(xiàn)流程

Client端做服務發(fā)現(xiàn)時,無論是否能從本地緩存中獲取到服務實例信息,都會啟動一個定時任務(每秒做一次服務實例信息的更新)。然而由于可能多個請求同時要做服務發(fā)現(xiàn),這樣總不能每一次做服務發(fā)現(xiàn)時都去啟動一個定時任務做服務實例信息更新吧。所以肯定要有一個機制去確保針對某一個Cluster下的Service,當前Client只會啟動一個定時任務。

2、HostReactor#scheduleUpdateIfAbsent()

HostReactor#scheduleUpdateIfAbsent()方法負責啟動做服務實例信息更新的定時任務。
從方法名也能看出來:是當定時任務不存在時,才會啟動一個定時任務。

private final Map<String, ScheduledFuture<?>> futureMap = new HashMap<String, ScheduledFuture<?>>();

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的數(shù)據(jù)添加會采用一個類似雙重檢查鎖的機制,確保Map添加數(shù)據(jù)的線程安全性。
  • 如果futureMap中已經(jīng)有了當前服務,則方法直接返回。
  • 這一步是為了減少不必要的同步操作。
  • 否則,對futureMap對象加synchronized鎖;同步代碼塊需要再進一步判斷futureMap不為空。
  • 因為在多線程并發(fā)場景下,可能多個線程判斷futureMap中都沒有當前服務,都進入到同步代碼塊,一個線程進入同步代碼塊,將當前服務添加到futureMap中。
  • 其他線程獲取到鎖之后再進入到同步代碼塊,再次判斷futureMap中是否含有當前服務,如果含有,則方法直接返回。
  • 假如同步代碼中不判空,會重復執(zhí)行將當前服務添加到futureMap中的操作。

既然是DCL的變種版,為了futureMap沒有被volatile關鍵字修飾,不會有指令重排序的問題嗎?

  • 并不會,futureMap.put()是Map的添加數(shù)據(jù)操作,和對象初始化是兩種場景。

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的時候才創(chuàng)建實例
                if (singleton == null) {
                    singleton = new DoubleCheckLazySingleton();
                }
            }
        }
        return singleton;
    }
}

到此這篇關于Nacos服務發(fā)現(xiàn)并發(fā)啟動scheduleUpdate定時任務的文章就介紹到這了,更多相關Nacos服務發(fā)現(xiàn)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot ApplicationEvent之事件發(fā)布與監(jiān)聽機制詳解

    SpringBoot ApplicationEvent之事件發(fā)布與監(jiān)聽機制詳解

    本文將深入探討SpringBoot的事件機制,介紹其核心概念、實現(xiàn)方法及最佳實踐,幫助開發(fā)者構建更加靈活、可維護的應用架構,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • SpringBoot集成RabbitMQ實現(xiàn)用戶注冊的示例代碼

    SpringBoot集成RabbitMQ實現(xiàn)用戶注冊的示例代碼

    這篇文章主要介紹了SpringBoot集成RabbitMQ實現(xiàn)用戶注冊的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Java連接數(shù)據(jù)庫實現(xiàn)方式

    Java連接數(shù)據(jù)庫實現(xiàn)方式

    文章講述了Java連接MySQL數(shù)據(jù)庫的詳細步驟,包括下載和導入JDBC驅動、創(chuàng)建數(shù)據(jù)庫和表、以及編寫連接和讀取數(shù)據(jù)的代碼
    2024-11-11
  • SparkStreaming整合Kafka過程詳解

    SparkStreaming整合Kafka過程詳解

    這篇文章主要介紹了SparkStreaming整合Kafka過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • Java struts2請求源碼分析案例詳解

    Java struts2請求源碼分析案例詳解

    這篇文章主要介紹了Java struts2請求源碼分析案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Spring執(zhí)行sql腳本文件的方法

    Spring執(zhí)行sql腳本文件的方法

    這篇文章主要介紹了Spring執(zhí)行sql腳本文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Java解析調用webservice服務的返回XML串詳解

    Java解析調用webservice服務的返回XML串詳解

    這篇文章主要介紹了Java解析調用webservice服務的返回XML串詳解的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案

    SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案

    這篇文章主要介紹了SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案,文中通過代碼示例和圖文講解的非常詳細,對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Springboot中加入druid連接池

    Springboot中加入druid連接池

    這篇文章主要介紹了Springboot中加入druid連接池,Druid是目前最好的數(shù)據(jù)庫連接池。在功能、性能、擴展性方面,都超過其他數(shù)據(jù)庫連接池,同時加入了日志監(jiān)控,下面來看看文章的具體內容吧
    2022-01-01
  • 使用新版Maven-mvnd快速構建項目

    使用新版Maven-mvnd快速構建項目

    本文主要介紹了使用新版Maven-mvnd來快速構建項目,相比于Maven,mvnd可以顯著提高構建速度,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01

最新評論

南乐县| 遵化市| 长乐市| 建德市| 邳州市| SHOW| 固原市| 怀化市| 荔波县| 拜泉县| 高碑店市| 茂名市| 墨竹工卡县| 青河县| 涿州市| 府谷县| 绥江县| 搜索| 正安县| 云梦县| 长春市| 格尔木市| 龙州县| 庐江县| 横山县| 奉化市| 荥经县| 政和县| 桂林市| 女性| 文登市| 武胜县| 弋阳县| 长岭县| 潢川县| 山西省| 垫江县| 海兴县| 明溪县| 德格县| 晴隆县|