geen vertraging meer dankzij hazelcast?
TRANSCRIPT
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