Ολοκληρωμένη υλοποίηση του Μέρους Α για το μάθημα "Κατανεμημένα Συστήματα". Το σύστημα αποτελεί μια πλήρως κατανεμημένη πλατφόρμα online τυχερών παιχνιδιών, βασισμένη στην αρχιτεκτονική Master-Worker με ενσωματωμένο MapReduce Framework και κεντρικό σύστημα δυναμικών ρυθμίσεων.
- Λουμίδης Αριστείδης (3230107)
- Καββαδά Γεωργία (3230059)
- Θειακού Ζωή (3230287)
Το σύστημα αποτελείται από 5 κύρια κατανεμημένα components που επικοινωνούν αποκλειστικά μέσω TCP Sockets:
-
Master Node (Orchestrator):
- Routing: Hashing
H(GameName) mod Nγια δίκαιη κατανομή φορτίου. - Transaction Safety: Atomic-like διαχείριση Balances με Refund logic σε περίπτωση αποτυχίας του Worker ή του SRG.
- MapReduce Coordinator: Ενορχηστρώνει τις φάσεις Map και Reduce, ενημερώνοντας δυναμικά τον Reducer για το πλήθος των ενεργών Workers.
- Routing: Hashing
-
Worker Nodes (Data Nodes):
- Thread-Safe Storage: Χρήση
synchronizedblocks για την προστασία των in-memory δεδομένων από ταυτόχρονα πονταρίσματα/αναζητήσεις. - Verified Betting: Επαλήθευση αποτελεσμάτων μέσω SHA-256 HMAC σε συνεργασία με τον SRG.
- Thread-Safe Storage: Χρήση
-
Reducer Node (Aggregation Node):
- Barrier Synchronization: Υλοποίηση Barrier με
wait/notify. Ο Master μπλοκάρεται μέχρι όλοι οι Workers να ολοκληρώσουν τη φάση Map. - Dynamic Scaling: Προσαρμόζεται αυτόματα στον αριθμό των Workers που ορίζει ο Master.
- Barrier Synchronization: Υλοποίηση Barrier με
-
Secured Random Generator (SRG):
- Producer-Consumer: Παραγωγή αριθμών σε background thread με χρήση ενδιάμεσου Buffer για ελαχιστοποίηση του latency.
-
Config System:
- Κεντρική διαχείριση μέσω των αρχείων
system.confκαιworkers.conf, επιτρέποντας την εκτέλεση σε διαφορετικά laptops χωρίς ανάγκη για re-compile.
- Κεντρική διαχείριση μέσω των αρχείων
- Add Game: Δυναμική προσθήκη παιχνιδιών μέσω Manual JSON Parsing (χωρίς εξωτερικές βιβλιοθήκες).
- Edit Risk: Αλλαγή επιπέδου ρίσκου (Low, Medium, High) με αυτόματο επανυπολογισμό του Jackpot.
- Remove Game: Απενεργοποίηση παιχνιδιού (Soft Delete) ώστε να μην εμφανίζεται στους παίκτες αλλά να διατηρούνται τα ιστορικά στατιστικά.
- Real-time Analytics: Προβολή κερδών/ζημιών μέσω MapReduce με ανάλυση:
Provider -> Game -> Total P/LκαιPlayer -> Total P/L.
- Token System: Πλήρες σύστημα Balance. Έλεγχος υπολοίπου πριν από κάθε ποντάρισμα και αυτόματη ενημέρωση μετά το αποτέλεσμα.
- Advanced Filtering: Αναζήτηση παιχνιδιών με συνδυαστικά φίλτρα (Stars, Bet Category $, Risk Level).
- Rating System: Δυνατότητα βαθμολογίας (1-5 αστέρια) με δυναμική ενημέρωση του μέσου όρου (double precision) και του πλήθους των ψήφων.
- Secure Betting: Κάθε ποντάρισμα επαληθεύεται με κρυπτογραφικό hash για την αποτροπή απάτης στη μεταφορά του τυχαίου αριθμού.
Βάλτε τα laptops στο ίδιο Wi-Fi ή στο ίδιο Hotspot κινητού.
MacOS
ipconfig getifaddr en0Παράδειγμα IP: 192.168.1.10
Windows
ipconfigΒρείτε το πεδίο IPv4 Address.
Παράδειγμα IP: 192.168.1.20
Τα παρακάτω αρχεία πρέπει να είναι ίδια σε όλα τα laptops.
system.conf: Ορίστε τις IPs των laptops που θα τρέχουν τους servers (Master, Reducer, SRG).workers.conf: Προσθέστε τις διευθύνσεις (IP:Port) όλων των Workers που θα συμμετέχουν.
Για τοπική εκτέλεση σε ένα laptop μπορείτε να χρησιμοποιήσετε localhost (default).
Σε κάθε laptop, ανοίξτε terminal μέσα στον φάκελο src και εκτελέστε:
javac Common/*.java SRG/*.java Reducer/*.java Worker/*.java Master/*.java Manager/*.java Player/*.javaΓια σωστή λειτουργία, εκκινήστε τα components με την εξής σειρά:
- SRG:
java SRG.SRGServer - Reducer:
java Reducer.ReducerNode - Master:
java Master.MasterNode - Workers:
java Worker.WorkerNode <port>(π.χ.8001,8002κλπ.) - Clients:
java Manager.ManagerAppήjava Player.DummyPlayer
Το project είναι οργανωμένο σε Java Packages:
src/
├── Common/ # Κοινές οντότητες (Game, Filters, Config, HashUtils)
├── Master/ # MasterNode και διαχείριση Workers
├── Worker/ # WorkerNode και επεξεργασία πονταρίσματος
├── Reducer/ # ReducerNode (MapReduce Aggregation)
├── SRG/ # Secured Random Generator (Producer-Consumer)
├── Manager/ # Manager Console Application
├── Player/ # Dummy Player Application (Console)
├── Games/ # Αρχεία JSON με δεδομένα παιχνιδιών
├── system.conf # Κεντρικές ρυθμίσεις IPs και Ports
└── workers.conf # Λίστα με τις διευθύνσεις των Workers
Όταν ο Manager ζητάει στατιστικά:
- Master: Στέλνει
SET_WORKER_COUNTστον Reducer καιPUSH_TO_REDUCERστους Workers. - Map Phase: Οι Workers στέλνουν snapshots των τοπικών PnL δεδομένων στον Reducer.
- Barrier: Ο Reducer συλλέγει τα δεδομένα. Αν ο Master ζητήσει αποτελέσματα πρόωρα, ο Reducer τον θέτει σε κατάσταση
wait(). - Reduce Phase: Μόλις ληφθούν όλα τα δεδομένα, ο Reducer εκτελεί
notifyAll(), απελευθερώνει τον Master και του στέλνει το τελικό aggregated Map.
- Zero-Library JSON Parsing: Υλοποίηση custom parser για την ανάγνωση των αρχείων παιχνιδιών, αποφεύγοντας εξωτερικές βιβλιοθήκες (Jackson/GSON) σύμφωνα με τους περιορισμούς της εργασίας.
- In-Memory Storage: Χρήση συγχρονισμένων HashMaps για μέγιστη ταχύτητα χωρίς τη χρήση βάσης δεδομένων.
- Security: Κάθε τυχαίος αριθμός συνοδεύεται από
SHA256(number + secretS). Ο Worker επαληθεύει το hash πριν οριστικοποιήσει το ποντάρισμα. - Fault Tolerance: Αν ένας Worker είναι μη διαθέσιμος κατά τη διάρκεια του παιχνιδιού, ο Master ανιχνεύει το σφάλμα και εκτελεί αυτόματο Refund στο balance του παίκτη.
- Data Integrity: Χρήση snapshots κατά τη φάση Map για αποφυγή
ConcurrentModificationExceptionκατά τη διάρκεια ενεργών πονταρισμάτων.
Υλοποιήθηκε στα πλαίσια του μαθήματος "Κατανεμημένα Συστήματα" του Οικονομικού Πανεπιστημίου Αθηνών - Εαρινό Εξάμηνο 2025-2026.