Geen vertraging meer dankzij Hazelcast?

Post on 17-Feb-2017

397 views 0 download

Transcript of Geen vertraging meer dankzij Hazelcast?

Geen vertraging meer dankzij Hazelcast?Peter Rademaker (Info Support)

Roeland van Beek (Nederlandse Spoorwegen)

Agenda• IT bij NS• Conflictsignalering• Onze uitdaging• Introductie Hazelcast• Conflictsignalering met Hazelcast • Evaluatie

IT bij NS• IT is overal • It is groot (er werken 1000 mensen)• IT is bij ons de business• (Wacht op slides van Move NS)

Bijsturing

Bijsturingsapplicatie Materieel (B@M)

Conflictsignalering• Glazen bol voor de bijstuurder • Evaluatie van het hele plan in één oogopslag• Vertragingen en wijzigingen continu verwerkt

Conflictsignalering

Heden Toekomst➔ 🔧 ➔ ⚠

Plan

Technische uitdaging• Snel: dag analyseren in 10 seconden• Robuust: 24x7 beschikbaar• Schaalbaar: piekbelasting en toekomst• Onafhankelijk: geen invloed op rest van applicatie• Onderhoudbaar: levensduur 20 jaar

De oplossing• Relationele database

Inzet in vergelijkbare systemen niet voldoende

• In-memory datagrid• Oracle Coherence• GridGain• Terracotta• Hazelcast

Meet Hazelcast“An open-source in-memory datagrid”

• Founded by Talip Ozturk in 2008• CEO: Greg Luck (EHCache, JCache - JSR107 )• Open source, Apache License• Enterprise edition beschikbaar• Andere gebruikers:

De sterke punten van Hazelcast• Gedistribueerde implementatie van standaard Java

API’s• Collections (b.v. Map, Queue) • java.util.concurrent (b.v. Lock, AtomicInteger,

Executor Service)

• Antwoord op klassieke in-memory nadelen:• Beschikbaar RAM• Data verlies

• Peer-to-peer, geen SPOF

Hazelcast - een cluster starten

HazelcastInstance instance = Hazelcast.newHazelcastInstance();HazelcastInstance instance2 = Hazelcast.newHazelcastInstance();HazelcastInstance instance3 = Hazelcast.newHazelcastInstance();

CONSOLE OUTPUT: Members [3] {    Member [127.0.0.1:5701]    Member [127.0.0.1:5702] Member [127.0.0.1:5703] this}

HazelcastInstance client = HazelcastClient.newHazelcastClient();

Client

Hazelcast - datastructures Map<Integer, MaterieelEenheid> matEenheden = hzInstance.getMap(“matMap");matEenheden.put(1, new MaterieelEenheid(5281, “ICM-4"));matEenheden.put(2, new MaterieelEenheid(5615, “VIRM-4"));

List<Conflict> conflicten = hzInstance.getMap(”conflicten”);conflicten.add(new PlaatsConflict(“Ut“, “Ams”, 5615));conflicten.add(new PlaatsConflict(“Ensc“, “Sgc”, 5615));

Hazelcast – data replicatie• Voorbeeld 3 nodes, backup count 1:

• Backup count tot 6• Sync en async backup• Backup read

Map<Integer,MaterieelEenheid> matEenheden = hz.getMap(“matMap");matEenheden.put(1, new MaterieelEenheid(5281, “ICM-4"));matEenheden.put(2, new MaterieelEenheid(5615, “VIRM-4"));matEenheden.put(3, new MaterieelEenheid(2501, “ICM-3"));

1

2

3

1

2

3

Hazelcast Distributed queries• Zelf lokaal itereren en filteren is niet efficiënt…

• Criteria API:

• Distributed “SQL” query:SqlPredicate sqlPred = new SqlPredicate("actief AND plaatsen < 30");Collection<Employee> matEenheden = employeeMap.values(sqlPred);

EntryObject e = new PredicateBuilder().getEntryObject();Predicate pred = e.is("actief").and(e.get(“plaatsen").lessThan(30));

Collection<MaterieelEenheid> gevonden = matMap.values(pred);

Hazelcast Distributed queries• Hoe het werkt:• Predicate naar elk member• Filter lokale entries• Predicate aanvrager merget resultaten

• Voordelen• Schaalbaar: tijd op elke node wordt minder naarmate

meer nodes• Alleen gefilterde data over het netwerk

Hazelcast @ conflictsignalering: initialisatie

65

6598

98

9865

Hazelcast @ conflictsignalering: mutaties

5

598

98BC A

ABC

Distributed Executor Service• Gedistribueerd uitvoeren van Callable of Runnable• Op: willekeurige node, specifieke node, op key-

owner node, subset van cluster nodesHazelcastInstance instance = Hazelcast.newHazelcastInstance();IExecutorService execS = instance.getExecutorService("default");

Future<List<Conflict>> conflictenFuture = execS.submit( new MancoConflictDetector(input));List<Conflict> mancoConflicten = conflicteFuture.get();System.out.println(mancoConflicten);

Hazelcast @ cs: distributed execution

5

598

98C A

A C

Hazelcast en transacties

TransactionContext txContext = instance.newTransactionContext();txContext.beginTransaction();

TransactionalMap<String, String> map = txContext.getMap("mymap");TransactionalSet<Integer> set = txContext.getSet("myset");

try { map.put("1", "value1"); set.add(8); txContext.commitTransaction();} catch (Throwable t) { txContext.rollbackTransaction();}

• We willen consistentie van het datagrid garanderen en daarom het grid transactioneel muteren

Hazelcast Resource Adapter• Meedraaien in JEE transactions• Nog niet heel volwassen

@Resource(mappedName = "java:/HazelcastCF")protected HazelcastConnectionFactory connectionFactory;

HazelcastConnection c = connectionFactory.getConnection();

TransactionalMap<String, String> txMap =conn.getTransactionalMap("default");txMap.put("key", "value")

Hazelcast Community• Zeer actief• Issues binnen seconden/minuten in

behandeling

https://github.com/hazelcast/hazelcast/issues/....

Duur issue opgelost

#3350 4d

#3024 12d

#1415 1d

#2260 1d

#2089 18d

#3384 2d

#3385 pending

#2410 10d

#2570 25d

#2410 20d

EvaluatieVoordelen• Snel, robuust, schaalbaar• Eenvoudig in gebruik• Actieve community

Nadelen• Nog niet helemaal volwassen

Meer weten?www.ns.nl

www.infosupport.com