您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Nacos服務怎么啟動scheduleUpdate定時任務”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
當nacos客戶端運?起來之后,它只是去做服務注冊、配置獲取等操作;并不會立即去請求服務信息;當?shù)谝淮握埱髸r候,才會去獲取服務,即懶加載機制。
Client端做服務發(fā)現(xiàn)時,無論是否能從本地緩存中獲取到服務實例信息,都會啟動一個定時任務(每秒做一次服務實例信息的更新)。然而由于可能多個請求同時要做服務發(fā)現(xiàn),這樣總不能每一次做服務發(fā)現(xiàn)時都去啟動一個定時任務做服務實例信息更新吧。所以肯定要有一個機制去確保針對某一個Cluster下的Service,當前Client只會啟動一個定時任務。
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ù)操作,和對象初始化是兩種場景。
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服務怎么啟動scheduleUpdate定時任務”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。