Elasticsearch學習(3)–ES啟動異步任務

上節,我們學習到了 elasticsearch 啟動時加載的配置文件,以及加載順序。本節我們來了解一下 es 在啟動時加載了哪些異步任務,本節代碼在 org.elasticsearch.node.internal.InternalNode.start

如何啟動一個異步任務

首先我們看一下任務是如何啟動的,舉一個例子,injector.getInstance(IndicesService.class).start(); IndicesService 的唯一實現類為 InternalIndicesService,且 InternalIndicesService 又繼承自 AbstractLifecycleComponent,同時 AbstractLifecycleComponent 有一個start 方法


Elasticsearch學習(3)–ES啟動異步任務

可以發現,其內部實際上調用的是 doStart() 方法,只不過是添加了一些控制,保證不重複啟動之類的代碼。

各個異步任務,直接摘抄代碼,如下,我們暫時做個簡單的解釋,見註釋。後面會針對每個異步任務做詳細說明,這也是我們後面閱讀源碼的詳細入口

<code>for (Class extends LifecycleComponent> plugin : pluginsService.services()) {
injector.getInstance(plugin).start(); // 啟動插件需要的任務
}

// 一些構造方法時,注入對應的變量值,start 方法未做任何事情
injector.getInstance(IndicesService.class).start();

// 看代碼就知道是控制索引時,使用內存的情況的,防止內存溢出
// start 時,啟動了另一個異步任務來控制內存
injector.getInstance(IndexingMemoryController.class).start();

// 節點監控狀態,
injector.getInstance(IndicesClusterStateService.class).start();

// 監控 node 過期/掉線,內部啟動了 PurgerThread 這個異步任務
injector.getInstance(IndicesTTLService.class).start();

// 看代碼啟動了另外三個異步任務,後面詳細說明
injector.getInstance(RiversManager.class).start();

// 註冊和監控節點狀態

injector.getInstance(ClusterService.class).start();

// 監聽節點狀態
injector.getInstance(RoutingService.class).start();

// 這應該是核心任務了,搜索任務
injector.getInstance(SearchService.class).start();

// 監控 jvm 狀態
injector.getInstance(MonitorService.class).start();

// 這個看起來是執行搜索
injector.getInstance(RestController.class).start();

// 看起來是多線程的支持
injector.getInstance(TransportService.class).start();
DiscoveryService discoService = injector.getInstance(DiscoveryService.class).start();

// gateway should start after disco, so it can try and recovery
from gateway on "start"
// 網關任務
injector.getInstance(GatewayService.class).start();

// 支持http
if (settings.getAsBoolean("http.enabled", true)) {
injector.getInstance(HttpServer.class).start();
}

// 看門狗任務
injector.getInstance(BulkUdpService.class).start();

// 監控資源環境
injector.getInstance(ResourceWatcherService.class).start();

// 保證任務正常的任務
injector.getInstance(TribeService.class).start();
/<code>

總結

今天的內容很少,主要集中在這些個異步任務的說明上,讓大家有個總體概念,當然也讓我自己有總體概念

最後,希望本文對你有所啟發,早日開始elasticSearch 的源碼閱讀

Elasticsearch學習(3)–ES啟動異步任務


Elasticsearch學習(3)–ES啟動異步任務


分享到:


相關文章: