Apache Ignite 学习笔记(二): Ignite Java Thin Client

前一篇文章,我们介绍了如何安装部署Ignite集群,并且尝试了用REST和SQL客户端连接集群进行了缓存和数据库的操作。现在我们就来写点代码,用Ignite的Java thin client来连接集群。 在开始介绍具体代码之前,让我们先简单的了解一下Ignite的thin client,以及背后的binary client protocol(*原本打算把thin client翻译为精简客户端,bianry client protocol翻译为二进制客户端协议,但总读的不顺口,就索性就不翻译了吧-_-|||*)。

Ignite Thin Client和Binary Client Protocol介绍


为了缓存数据的高性能读写,Ignite是节点内部需要维护一套高效的数据结构来记录一些元数据,所以如果在自己的应用程序中启动一个Ignite的server/client节点是要占用一些应用程序的CPU/内存资源的。另外,Ignite是一个分布式系统,单个节点需要和集群里的其他节点通讯,又要消耗一些的网络资源。 因此不同于server/client节点,thin client是一个Ignite轻量化的客户端。为什么说它是轻量化的呢,因为thin client并不会加入到Ignite集群的拓扑中(即thin client的连接,断开不会导致Ignite集群拓扑发生变化,也不会触发相应的事件通知),不会存储任何集群的数据或是被做为计算节点接收计算任务。Thin client就是一个纯粹的客户端,它纯粹到通过最原始的socket连接到Ignite集群中的某一个节点进行所有的操作。

在Ignite集群成功启动后,我们会在日志看到“Topology snapshot [ver=1, servers=1, clients=0, CPUs=2, offheap=1.6GB, heap=1.0GB]”信息。这条日志里的clients和thin client不是一回事。按照之前介绍,thin client是不会加入Ignite集群的拓扑中去,理应不会出现在和拓扑相关的日志中,所以这里不要把thin client和集群中的client节点搞混了。

这个链接详细的介绍了Binary Client Protocol的数据格式(比如采用的是litter-endian,Ignite的二进制对象描述用户数据),消息格式(定义了消息头格式,响应消息的格式,以及连接时如何进行握手保证版本兼容等)和各种缓存操作所需的操作编码和格式。 所以只要你按照Binary Client Protocol的要求,你可以用任何一种语言实现一个thin client。目前Ignite发布了两种语言的thin client的实现,一个是基于Java实现,一个是基于.Net实现。

当然thin client虽然轻量化,也有它的问题。 Thin client写数据时只能先把数据发给其连接的节点,再由该节点将数据发送给集群内的其他节点做存储(同理,读数据也需要通过该节点才能传给thin client),这样thin client和这个节点间的网络很有可能就成为瓶颈。而server/client节点间可以互联,利用数据分区,可以充分使用节点间的带宽。另外,当前连接节点出故障后,thin client只能随机选择一个启动时已知的节点进行重试,由于其不感知集群拓扑,即便有新节点加入,thin client也无法知道其存在,更不可能和其进行通讯了。 所以还是要根据自己应用的场景,看看到底是server/client节点还是thin client更合适。

Ignite Java Thin Client例子

上一篇文章中,我们用Dbeaver连接Ignite后,用SQL语句进行建表,插入数据和查询数据。 在这个例子里,我们就来看看如何通过Ignite的thin client支持的JCache APIs进行相同的操作。

首先我们先用用maven命令创建一个新的project,然后在pom.xml文件中添加以下ignite-core的依赖:

<dependencies><dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-core</artifactId><version>${ignite.version}</version></dependency>      
</dependencies>

在看具体代码之前,让我们先来大概了解一下这个例子中我们要进行哪些操作以及步骤:

  1. 首先,我们通过thin client连接上我们已经启动的Ignite集群。
  2. 然后,通过API创建两个cache(cache的名字分别为provincecity),一个用来存省份信息,一个用来存城市信息。 province缓存的key是省份的id,city缓存的key是城市的名称。
  3. 我们分别往两个cache里写入一些数据。
  4. 启动该程序时,可以从命令行传入多个城市名称,在终端我们会打印出该城市所在的省份信息。

下面是主程序的代码:

import org.apache.ignite.Ignition;
import org.apache.ignite.client.ClientCache;
import org.apache.ignite.client.ClientException;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.ClientConfiguration;public class IgniteThinClientExample {private static ClientCache<Integer, Province> provinceCache;private static ClientCache<String, City> cityCache;public static void main(String[] args) {System.out.println();System.out.println("Ignite thin client example started.");//连接到Ignite集群,默认端口号为10800ClientConfiguration cfg = new ClientConfiguration().setAddresses("192.168.0.110:10800");//用java的try-with-resource statement启动clienttry (IgniteClient igniteClient = Ignition.startClient(cfg)){System.out.println();System.out.println("Begin create cache and insert data.");//创建两个缓存,具体步骤见该函数creatCacheAndInsertData(igniteClient);System.out.println();System.out.println("Begin query cache.");//根据输入开始查询for(String city : args){//先用城市名字,查询city缓存City c = cityCache.get(city);Province p = null;if (c != null){//在用城市数据中的province id查询province缓存p = provinceCache.get(c.getProvinceId());}//输出查询结果if (c != null && p != null) {System.out.println("Find " + c.getName() + " in province " + p.getName());}else{System.out.println("Cannot find " + city + " in any province.");}}}catch (ClientException e) {System.err.println(e.getMessage());}catch (Exception e) {System.err.format("Unexpected failure: %s\n", e);}}private static void creatCacheAndInsertData(IgniteClient igniteClient){//创建province缓存,用来存放省份信息,该缓存以省的id为keyfinal String PROVINCE_CACHE_NAME = "province";provinceCache = igniteClient.getOrCreateCache(PROVINCE_CACHE_NAME);//往province缓存中写入一些数据int provinceId = 1;final Province on = new Province(provinceId++, "Ontario");final Province ab = new Province(provinceId++, "Alberta");final Province qc = new Province(provinceId++, "Quebec");provinceCache.put(on.getId(), on);provinceCache.put(ab.getId(), ab);provinceCache.put(qc.getId(), qc);System.out.println("Successfully insert all provinces data.");//创建city缓存,用来存放城市信息,该缓存以城市的名字为keyfinal String CITY_CACHE_NAME = "city";cityCache = igniteClient.getOrCreateCache(CITY_CACHE_NAME);//往city缓存写入一些数据int cityId = 1;final City toronto = new City(cityId++, "Toronto", on.getId());final City edmonton = new City(cityId++, "Edmonton", ab.getId());final City calgary = new City(cityId++, "Calgary", ab.getId());final City montreal = new City(cityId++, "Montreal", qc.getId());cityCache.put(toronto.getName(), toronto);cityCache.put(edmonton.getName(), edmonton);cityCache.put(calgary.getName(), calgary);cityCache.put(montreal.getName(), montreal);System.out.println("Successfully insert all city data.");}
}public class City {private int id;private String name;private int provinceId;...
}public class Province {private int id;private String name;...
}

成功的编译project后,我们可以启动这个client看看程序的输出结果:

$java -cp $IGNITE_HOME/libs/*:./ignite-thin-client-example-1.0-SNAPSHOT.jar IgniteThinClientExample Toronto Markham Edmonton CalgaryIgnite thin client example started.Begin create cache and insert data.
Successfully insert all provinces data.
Successfully insert all city data.Begin query cache.
Find Toronto in province Ontario
Cannot find Markham in any province.
Find Edmonton in province Alberta
Find Calgary in province Alberta

因为我们的city缓存中,并没有Markham的信息,所以查询Markham的时候我们也找不到对应的省份信息。但是查询Toronto,Edmonton和Calgary的时候,程序是能正确的返回其省份信息的。

在上面的例子中,有几个需要注意的地方:

  • 在我们连接Ignite集群的时候,用的端口号10800。默认配置下,Ignite会监听该端口,等待thin client的连接。如果需要让Ignite集群用不同的端口号,可以修改集群启动时的配置文件,加入以下配置项(如果你是用上一篇文章的方法启动的Ignite集群, 配置文件在$IGNITE_HOME/config/default-config.xml):
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"><!-- Thin client connection configuration. --><property name="clientConnectorConfiguration"><bean class="org.apache.ignite.configuration.ClientConnectorConfiguration"><property name="host" value="192.168.0.100"/><property name="port" value="新的端口号"/><property name="portRange" value="30"/></bean></property>  
</bean>
  • 我们的插入和查询数据的时候,只用到了最简单缓存API--put和get。其实Ignite缓存的查询API比其他缓存更丰富,支持scan/SQL/text方式进行查询,这个我们会在后面的文章慢慢介绍。

  • 我们用城市的名字查询完city缓存后,再拿着province id去查询province缓存。这两步查询其实是可以合并成一个SQL的join查询,在后面介绍SQL查询时,我们再来看看把两个缓存当做两张表做join操作。

总结

这篇文章我们介绍了Ignite的thin client,并用Ignite的Java think client实现了一个简单的例子,解释如何用thin client连接上Ignite集群,创建缓存,写入数据以及查询。 完整的代码和maven工程文件戳这里。

下一篇文章,我们看看如何在自己的Java代码里启动Ignite集群及其相关配置。

转载于:https://www.cnblogs.com/peppapigdaddy/p/9815848.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VGAE(Variational graph auto-encoders)论文及代码解读

一&#xff0c;论文来源 论文pdf Variational graph auto-encoders 论文代码 github代码 二&#xff0c;论文解读 理论部分参考&#xff1a; Variational Graph Auto-Encoders&#xff08;VGAE&#xff09;理论参考和源码解析 VGAE&#xff08;Variational graph auto-en…

IIS7设置

IIS 7.0和IIS 6.0相比改变很大谁都知道&#xff0c;而且在IIS 7.0中用VS2005来调试Web项目也不是什么新鲜的话题&#xff0c;但是我还是第一次运用这个东东&#xff0c;所以在此记下我的一些过程&#xff0c;希望能给更多的后来者带了一点参考。其实我写这篇文章时也参考了其他…

tableau大屏bi_Excel,Tableau,Power BI ...您应该使用什么?

tableau大屏biAfter publishing my previous article on data visualization with Power BI, I received quite a few questions about the abilities of Power BI as opposed to those of Tableau or Excel. Data, when used correctly, can turn into digital gold. So what …

python 可视化工具_最佳的python可视化工具

python 可视化工具Disclaimer: I work for Datapane免责声明&#xff1a;我为Datapane工作 动机 (Motivation) There are amazing articles on data visualization on Medium every day. Although this comes at the cost of information overload, it shouldn’t prevent you …

网络编程 socket介绍

Socket介绍 Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是一个门面模式&#xff0c;它把复杂的TCP/IP协议族隐藏在Socket接口后面&#xff0c;对用户来说&#xff0c;一组简单的接口就是全部。 Socket通…

猿课python 第三天

字典 字典是python中唯一的映射类型,字典对象是可变的&#xff0c;但是字典的键是不可变对象&#xff0c;字典中可以使用不同的键值字典功能> dict.clear()          -->清空字典 dict.keys()          -->获取所有key dict.values()      …

在C#中使用代理的方式触发事件

事件&#xff08;event&#xff09;是一个非常重要的概念&#xff0c;我们的程序时刻都在触发和接收着各种事件&#xff1a;鼠标点击事件&#xff0c;键盘事件&#xff0c;以及处理操作系统的各种事件。所谓事件就是由某个对象发出的消息。比如用户按下了某个按钮&#xff0c;某…

BP神经网络反向传播手动推导

BP神经网络过程&#xff1a; 基本思想 BP算法是一个迭代算法&#xff0c;它的基本思想如下&#xff1a; 将训练集数据输入到神经网络的输入层&#xff0c;经过隐藏层&#xff0c;最后达到输出层并输出结果&#xff0c;这就是前向传播过程。由于神经网络的输出结果与实际结果…

使用python和pandas进行同类群组分析

背景故事 (Backstory) I stumbled upon an interesting task while doing a data exercise for a company. It was about cohort analysis based on user activity data, I got really interested so thought of writing this post.在为公司进行数据练习时&#xff0c;我偶然发…

3.Contructor(构造器)模式—精读《JavaScript 设计模式》Addy Osmani著

同系列友情链接: 1.设计模式之初体验—精读《JavaScript 设计模式》Addy Osmani著 2.设计模式的分类—精读《JavaScript 设计模式》Addy Osmani著 Construct&#xff08;构造器&#xff09;模式 在经典的面向对象编程语言中&#xff0c;Construtor是一种在内存已分配给该对象的…

BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)

题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树。共有 \(q\) 次询问&#xff0c;每次询问两个参数 \(p, k\) 。询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为三个不同的点&#xff0c;\(p, a\) 都为 \(b\) 的祖先&#xff0c;且 \(p\) 到 \(a\) 的距离不能超过 \(k\) 。 …

搜索引擎优化学习原理_如何使用数据科学原理来改善您的搜索引擎优化工作

搜索引擎优化学习原理Search Engine Optimisation (SEO) is the discipline of using knowledge gained around how search engines work to build websites and publish content that can be found on search engines by the right people at the right time.搜索引擎优化(SEO…

Siamese网络(孪生神经网络)详解

SiameseFCSiamese网络&#xff08;孪生神经网络&#xff09;本文参考文章&#xff1a;Siamese背景Siamese网络解决的问题要解决什么问题&#xff1f;用了什么方法解决&#xff1f;应用的场景&#xff1a;Siamese的创新Siamese的理论Siamese的损失函数——Contrastive Loss损失函…

Dubbo 源码分析 - 服务引用

1. 简介 在上一篇文章中&#xff0c;我详细的分析了服务导出的原理。本篇文章我们趁热打铁&#xff0c;继续分析服务引用的原理。在 Dubbo 中&#xff0c;我们可以通过两种方式引用远程服务。第一种是使用服务直联的方式引用服务&#xff0c;第二种方式是基于注册中心进行引用。…

期权价格的上限和下限

期权按照买方权利性质分为&#xff1a;看涨期权和看跌期权 1、首先&#xff0c;看涨期权的上限和下限 看涨期权价格上限为其标的资产价格。 看涨期权是给予买方一个在未来买入标的资产的权利&#xff0c;如果该权利的价格高于标的资产的价格&#xff0c;那么投资者不如直接购买…

一件登录facebook_我从Facebook的R教学中学到的6件事

一件登录facebookBetween 2018 to 2019, I worked at Facebook as a data scientist — during that time I was involved in developing and teaching a class for R beginners. This was a two-day course that was taught about once a month to a group of roughly 15–20 …

SiameseFC超详解

SiameseFC前言论文来源参考文章论文原理解读首先要知道什么是SOT&#xff1f;&#xff08;Siamese要做什么&#xff09;SiameseFC要解决什么问题&#xff1f;SiameseFC用了什么方法解决&#xff1f;SiameseFC网络效果如何&#xff1f;SiameseFC基本框架结构SiameseFC网络结构Si…

Python全栈工程师(字符串/序列)

ParisGabriel Python 入门基础字符串&#xff1a;str用来记录文本信息字符串的表示方式&#xff1a;在非注释中凡是用引号括起来的部分都是字符串‘’ 单引号“” 双引号 三单引""" """ 三双引有内容代表非空字符串否则是空字符串 区别&#xf…

跨库数据表的运算

跨库数据表的运算&#xff0c;一直都是一个说难不算太难&#xff0c;说简单却又不是很简单的、总之是一个麻烦的事。大量的、散布在不同数据库中的数据表们&#xff0c;明明感觉要把它们合并起来&#xff0c;再来个小小的计算&#xff0c;似乎也就那么回事……但真要做起来&…