Apache Ignite 零部署:真的是零嗎?

Apache Ignite 零部署:真的是零嗎?

我們是零售網路的技術開發部門。 有一天,管理層設定了透過使用 Apache Ignite 結合 MSSQL 來加速大規模運算的任務,並展示了一個精美插圖和 Java 程式碼範例的網站。 我立刻喜歡上了這個網站 零部署,其描述承諾了奇蹟:您不必在網格中的每個節點上手動部署 Java 或 Scala 程式碼,並在每次變更時重新部署它。 隨著工作的進展,事實證明零部署具有特定的用途,我想分享其功能。 下面是想法和實作細節。

1.問題的陳述

問題的本質如下。 有一個SalesPoint銷售點目錄和一個Sku(庫存單位)產品目錄。 銷售點有一個“商店類型”屬性,其值為“小”和“大”。 分類(銷售點的產品清單)連接到每個銷售點(從 DBMS 加載),並提供從指定日期開始指定產品的信息
從分類中排除或添加到分類中。

需要組織銷售點的分區緩存,並提前一個月在其中儲存有關連接產品的資訊。 與戰鬥系統的兼容性需要Ignite客戶端節點載入數據,計算表單的聚合(商店類型、產品代碼、日期、銷售點數)並將其上傳回DBMS。

2.文學研究

我還沒有任何經驗,所以我開始在爐子上跳舞。 也就是說,來自出版物的評論。

2016年文章 Apache Ignite 簡介:第一步 包含 Apache Ignite 專案文件的鏈接,同時對該文件的模糊之處提出批評。 我重新讀了幾遍,還是沒有弄清楚。 我參考的是官方教程 入門
樂觀地承諾“您很快就會啟動並運行!” 我正在弄清楚環境變數設置,觀看了兩個 Apache Ignite Essentials 視頻,但它們對於我的特定任務來說並不是很有用。 我使用標準檔案“example-ignite.xml”成功從命令列啟動 Ignite,建立了第一個應用程式 計算應用程式 使用 Maven。 該應用程式可以運行並使用零部署,多美啊!

我進一步閱讀,該範例立即使用affinityKey(之前透過 SQL 查詢建立),甚至使用神秘的 BinaryObject:

IgniteCache<BinaryObject, BinaryObject> people 
        = ignite.cache("Person").withKeepBinary(); 

我讀了 一點:二進位格式 - 類似於反射,透過名稱存取物件的欄位。 無需完全反序列化物件即可讀取欄位的值(節省記憶體)。 但是,既然有零部署,為什麼要使用 BinaryObject 而不是 Person? 為什麼要使用 IgniteCache 轉移到IgniteCache ? 目前還不清楚。

我正在重新製作計算應用程式以適合我的情況。 MSSQL中銷售點目錄的主鍵定義為[id] [int] NOT NULL,我以此類推創建緩存

IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")

在 xml 配置中我指示緩存已分區

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="spCache"/>
    <property name="cacheMode" value="PARTITIONED"/>
</bean>

依銷售點分割區假定將在每個叢集節點上為可用的 salesPointCache 記錄建置所需的聚合,之後客戶端節點將執行最終求和。

我正在閱讀教程 第一個 Ignite 計算應用程式,我是這樣類比的。 在每個叢集節點上,我運行 IgniteRunnable(),如下所示:

  @Override
  public void run() {
    SalesPoint sp=salesPointCache.get(spId);
    sp.calculateSalesPointCount();
    ..
  }

我添加聚合和上傳邏輯並在測試資料集上運行它。 一切都在開發伺服器上本地運行。

我啟動兩個 CentOs 測試伺服器,在 default-config.xml 中指定 IP 位址,在每個伺服器上執行

./bin/ignite.sh config/default-config.xml

兩個 Ignite 節點都在運作並且可以互相看到。 我在客戶端應用程式的 xml 配置中指定所需的位址,它啟動,向拓撲添加第三個節點,然後立即又出現兩個節點。 日誌顯示“ClassNotFoundException: model.SalesPoint”行

SalesPoint sp=salesPointCache.get(spId);

StackOverflow表示錯誤的原因是CentOs伺服器上沒有自訂的SalesPoint類別。 我們到了。 「你不必在每個節點上手動部署 Java 程式碼」之類的怎麼樣? 或「您的 Java 程式碼」與 SalesPoint 無關?

我可能錯過了一些東西 - 我開始再次搜索,再次閱讀和搜索。 過了一會兒,我感覺我已經閱讀了有關該主題的所有內容,不再有什麼新內容了。 當我搜尋時,我發現了一些有趣的評論。

瓦倫丁·庫利琴科,GridGain Systems 首席架構師, ответ StackOverflow,2016 年 XNUMX 月:

Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.

另一種權威觀點: 丹尼斯·瑪格達,GridGain Systems 產品管理總監。

關於哈布雷的文章 關於微服務 參考了 Denis Magda 的三篇文章: 微服務第一部分, 微服務第二部分, 微服務第三部分 2016-2017。 在第二篇文章中,Denis 建議透過 MaintenanceServiceNodeStartup.jar 啟動叢集節點。 您也可以透過 xml 設定和命令列使用 launch,但隨後您需要在每個已部署的叢集節點上手動放置自訂類別:

That's it. Start (..)  node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.

確實,就是這樣。 事實證明,為什麼,這種神秘的二進位格式!

3.單罐

丹尼斯在我的個人評分中名列第一,恕我直言,這是所有可用教程中最有用的教程。 在他的 微服務範例 Github 包含一個完全現成的設定叢集節點的範例,無需任何額外的搶注即可編譯。

我以同樣的方式執行此操作,並獲得一個 jar 文件,該文件根據命令列參數啟動“資料節點”或“客戶端節點”。 裝配開始並開始工作。 零部署已被擊敗。

從兆位元組的測試資料到數十千兆位元組的戰鬥資料的轉變表明,二進位格式的存在是有原因的。 有必要優化節點上的記憶體消耗,而這正是 BinaryObject 非常有用的地方。

4。結論

關於 Apache Ignite 專案文件模糊性的第一次批評被證明是公平的;自 2016 年以來幾乎沒有什麼變化。 對於初學者來說,基於網站和/或儲存庫組裝功能原型並不容易。

根據已完成工作的結果,給人的印像是零部署有效,但僅限於系統層級。 像這樣的事情:BinaryObject 用來教導遠端叢集節點使用自訂類別; 零部署-內部機制
Apache Ignite 本身並在整個叢集中分發系統物件。

我希望我的經驗對 Apache Ignite 新用戶有用。

來源: www.habr.com

添加評論