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.pswp.cn/news/389272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389272.shtml
英文地址,請注明出處:http://en.pswp.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;似乎也就那么回事……但真要做起來&…