使用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
类是非常简单的:
好了,在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>::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目前也仍在全力开发中,所以请继续关注未来的更新。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微软将不再把 .NET Framework API 移植到 .NET Core 3.0
目前.NET Core 3.0 拥有的 API 总数约为.NET Framework API 的 80%,剩下尚未从 .NET Framework 移植到 .NET Core 的 API,微软考虑以开源的形式发布。 微软方面表示,通过 .NET Core 3.0,他们现在已具备轻松移植现代 workload 所需的所有技术,无论是桌面应用、移动应用、控制台应用,网站还是云服务。为此,他们计划将不再把 .NET Framework 上已有的技术移植到.NET Core 3.0,并考虑使用 MIT 协议来开源不打算移植到 .NET Core 3.0 的 .NET Framework 代码库。 当然不移植 API 并不是说我们在使用新技术方面没有任何机会,只是这些技术不会在 .NET Framework 代码库中出现。 下面我们来看看.NET Core 和 .NET Framework 的发展历程。 从 .NET Core 1.0 开始,它只有一个非常小的 API 集合,其中仅包含大约1.8 万个 .NET Framework API。通过.NET Standard 2.0,微软试图在.NE...
- 下一篇
金三银四面试季节之Java 核心面试技术点 - JVM 小结
更多关于Java的文章请访问: 描述一下 JVM 的内存区域 程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。 Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用。前面谈程序计数器时,提到了当前方法;同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM 直接对 Java 栈的操作只有两个,就是对栈帧的压栈和出栈。栈帧中存储着局部变量表、操作数(operand)栈、动态链接、方法正常退出或者异常退出的定义等...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2全家桶,快速入门学习开发网站教程