使用Apache Ignite構建C++版本的分佈式應用

本文會介紹Apache Ignite的C++ API(稱爲Ignite C++),主要面向C/C++開發者。數據庫

Ignite和Ignite C++

  • Ignite C++構建於Ignite之上;
  • Ignite C++在同一個進程中啓動JVM,而且經過JNI與之通訊;
  • .NET、C++和Java節點能夠加入同一個集羣,使用相同的緩存,而且使用通用的二進制協議進行互操做;
  • Java計算做業能夠在任意節點上執行(Java、.NET和C++)。

入門

由於Ignite是一個分佈式平臺,因此開始就要先啓動一個節點,這方面若是使用ignite::Ignition類是很是簡單的:apache

好了,在C++環境中已經使用默認的配置啓動了第一個Ignite節點!其中Ignite類是訪問集羣的主要入口點。緩存

數據操做

暴露數據操做API的主要Ignite C++組件是ignite::cache::Cache<K,V>。它包含了基本的數據操做方法集。因爲緩存本質上是做爲分佈式哈希表的接口,所以基本上能夠像處理簡單容器(map或者unordered_map)那樣與它進行交互。網絡

Ignite主要是用Java開發的,Ignite組件的實現也使用了不少Java的特性,好比,對象的序列化/反序列化就用在了磁盤存儲和對象的網絡傳輸上。分佈式

在Ignite C++中,這個特性經過ignite::binary::BinaryType<T>模板限定來實現:,無論是普通的客戶端仍是瘦客戶端,都是用的這個方式,對於上面提到的Person類,大體以下:測試

這裏除了序列化/反序列化方法BinaryType<Person>::WriteBinaryType<Person>::Read外,還有其它的一些方法,它們用於向平臺說明,如何在其它語言中處理自定義C++類型,尤爲是在Java中,下面會詳細探討這些方法:指針

  • GetTypeName():返回類型名。該類型名在全部使用這個類型的平臺中都應該是一致的,若是隻在Ignite C++中使用這個類型,那麼這個命名就沒有強制要求;
  • GetTypeId():返回跨平臺的惟一類型ID。要想在全部平臺上都有正確的行爲,那麼全部的實現都必須使用相同的計算方法。GetBinaryStringHashCode(TypeName)在任意平臺的默認實現,都會返回相同的類型ID,所以這種實現方式在任意平臺上都能保證該類型的正確使用;
  • GetFieldId():返回字段名的惟一ID。不過要保證跨平臺,要使用GetBinaryStringHashCode()方法;
  • IsNull():檢查類實例是否爲空,該方法用於NULL值的正確序列化,對於類實例用處不大,不過若是用戶想處理智能指針以及定義好比BinaryType< std::unique_ptr<Person>>這樣的限定,則可能會比較方便;
  • GetNull():若是要反序列化NULL值,會調用它。關於IsNull()的說法,也適用於GetNull()

SQL

與傳統數據庫相似,能夠將緩存視爲數據庫模式,而且該模式只有一個表名爲類型名的表。除了緩存模式以外,還有一個名爲PUBLIC的公共模式,在該模式中,可使用標準DDL指令(如CREATE TABLEDROP TABLE等)建立/刪除任意數量的表。一般,若是隻想將Ignite用做分佈式數據庫,則能夠經過ODBC/JDBC鏈接到PUBLIC模式。code

Ignite支持完整的SQL查詢,包括DML和DDL。經過MVCC,SQL事務也是支持的,不過還處於測試階段。對象

要經過SQL處理緩存數據,必須在緩存配置中顯式指定將在SQL查詢中使用哪些對象字段。配置在XML文件中進行了描述,以後將在節點啓動時指定配置文件的路徑:接口

該配置會由Java來解析,所以其中的基本類型在Java中也要指定,配置文件建好以後,就能夠啓動一個節點,獲取一個緩存實例,進而處理SQL:

這時候就能夠執行INSERT、UPDATE、CREATE TABLE以及其它查詢了,固然,跨緩存查詢也是支持的。不過這種狀況下要注意,須要給查詢中的緩存名上加上引號,做爲模式名,好比這樣不行:

要這樣寫:

好了,暫時就寫這麼多,Apache Ignite功能強大,C++ API目前也仍在全力開發中,因此請繼續關注將來的更新。

相關文章
相關標籤/搜索