文档章节

使用Apache Ignite构建C++版本的分布式应用

李玉珏
 李玉珏
发布于 2019/01/27 23:06
字数 1189
阅读 2.7K
收藏 5

本文会介绍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类是非常简单的:

好了,在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模式。

Ignite支持完整的SQL查询,包括DML和DDL。通过MVCC,SQL事务也是支持的,不过还处于测试阶段。

要通过SQL处理缓存数据,必须在缓存配置中显式指定将在SQL查询中使用哪些对象字段。配置在XML文件中进行了描述,之后将在节点启动时指定配置文件的路径:

该配置会由Java来解析,因此其中的基本类型在Java中也要指定,配置文件建好之后,就可以启动一个节点,获取一个缓存实例,进而处理SQL:

这时候就可以执行INSERT、UPDATE、CREATE TABLE以及其它查询了,当然,跨缓存查询也是支持的。不过这种情况下要注意,需要给查询中的缓存名上加上引号,作为模式名,比如这样不行:

要这样写:

好了,暂时就写这么多,Apache Ignite功能强大,C++ API目前也仍在全力开发中,所以请继续关注未来的更新。

李玉珏

李玉珏

粉丝 413
博文 84
码字总数 161358
作品 0
沈阳
架构师
私信 提问
加载中
请先登录后再评论。

暂无文章

Python -- socket 实现服务器之间的通信

  现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。   我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库...

osc_a7a1prn6
28分钟前
0
0
20199102 2019-2020-2 《网络攻防实践》第十一周作业

20199102 2019-2020-2 《网络攻防实践》第十一周作业 关于sql注入和XSS攻击感觉自己叙述能力并不够,但是实践过程中给出了完整的攻击、分析、防御的过程。 1.实践内容 1.1Web应用程序体系结...

osc_eijo4qvb
29分钟前
0
0
我们无法在此设备上激活windows,因为无法连接到你的组织的激活服务器。请确保已连接到你的组织服务器,然后重试。如果仍存在激活问题,请联系组织的支持人员,错误代码:ox80070078

本人承接各种高校C语言、C++、Java语言等课程设计以及ppt等制造,以及常见的电脑故障有需要的私信我或者微信15813406574 一般Windows都会有一个试用期,试用期到了还没有激活系统的话就会提示...

osc_2frf70qv
30分钟前
0
0
.net core Web API参数绑定规则

参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到。 Web API代码(.netcore 3.1)如下: [HttpGet("Login")]p...

osc_wcq210y3
31分钟前
13
0
[Logstash]使用详解

  Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。   本文针对官方文档进行...

osc_zqxv5pte
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部