Upload
roelandvanbeek
View
398
Download
0
Embed Size (px)
Citation preview
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