component的生命周期怎么理解

這篇文章主要介紹“component的生命周期怎么理解”,在日常操作中,相信很多人在component的生命周期怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”component的生命周期怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在金林等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網站設計、做網站 網站設計制作定制網站制作,公司網站建設,企業(yè)網站建設,高端網站設計,成都全網營銷,成都外貿網站制作,金林網站建設費用合理。

storm中的spout,bolt的生命周期,都是storm幫你管理好,你只要新建一個實例,指定該component的并行數,就可以。那么topology中所用到的工具類的生命周期該如何處理,例如數據庫連接池、redis的連接池,這些對象該放在哪里初始化?本文以jdbc連接池為例,討論此問題。閱讀本文前請先自行了解storm topology的運行流程。

Storm Component的生命周期

storm component泛指topoloty中的spout、bolt,是spout和bolt的一個統(tǒng)稱。而component生命周期,我結合storm作者nathanmarz大神的回答和自己的理解,描述一下:

1,當提交了topology后,spout、bolt的實例會在本地機器(執(zhí)行storm submit所在的機器)上被創(chuàng)建,并且在本地序列化。另外,所有的component的構造函數、declareOutputFields方法都本地會運行一次。

2,整個topology被上傳到nimbus上。

3,對應supervisor會向nimbus獲取序列化后的topology代碼,交給對應的worker執(zhí)行。

4,每個worker執(zhí)行如下:反序列化代碼,運行對應component的prepare/open(初始化對應的component)。舉個例子,某spout在topology中設置了3個并行度,且topology設置了3個worker,該open方法就會在3個不同的worker上分別調用1次,共調用3次。

5,worker通知executor不斷循環(huán)去跑nextTuple/execute方法。

需要注意一點:component的初始化相關的操作應放在prepare/open方法中執(zhí)行, 而不是在實例化component的時候進行或者topology的main函數。

Jdbc Pool 初始化方案

參考component的生命周期,能想到有兩種方案:

1,每個component都維持一個與數據庫的連接,此種方案適合于寫操作非常頻繁,component數目比較少,且中間不會有一段時間沒有任何寫、讀操作,否則會發(fā)生MySQL connection timeout;另外可省去從連接池獲取連接,用完連接后返回給連接池這兩步操作。如果確定這種方案,則只要將數據庫的配置放到config中,在對應的component中初始化數據庫連接即可。

2,在每worker中維持一個連接池,worker中所有executor需要用到連接時,從連接池中獲取,用后歸還。一般還是推薦這種方案。

下面說一下第二種方案的連接池,應該在什么時候初始化。

首先明確一點,在topology運行中,一個worker相當于jvm進程,相當于有N個worker,就會有N個連接池。初始化連接池的動作需要在worker端進行,一個worker中只有一個連接池的實例,適合用單例模式。

初始化思路:每個component接收數據庫配置信息,在其prepare/open時,初始化連接池,這里需要保證在單個worker中只需要初始化一次就可以,即對初始化的代碼加鎖處理,保證只能有一個component初始化。

在storm源碼包中,提供了storm-jdbc的實現,其中用了JDBC 連接池組件,具體實現思路就是上面討論的第二種方案。以下為初始化時加鎖的部分。

public class HikariCPConnectionProvider implements ConnectionProvider {

    private Map<String, Object> configMap;
    private transient HikariDataSource dataSource;

    public HikariCPConnectionProvider(Map<String, Object> hikariCPConfigMap) {
        this.configMap = hikariCPConfigMap;
    }

    @Override
    public synchronized void prepare() {
        if(dataSource == null) {
            Properties properties = new Properties();
            properties.putAll(configMap);
            HikariConfig config = new HikariConfig(properties);
            this.dataSource = new HikariDataSource(config);
            this.dataSource.setAutoCommit(false);
        }
    }

    @Override
    public Connection getConnection() {
        try {
            return this.dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void cleanup() {
        if(dataSource != null) {
            dataSource.shutdown();
        }
    }
}

看到,初始化prepare被上鎖了,以保證只初始化一次。其實這里可以再優(yōu)化一下:不要對方法加鎖,而是對具體初始化連接的代碼加鎖,減少鎖影響的范圍。

到此,關于“component的生命周期怎么理解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網頁題目:component的生命周期怎么理解
文章地址:http://muchs.cn/article48/geceep.html

成都網站建設公司_創(chuàng)新互聯,為您提供手機網站建設、做網站、網站制作ChatGPT、App開發(fā)關鍵詞優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都seo排名網站優(yōu)化