使用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目前也仍在全力开发中,因此请继续关注将来的更新。

相关文章
相关标签/搜索