Designing Distributed Programs with a Raspberry Pi cluster
- 8. Collision detection: map based
boolean[][] map = newboolean[MAP_WIDTH][MAP_HEIGHT];
publicvoiddetectCollisions(List<Ship> ships) {
for(Ship s: ships) {
if(s.collidesWith(map)) {
s.bounce();
}
s.updateMap(map);
}
}
© Copyright 2013. First8
slide
8
- 9. Collision detection: object based
publicvoiddetectCollisions(List<Ship> ships) {
for (inti=0; i<ships.size(); i++) {
for (intj=i+1; j<ships.size(); j++) {
Ship a =ships.get(i);
Ship b =ships.get(j);
if (a.collidesWith(b)) {
a.bounce();
b.bounce();
}
}
}
}
© Copyright 2013. First8
slide
9
- 14. Hoe maak je iets gedistribueerd?
•
Kopieerallesnaaralle machines
– Meer machines betekentalleenmeer CPU
– Kaart&ruimteschepengelimiteerd tot 1 raspberry pi
– Veelnetwerkverkeer
© Copyright 2013. First8
slide
14
- 15. Hoe maak je iets gedistribueerd?
•
Verdeel de data
© Copyright 2013. First8
slide
15
- 16. Data verdelen
•
Verdeelschepen over servers
– Simpel
– Dichtbijzijndeschepenkunnen op andere server staan
•
Verdeelstukkenkaart (tiles) over servers
– Voeltnatuurlijker
– Lokale collision detection is triviaal
© Copyright 2013. First8
slide
16
- 18. Hazelcast distributed maps
•
Distributed Maps verdelen op basis van de key
•
Onze tiles hebben een Integer als key
class Tile {
inttileId;
Collection<Ship>ships;
}
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
Map<Integer,Tile> tiles = instance.getMap("tiles");
© Copyright 2013. First8
slide
18
- 19. Lokale tiles
•
Elke server heeft een eigen set lokale tiles
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Integer,Tile> tiles = instance.getMap("tiles");
for(;;) {
Set<Integer> localKeySet = tiles.localKeySet();
for (int tileId : localKeySet) {
handleTile(tileId);
}
}
© Copyright 2013. First8
slide
19
- 20. Lokale tiles per server
No detection across borders
© Copyright 2013. First8
slide
20
- 21. Randgevallen
•
Collision detection op de randen van tiles
– Lokalekopie van externe tile:
Map<Integer, Tile>tiles = hzInstance.getMap(“tiles”);
Tile tile = tiles.get(externalTileId);
– Of aan de andere server overlaten:
FutureTask task = newDistributedTask (
newCollisionDetect(ships, externalTileId),
externalTileId);
ExecutorServiceexecutorService = hzInstance.getExecutorService();
executorService.execute(task);
© Copyright 2013. First8
slide
21
- 22. BASE: Basically Available, Soft state, Eventual consistency
•
CAP theorie:
– Consistency
– Availability
– Partition tolerance
•
Overgangtussen tiles
– Dubbelrenderen
– Verdwijnendeschepen
© Copyright 2013. First8
slide
22
- 24. Hoe schaalbaar is het?
•
# Raspberry Pi’s < # Tiles
– Nooit helemaal gelijk verdeeld
© Copyright 2013. First8
slide
24
- 29. Hoe schaalbaar is het?
•
Moeilijkevraag.
•
Meer data ->efficientergebruik
– Of andersom: meer pi’s alleenzinnigalsergenoeg data is
•
In plaats van complexiteit: (iso) efficiency
•
Wijzigenverhoudingen ->andere bottlenecks
© Copyright 2013. First8
slide
29
- 32. High availability in Hazelcast
Config config = new Config();
MapConfig tilesMapConfig = config.getMapConfig("tiles");
tilesMapConfig.setAsyncBackupCount(1);
tilesMapConfig.setBackupCount(0);
HazelcastInstance i= Hazelcast.newHazelcastInstance(config);
Map<Integer,Tile>tiles = i.getMap("tiles");
© Copyright 2013. First8
slide
32
- 34. Availability
•
Test scenario’s zo dicht mogelijk bij de waarheid
– Een server die connecties weigert != Een server die niet antwoord
•
Echte hardware werkt het beste
© Copyright 2013. First8
slide
34
- 39. Inzichten
•
Profile!
•
Te veelvariabelen:
– Grotere tiles
• Minderruimteschepen/ pixel
– Minder botsingen
• Minder tile verhuizingen
– Kaartverdelen in meer tiles
• Gelijkmatigereverdeling
• Minder CPU per tile beschikbaar
© Copyright 2013. First8
slide
39
- 41. Inzichten
•
Pi’s zijn prima omkleine tests meeuittevoeren
•
Pi’s zijnbijuitstekgeschiktvoortesten van verstoringen
© Copyright 2013. First8
slide
41