Neil Zhu,簡書ID Not_GOD,University AI 創始人 & Chief Scientist,致力于推進世界人工智能化進程。制定并實施 UAI 中長期增長戰略和目標,帶領團隊快速成長為人工智能領域最專業的力量。
作為行業領導者,他和UAI一起在2014年創建了TASA(中國最早的人工智能社團), DL Center(深度學習知識中心全球價值網絡),AI growth(行業智庫培訓)等,為中國的人工智能人才建設輸送了大量的血液和養分。此外,他還參與或者舉辦過各類國際性的人工智能峰會和活動,產生了巨大的影響力,書寫了60萬字的人工智能精品技術內容,生產翻譯了全球第一本深度學習入門書《神經網絡與深度學習》,生產的內容被大量的專業垂直公眾號和媒體轉載與連載。曾經受邀為國內頂尖大學制定人工智能學習規劃和教授人工智能前沿課程,均受學生和老師好評。
Elasticsearch內部探秘
by Njal Karevoll
什么是module?
ES中的module是一個Guice Module部件完成配置信息和綁定ES各類接口的特定實現。
Guice: lightweight dependency injection framework for Java 5 and above, brought to you by Google.
不含任何插件的標準的ES服務器擁有超過112個模塊:(原文100,最新數據112個模塊)
? elasticsearch git:(master) find src/main -name \*Module\* | grep -v common | wc -l
112
ES在啟動時,基于其配置文件和運行時環境來搜集不同模塊,并創建一個稱為Injector的東西。簡單說,Injector就是一個不需要提供構建參數可以構建類的實例的對象。Injector將會使用它的配置完的模塊來定位所有請求的依賴,并以一種拓撲順序來為我們創建出這些實例。這樣的做法為我們節約了大量時間,并幫助我們創建出來一個可復合的模塊系統。這樣的系統ES所需的規模需要可控。
用更加專業的術語,這就是一個依賴注入(dependency injection),用James Shore的話說就是:
Dependency injection means giving an object its instance variables
本文后面將解釋為何ES如此易插件化和可擴展。我們首先看看ES的HTTP部分來弄清Guice和依賴注入是如何運作的。
HTTP服務模塊
ES抽象為一個HttpServer
類,在構建期間獲得一個HttpServerTransport
,這默認綁定在一個稱為NettyHttpServerTransport
的具體實現上。換句話說,HttpServer
不清楚請求或者響應是如何接受和發送的,它只需要處理應用邏輯(application logic)(i.e. 幫助到來的請求找到一個合適的請求處理者)。
如果,由于某些原因(如性能,安全,特性等),ES打算切換HTTP層(layer),如同對換出一個配置值那樣簡單(http.type)。因此,Sonian基于Jetty發布了一個ES的HTTP層,這個東西剛好解決這個問題。可以在這里下載。基于Jetty的實現支撐了諸如驗證這樣的特性,這在一些應用場景種肯定有相應的需求。
命名空間
下圖展示了ES的模塊和命名空間:
多個模塊基于他們在源代碼樹或者代碼中的調用情況被放進了不同的命名空間中。ES不同的側面,諸如REST接口,插件,River和傳輸服務是分割的實體,他們之間沒有模塊層面的依賴。模塊可能已經太過龐大或者難以復合使用的將會被進一步分割成嵌套命名空間中的稍小的模塊。
所有模塊
所有模塊的全圖是相當大的。下圖展示了這個情況:
其中的注釋命名規則是:Namespaces-Module names-Bound classes
新模塊的產生
大多數模塊僅僅會提供一個或者多個類或接口,但是某些模塊可以產生它們需要的新模塊。這些模塊通常依賴當前Setting
對象而產生,這是在啟動ES的時候從elasticseasrch.yml
中讀取的。這就讓插件作者能夠寫出替代或者擴展ES內置功能,可以通過默認的配置系統來開啟和配置這些插件。
這里有個例子,Discovery Module
,默認使用Zen
或者Local
發現模塊,但是可能有其通過設置discovery.type
配置值來實現完成另外模塊的對換。此乃Sonian的ZooKeeper Discovery
的工作原理。
擴展和對換的實現
當我們需要完全對換出ES中整個部件的實現時,這些模塊提供給我們一種簡單增加ES能力的的方法。因為所有由模塊系統實例化的類可能需要一個到任何其他由同一個系統實例化的類的引用,于是通過良定義的接口很容易擴展功能。
AnalysisModule
是使用ES和Lucene的開發者最最關心的模塊之一。分析模塊負責提供索引和搜索時分析器、分詞詞、字符過濾器和token過濾器。使用這個模塊提供的API,很容易增加Lucene適用的分析器、分詞器或者過濾器進入ES,只需要幾行代碼就可以完成。