為什么80%的碼農都做不了架構師?>>> ??
本文會介紹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 ignite、好了,在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
類,大致如下:
ios構建版本、
這里除了序列化/反序列化方法BinaryType<Person>::Write
和BinaryType<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 TABLE
、DROP TABLE
等)創建/刪除任意數量的表。通常,如果只想將Ignite用作分布式數據庫,則可以通過ODBC/JDBC連接到PUBLIC
模式。
Ignite支持完整的SQL查詢,包括DML和DDL。通過MVCC,SQL事務也是支持的,不過還處于測試階段。
要通過SQL處理緩存數據,必須在緩存配置中顯式指定將在SQL查詢中使用哪些對象字段。配置在XML文件中進行了描述,之后將在節點啟動時指定配置文件的路徑:
版本工具,
該配置會由Java來解析,因此其中的基本類型在Java中也要指定,配置文件建好之后,就可以啟動一個節點,獲取一個緩存實例,進而處理SQL:
這時候就可以執行INSERT、UPDATE、CREATE TABLE以及其它查詢了,當然,跨緩存查詢也是支持的。不過這種情況下要注意,需要給查詢中的緩存名上加上引號,作為模式名,比如這樣不行:
要這樣寫:
分布式程序、
好了,暫時就寫這么多,Apache Ignite功能強大,C++ API目前也仍在全力開發中,所以請繼續關注未來的更新。