Neil Zhu陈瘦,簡書ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist悔常,致力于推進世界人工智能化進程护赊。制定并實施 UAI 中長期增長戰(zhàn)略和目標,帶領團隊快速成長為人工智能領域最專業(yè)的力量舀武。
作為行業(yè)領導者拄养,他和UAI一起在2014年創(chuàng)建了TASA(中國最早的人工智能社團), DL Center(深度學習知識中心全球價值網(wǎng)絡),AI growth(行業(yè)智庫培訓)等奕剃,為中國的人工智能人才建設輸送了大量的血液和養(yǎng)分。此外捐腿,他還參與或者舉辦過各類國際性的人工智能峰會和活動纵朋,產(chǎn)生了巨大的影響力,書寫了60萬字的人工智能精品技術(shù)內(nèi)容茄袖,生產(chǎn)翻譯了全球第一本深度學習入門書《神經(jīng)網(wǎng)絡與深度學習》操软,生產(chǎn)的內(nèi)容被大量的專業(yè)垂直公眾號和媒體轉(zhuǎn)載與連載。曾經(jīng)受邀為國內(nèi)頂尖大學制定人工智能學習規(guī)劃和教授人工智能前沿課程宪祥,均受學生和老師好評聂薪。
Elasticsearch內(nèi)部探秘
by Njal Karevoll
什么是module?
ES中的module是一個Guice Module部件完成配置信息和綁定ES各類接口的特定實現(xiàn)蝗羊。
Guice: lightweight dependency injection framework for Java 5 and above, brought to you by Google.
不含任何插件的標準的ES服務器擁有超過112個模塊:(原文100藏澳,最新數(shù)據(jù)112個模塊)
? elasticsearch git:(master) find src/main -name \*Module\* | grep -v common | wc -l
112
ES在啟動時,基于其配置文件和運行時環(huán)境來搜集不同模塊耀找,并創(chuàng)建一個稱為Injector的東西翔悠。簡單說,Injector就是一個不需要提供構(gòu)建參數(shù)可以構(gòu)建類的實例的對象野芒。Injector將會使用它的配置完的模塊來定位所有請求的依賴蓄愁,并以一種拓撲順序來為我們創(chuàng)建出這些實例。這樣的做法為我們節(jié)約了大量時間狞悲,并幫助我們創(chuàng)建出來一個可復合的模塊系統(tǒng)撮抓。這樣的系統(tǒng)ES所需的規(guī)模需要可控。
用更加專業(yè)的術(shù)語摇锋,這就是一個依賴注入(dependency injection)丹拯,用James Shore的話說就是:
Dependency injection means giving an object its instance variables
本文后面將解釋為何ES如此易插件化和可擴展站超。我們首先看看ES的HTTP部分來弄清Guice和依賴注入是如何運作的。
HTTP服務模塊
ES抽象為一個HttpServer
類咽笼,在構(gòu)建期間獲得一個HttpServerTransport
顷编,這默認綁定在一個稱為NettyHttpServerTransport
的具體實現(xiàn)上。換句話說剑刑,HttpServer
不清楚請求或者響應是如何接受和發(fā)送的媳纬,它只需要處理應用邏輯(application logic)(i.e. 幫助到來的請求找到一個合適的請求處理者)。
如果施掏,由于某些原因(如性能钮惠,安全,特性等)七芭,ES打算切換HTTP層(layer)素挽,如同對換出一個配置值那樣簡單(http.type)。因此狸驳,Sonian基于Jetty發(fā)布了一個ES的HTTP層预明,這個東西剛好解決這個問題“夜浚可以在這里下載撰糠。基于Jetty的實現(xiàn)支撐了諸如驗證這樣的特性辩昆,這在一些應用場景種肯定有相應的需求阅酪。
命名空間
下圖展示了ES的模塊和命名空間:
多個模塊基于他們在源代碼樹或者代碼中的調(diào)用情況被放進了不同的命名空間中。ES不同的側(cè)面汁针,諸如REST接口术辐,插件,River和傳輸服務是分割的實體施无,他們之間沒有模塊層面的依賴辉词。模塊可能已經(jīng)太過龐大或者難以復合使用的將會被進一步分割成嵌套命名空間中的稍小的模塊。
所有模塊
所有模塊的全圖是相當大的猾骡。下圖展示了這個情況:
其中的注釋命名規(guī)則是:Namespaces-Module names-Bound classes
新模塊的產(chǎn)生
大多數(shù)模塊僅僅會提供一個或者多個類或接口较屿,但是某些模塊可以產(chǎn)生它們需要的新模塊。這些模塊通常依賴當前Setting
對象而產(chǎn)生卓练,這是在啟動ES的時候從elasticseasrch.yml
中讀取的隘蝎。這就讓插件作者能夠?qū)懗鎏娲蛘邤U展ES內(nèi)置功能,可以通過默認的配置系統(tǒng)來開啟和配置這些插件襟企。
這里有個例子嘱么,Discovery Module
,默認使用Zen
或者Local
發(fā)現(xiàn)模塊顽悼,但是可能有其通過設置discovery.type
配置值來實現(xiàn)完成另外模塊的對換曼振。此乃Sonian的ZooKeeper Discovery
的工作原理几迄。
擴展和對換的實現(xiàn)
當我們需要完全對換出ES中整個部件的實現(xiàn)時,這些模塊提供給我們一種簡單增加ES能力的的方法冰评。因為所有由模塊系統(tǒng)實例化的類可能需要一個到任何其他由同一個系統(tǒng)實例化的類的引用映胁,于是通過良定義的接口很容易擴展功能。
AnalysisModule
是使用ES和Lucene的開發(fā)者最最關心的模塊之一甲雅。分析模塊負責提供索引和搜索時分析器解孙、分詞詞、字符過濾器和token過濾器抛人。使用這個模塊提供的API弛姜,很容易增加Lucene適用的分析器、分詞器或者過濾器進入ES妖枚,只需要幾行代碼就可以完成廷臼。