亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nacos服務怎么啟動scheduleUpdate定時任務

發布時間:2023-02-23 11:22:29 來源:億速云 閱讀:139 作者:iii 欄目:開發技術

本篇內容介紹了“Nacos服務怎么啟動scheduleUpdate定時任務”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

服務發現“懶加載”機制

當nacos客戶端運?起來之后,它只是去做服務注冊、配置獲取等操作;并不會立即去請求服務信息;當第一次請求時候,才會去獲取服務,即懶加載機制。

1、服務發現流程

Nacos服務怎么啟動scheduleUpdate定時任務

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

2、HostReactor#scheduleUpdateIfAbsent()

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

Nacos服務怎么啟動scheduleUpdate定時任務

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的數據添加會采用一個類似雙重檢查鎖的機制,確保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;
    }
}

“Nacos服務怎么啟動scheduleUpdate定時任務”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芷江| 高安市| 裕民县| 通江县| 怀柔区| 永州市| 赫章县| 玉门市| 同德县| 孟连| 常州市| 婺源县| 莱阳市| 萍乡市| 榆树市| 连山| 乐昌市| 丹阳市| 辽阳市| 屏山县| 华容县| 锦州市| 洛隆县| 太仓市| 西吉县| 普安县| 贡山| 抚松县| 麻江县| 靖州| 潜山县| 炉霍县| 伽师县| 博客| 广水市| 锦屏县| 乌鲁木齐市| 池州市| 丹巴县| 湾仔区| 昌吉市|