Presentatie over de inzet van Hazelcast bij de Nederlandse Spoorwegen in het project Bijsturingsapplicatie Materieel (B@M). Gehouden op J-Fall 2014 door Peter Rademaker en Roeland van Beek
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
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