SlideShare a Scribd company logo
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 
Plan 
Heden Toekomst 
➔  ➔ ⚠
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(); 
HazelcastInstance client = HazelcastClient.newHazelcastClient(); 
CONSOLE OUTPUT: 
Members [3] { 
Member [127.0.0.1:5701] 
Member [127.0.0.1:5702] 
Member [127.0.0.1:5703] this 
} 
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: 
2 
1 
3 
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")); 
• Backup count tot 6 
• Sync en async backup 
• Backup read 
1 
3 
2
Hazelcast Distributed queries 
• Zelf lokaal itereren en filteren is niet efficiënt… 
• Criteria API: 
EntryObject e = new PredicateBuilder().getEntryObject(); 
Predicate pred = e.is("actief").and(e.get(“plaatsen").lessThan(30)); 
Collection<MaterieelEenheid> gevonden = matMap.values(pred); 
• Distributed “SQL” query: 
SqlPredicate sqlPred = new SqlPredicate("actief AND plaatsen < 30"); 
Collection<Employee> matEenheden = employeeMap.values(sqlPred);
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 
5 6 
8 9 
5 6 
5 6 8 9
Hazelcast @ conflictsignalering: mutaties 
5 
BC 8 9 A 
5 
BC
Distributed Executor Service 
• Gedistribueerd uitvoeren van Callable of Runnable 
• Op: willekeurige node, specifieke node, op key-owner 
node, subset van cluster nodes 
HazelcastInstance 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 
C 8 9 A 
5 
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://githu 
b.com/hazel 
cast/hazelca 
st/issues/.... 
Duur 
issue 
opgelost 
#3350 4d 
#3024 12d 
#1415 1d 
#2260 1d 
#2089 18d 
#3384 2d 
#3385 pending 
#2410 10d 
#2570 25d 
#2410 20d
Evaluatie 
Voordelen 
• Snel, robuust, schaalbaar 
• Eenvoudig in gebruik 
• Actieve community 
Nadelen 
• Nog niet helemaal volwassen
Meer weten? 
www.ns.nl 
www.infosupport.com

More Related Content

Viewers also liked (8)

Taxation and the constitution
Taxation and the constitutionTaxation and the constitution
Taxation and the constitution
 
1.Engineering Certificate
1.Engineering Certificate1.Engineering Certificate
1.Engineering Certificate
 
Test
TestTest
Test
 
Controlo qualidade e processos de fiações de fios para malhas
Controlo qualidade e processos de fiações de fios para malhasControlo qualidade e processos de fiações de fios para malhas
Controlo qualidade e processos de fiações de fios para malhas
 
10º alguns esquemas biologia
10º alguns esquemas biologia10º alguns esquemas biologia
10º alguns esquemas biologia
 
Prof Survey Profile
Prof Survey ProfileProf Survey Profile
Prof Survey Profile
 
Govt 2306 ch_10
Govt 2306 ch_10Govt 2306 ch_10
Govt 2306 ch_10
 
sunfeast product mix
sunfeast product mix sunfeast product mix
sunfeast product mix
 

Geen vertraging meer dankzij Hazelcast?

  • 1. Geen vertraging meer dankzij Hazelcast? Peter Rademaker (Info Support) Roeland van Beek (Nederlandse Spoorwegen)
  • 2. Agenda • IT bij NS • Conflictsignalering • Onze uitdaging • Introductie Hazelcast • Conflictsignalering met Hazelcast • Evaluatie
  • 3. 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)
  • 6. Conflictsignalering • Glazen bol voor de bijstuurder • Evaluatie van het hele plan in één oogopslag • Vertragingen en wijzigingen continu verwerkt
  • 7. Conflictsignalering Plan Heden Toekomst ➔  ➔ ⚠
  • 8. 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
  • 9. De oplossing • Relationele database Inzet in vergelijkbare systemen niet voldoende • In-memory datagrid • Oracle Coherence • GridGain • Terracotta • Hazelcast
  • 10. 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:
  • 11. 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
  • 12. Hazelcast - een cluster starten HazelcastInstance instance = Hazelcast.newHazelcastInstance(); HazelcastInstance instance2 = Hazelcast.newHazelcastInstance(); HazelcastInstance instance3 = Hazelcast.newHazelcastInstance(); HazelcastInstance client = HazelcastClient.newHazelcastClient(); CONSOLE OUTPUT: Members [3] { Member [127.0.0.1:5701] Member [127.0.0.1:5702] Member [127.0.0.1:5703] this } Client
  • 13. 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));
  • 14. Hazelcast – data replicatie • Voorbeeld 3 nodes, backup count 1: 2 1 3 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")); • Backup count tot 6 • Sync en async backup • Backup read 1 3 2
  • 15. Hazelcast Distributed queries • Zelf lokaal itereren en filteren is niet efficiënt… • Criteria API: EntryObject e = new PredicateBuilder().getEntryObject(); Predicate pred = e.is("actief").and(e.get(“plaatsen").lessThan(30)); Collection<MaterieelEenheid> gevonden = matMap.values(pred); • Distributed “SQL” query: SqlPredicate sqlPred = new SqlPredicate("actief AND plaatsen < 30"); Collection<Employee> matEenheden = employeeMap.values(sqlPred);
  • 16. 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
  • 17. Hazelcast @ conflictsignalering: initialisatie 5 6 8 9 5 6 5 6 8 9
  • 18. Hazelcast @ conflictsignalering: mutaties 5 BC 8 9 A 5 BC
  • 19. Distributed Executor Service • Gedistribueerd uitvoeren van Callable of Runnable • Op: willekeurige node, specifieke node, op key-owner node, subset van cluster nodes HazelcastInstance 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);
  • 20. Hazelcast @ cs: distributed execution 5 C 8 9 A 5 C
  • 21. 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
  • 22. 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")
  • 23. Hazelcast Community • Zeer actief • Issues binnen seconden/minuten in behandeling https://githu b.com/hazel cast/hazelca st/issues/.... Duur issue opgelost #3350 4d #3024 12d #1415 1d #2260 1d #2089 18d #3384 2d #3385 pending #2410 10d #2570 25d #2410 20d
  • 24. Evaluatie Voordelen • Snel, robuust, schaalbaar • Eenvoudig in gebruik • Actieve community Nadelen • Nog niet helemaal volwassen
  • 25. Meer weten? www.ns.nl www.infosupport.com