Kratki vodič za Apache Geode

1. Pregled

Apache Geode distribuirana je mreža podataka u memoriji koja podržava predmemoriranje i izračunavanje podataka.

U ovom ćemo uputstvu pokriti Geodeove ključne koncepte i proći kroz neke uzorke koda koristeći njegov Java klijent.

2. Postavljanje

Prvo, moramo preuzeti i instalirati Apache Geode i postaviti gfsh okoliš. Da bismo to učinili, možemo slijediti upute u službenom vodiču tvrtke Geode.

I drugo, ovaj vodič će stvoriti neke artefakte datotečnog sustava. Dakle, možemo ih izolirati stvaranjem privremenog direktorija i pokretanjem stvari odatle.

2.1. Instalacija i konfiguracija

Iz našeg privremenog direktorija moramo pokrenuti a Lokator primjer:

gfsh> start locator --name = locator --bind-address = localhost

Lokatori odgovorni su za koordinaciju između različitih članova Geode Klastera, koje možemo dalje administrirati putem JMX-a.

Dalje, započnimo a Poslužitelj primjerice za hostiranje jednog ili više podataka Regijas:

gfsh> start server --name = server1 --server-port = 0

Postavili smo –Server-port opcija na 0 tako da će Geode odabrati bilo koji raspoloživi priključak. Iako ga izostavimo, poslužitelj će koristiti zadani port 40404. Poslužitelj je konfigurabilni član Klastera koji se odvija kao dugotrajan proces i odgovoran je za upravljanje podacima Regije.

I na kraju, trebamo Regija:

gfsh> stvoriti regiju --name = baeldung - type = REPLICATE

The Regija na kraju ćemo pohraniti svoje podatke.

2.2. Verifikacija

Pobrinimo se da sve funkcionira prije nego što krenemo dalje.

Prvo, provjerimo imamo li svoje Poslužitelj i naše Lokator:

gfsh> članovi popisa Ime | Id ------- | -------------------------------------------------- -------- poslužitelj1 | 192.168.0.105 (poslužitelj1: 6119): 1024 lokator | 127.0.0.1 (lokator: 5996: lokator): 1024 [koordinator]

I dalje, da imamo svoje Regija:

gfsh> opiši regiju --name = baeldung ......................................... ................. Ime: baeldung Podaci o pravilima: replicirajte članove hostinga: server1 Ne-zadani atributi koje dijele članovi članova hostinga | Ime | Vrijednost ------ | ----------- | --------------- Regija | politika podataka | ZAMIJENI | veličina | 0 | opseg | raspodijeljeni-ack

Također, trebali bismo imati neke direktorije na datotečnom sustavu u našem privremenom direktoriju nazvanom "lokator" i "server1".

S ovim izlazom znamo da smo spremni za dalje.

3. Ovisnost Mavena

Sad kad imamo pokrenut Geode, krenimo s gledanjem klijentskog koda.

Da bismo radili s Geodeom u našem Java kodu, morat ćemo dodati klijentsku knjižnicu Apache Geode Java u našu pom:

 org.apache.geode geode-core 1.6.0 

Počnimo s jednostavnim pohranjivanjem i dohvaćanjem nekih podataka u nekoliko regija.

4. Jednostavno spremanje i preuzimanje

Pokažimo kako se pohranjuju pojedinačne vrijednosti, serije vrijednosti kao i prilagođeni objekti.

Da započnemo s pohranjivanjem podataka u našoj regiji "baeldung", povežimo se s njim pomoću lokatora:

@Prije javne void connect () {this.cache = new ClientCacheFactory () .addPoolLocator ("localhost", 10334) .create (); this.region = predmemorija. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung"); }

4.1. Spremanje pojedinačnih vrijednosti

Sada možemo jednostavno pohraniti i dohvatiti podatke u našoj regiji:

@Test public void whenSendMessageToRegion_thenMessageSavedSuccessfully () {this.region.put ("A", "Hello"); this.region.put ("B", "Baeldung"); assertEquals ("Zdravo", region.get ("A")); assertEquals ("Baeldung", region.get ("B")); }

4.2. Spremanje više vrijednosti odjednom

Također možemo spremiti više vrijednosti odjednom, recimo kada pokušavamo smanjiti kašnjenje mreže:

@Test public void whenPutMultipleValuesAtOnce_thenValuesSavedSuccessfully () {dobavljač tipke = () -> Stream.of ("A", "B", "C", "D", "E"); Vrijednosti karte = keys.get () .collect (Collectors.toMap (Function.identity (), String :: toLowerCase)); this.region.putAll (vrijednosti); keys.get () .forEach (k -> assertEquals (k.toLowerCase (), this.region.get (k))); }

4.3. Spremanje prilagođenih objekata

Nizovi su korisni, ali prije nego što će kasnije trebati pohraniti prilagođene objekte.

Zamislimo da imamo evidenciju kupaca koju želimo pohraniti pomoću sljedeće vrste ključa:

javna klasa CustomerKey implementira Serializable {private long id; privatna gudačka zemlja; // getteri i postavljači // jednako i hashcode}

I sljedeći tip vrijednosti:

kupac javne klase implementira serializable {private CustomerKey key; private String firstName; private String lastName; privatno Integer doba; // geteri i postavljači}

Postoji nekoliko dodatnih koraka kako biste ih mogli pohraniti:

Prvi, trebali bi provesti Serijalizirati. Iako to nije strog zahtjev, njihovim postavljanjem Serializirati, Geode ih može robusnije pohraniti.

Drugi, moraju biti na stazi naše aplikacije kao i na stazi naše Geode Poslužitelj.

Da bismo ih odveli do staze poslužitelja, upakirajmo ih, recimo koristeći mvn čist paket.

A onda rezultirajuću teglu možemo uputiti u novu startni poslužitelj naredba:

gfsh> zaustavi poslužitelj --name = server1 gfsh> start server --name = server1 --classpath = .. / lib / apache-geode-1.0-SNAPSHOT.jar --server-port = 0

Opet, ove naredbe moramo pokrenuti iz privremenog direktorija.

Napokon, kreirajmo novo Regija pod nazivom "kupci baeldung" na Poslužitelj koristeći istu naredbu koju smo koristili za stvaranje regije "baeldung":

gfsh> stvoriti regiju --name = baeldung-kupci - type = REPLICATE

U kodu ćemo se obratiti lokatoru kao i prije, navodeći prilagođenu vrstu:

@Prije javne void connect () {// ... povezivanje putem lokatora this.customerRegion = this.cache. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung-kupci"); }

I tada možemo pohraniti kupca kao i prije:

@Test public void whenPutCustomKey_thenValuesSavedSuccessfully () {CustomerKey key = novi CustomerKey (123); Kupac kupac = novi kupac (ključ, "William", "Russell", 35); this.customerRegion.put (ključ, kupac); Kupac StoreCustomer = this.customerRegion.get (ključ); assertEquals ("William", storedCustomer.getFirstName ()); assertEquals ("Russell", storedCustomer.getLastName ()); }

5. Vrste regija

U većini okruženja imat ćemo više kopija ili više particija naše regije, ovisno o našim zahtjevima protoka čitanja i pisanja.

Do sada smo koristili preslikane regije u memoriji. Pogledajmo izbliza.

5.1. Replicirana regija

Kao što i samo ime govori, a Replicirana regija čuva kopije svojih podataka na više njih Poslužitelj. Isprobajmo ovo.

Od gfsh konzolu u radnom direktoriju, dodajmo još jednu Poslužitelj imenovan poslužitelj2 klasteru:

gfsh> startni poslužitelj --name = server2 --classpath = .. / lib / apache-geode-1.0-SNAPSHOT.jar --server-port = 0

Sjetite se da smo, kada smo radili "baeldung", koristili –Tip = ZAMJENI. Zbog ovoga, Geode će automatski replicirati naše podatke na novi poslužitelj.

Provjerimo to zaustavljanjem poslužitelj1:

gfsh> zaustavi poslužitelj --name = server1

A onda izvršimo brzi upit o regiji "baeldung".

Ako su se podaci uspješno replicirali, vratit ćemo rezultate:

gfsh> query --query = 'select e.key from /baeldung.entries e' Rezultat: true Ograničenje: 100 redaka: 5 rezultat ------ C B A E D

Dakle, čini se da je replikacija uspjela!

Dodavanjem replike u našu regiju poboljšava se dostupnost podataka. I, budući da više od jednog poslužitelja može odgovoriti na upite, dobit ćemo i veću propusnost čitanja.

Ali, što ako se oboje sruše? Budući da se radi o regijama u memoriji, podaci će se izgubiti.Umjesto toga možemo koristiti –Tip = REPLICATE_PERSISTENT koja također pohranjuje podatke na disk tijekom repliciranja.

5.2. Podijeljena regija

S većim skupovima podataka možemo bolje prilagoditi sustav konfiguriranjem Geodea da podijeli regiju na zasebne particije ili segmente.

Stvorimo jedan particionirani Regija pod nazivom "baeldung-partitioned":

gfsh> stvoriti regiju --name = baeldung-partitioned --type = PARTITION

Dodajte neke podatke:

gfsh> put --region = baeldung-partitioned --key = "1" --value = "one" gfsh> put --region = baeldung-partitioned --key = "2" --value = "two" gfsh> put --region = baeldung-partitioned --key = "3" --value = "three"

I brzo provjerite:

gfsh> query --query = 'select e.key, e.value from /baeldung-partitioned.entries e' Rezultat: true Ograničenje: 100 redaka: 3 ključa | vrijednost --- | ----- 2 | dva 1 | jedan 3 | tri

Zatim, da provjerimo jesu li podaci podijeljeni, zaustavimo se poslužitelj1 opet i ponovite upit:

gfsh> zaustavi poslužitelj --name = server1 gfsh> upit --query = 'odaberite e.key, e.value iz /baeldung-partitioned.entries e' Rezultat: true Ograničenje: 100 redaka: 1 ključ | vrijednost --- | ----- 2 | dva

Ovog smo puta vratili samo neke unose podataka jer taj poslužitelj ima samo jednu particiju podataka, pa kada poslužitelj1 pao, njegovi su podaci izgubljeni.

Ali što ako trebamo i particioniranje i suvišnost? Geode također podržava brojne druge vrste. Sljedeća su tri priručna:

  • PREGRADA_REDUNDANTNA pregrade i replicira naše podatke kroz različite članove klastera
  • PREGRADA_TRAJNO dijeli podatke poput PREGRADA, ali na disk i
  • PARTITION_REDUNDANT_PERSISTENT daje nam sva tri ponašanja.

6. Jezik upita objekta

Geode također podržava Object Query Language, ili OQL, koji može biti moćniji od jednostavnog pretraživanja ključeva. To je pomalo poput SQL-a.

Za ovaj primjer upotrijebimo regiju "baeldung-customer" koju smo ranije izgradili.

Ako dodamo još nekoliko kupaca:

Podaci karte = novi HashMap (); data.put (novi ključ kupca (1), novi kupac ("Gheorge", "Manuc", 36)); data.put (novi ključ kupca (2), novi kupac ("Allan", "McDowell", 43)); this.customerRegion.putAll (podaci);

Tada možemo koristiti QueryService kako biste pronašli kupce čije je ime "Allan":

QueryService queryService = this.cache.getQueryService (); String query = "select * from / baeldung-customers c where c.firstName = 'Allan'"; Rezultati SelectResults = (SelectResults) queryService.newQuery (upit) .execute (); assertEquals (1, results.size ());

7. Funkcija

Jedan od najsnažnijih pojmova mreža podataka u memoriji je ideja „odvođenja proračuna u podatke“.

Jednostavno rečeno, budući da je Geode čista Java, lako nam je ne samo slati podatke već i logiku za izvršavanje tih podataka.

To bi nas moglo podsjetiti na ideju SQL proširenja poput PL-SQL ili Transact-SQL.

7.1. Definiranje funkcije

Da biste definirali jedinicu rada za Geode,provodimo Geode-ove Funkcija sučelje.

Na primjer, zamislimo da trebamo promijeniti sva imena kupaca u velika slova.

Umjesto da upitujemo podatke i da naša aplikacija obavi posao, možemo samo implementirati Funkcija:

javna klasa UpperCaseNames implementira funkciju {@Override javno void izvršenje (kontekst FunctionContext) {RegionFunctionContext regionContext = (RegionFunctionContext) kontekst; Regija regija = regionContext.getDataSet (); for (Map.Entry entry: region.entrySet ()) {Kupac kupac = entry.getValue (); customer.setFirstName (customer.getFirstName (). toUpperCase ()); } context.getResultSender (). lastResult (true); } @Override javni niz getId () {return getClass (). GetName (); }}

Imajte na umu da getId mora vratiti jedinstvenu vrijednost, tako da je naziv klase obično dobar odabir.

The FunctionContext sadrži sve naše podatke o regiji, pa tako možemo od njega napraviti sofisticiraniji upit ili, kao što smo ovdje radili, mutirati.

I Funkcija ima puno više snage od ove, pa pogledajte službeni priručnik, posebno getResultSender metoda.

7.2. Funkcija postavljanja

Moramo osvijestiti Geode o našoj funkciji kako bismo je mogli pokretati. Kao što smo to učinili s našim prilagođenim vrstama podataka, pakirat ćemo i jar.

Ali ovaj put, možemo samo koristiti rasporediti naredba:

gfsh> implementacija --jar =. / lib / apache-geode-1.0-SNAPSHOT.jar

7.3. Izvršavanje funkcije

Sada možemo izvršiti Funkcija iz aplikacije pomoću FunctionService:

@Test public void whenExecuteUppercaseNames_thenCustomerNamesAreUppercased () {Izvršenje izvršenja = FunctionService.onRegion (this.customerRegion); execute.execute (UpperCaseNames.class.getName ()); Kupac kupac = this.customerRegion.get (novi CustomerKey (1)); assertEquals ("GHEORGE", customer.getFirstName ()); }

8. Zaključak

U ovom smo članku naučili osnovne pojmove Apache Geode ekosustav. Pregledali smo jednostavne dobivanja i stavljanja sa standardnim i prilagođenim vrstama, repliciranim i podijeljenim regijama te podrškom za oql i funkcije.

I kao i uvijek, svi su ti uzorci dostupni na GitHubu.