Θεμελιώδεις Αρχές Αρχιτεκτονικής
Τι είναι μια αρχιτεκτονική συστήματος και ποια είναι τα βασικά της στοιχεία;
Η αρχιτεκτονική ενός πληροφοριακού συστήματος αποτελεί τον θεμελιώδη χάρτη του, το πνευματικό του αποτύπωμα. Είναι η αφηρημένη αλλά ουσιαστική απεικόνιση του τρόπου με τον οποίο δομείται, επικοινωνεί και λειτουργεί ένα σύνολο τεχνολογικών υποσυστημάτων για να εξυπηρετήσει έναν κοινό σκοπό. Δεν αφορά τον κώδικα καθαυτό, αλλά τον τρόπο που οι δομικές ενότητες, υπηρεσίες, βάσεις δεδομένων, διεπαφές, δίκτυα, και μηχανισμοί ασφάλειας, αλληλοεπιδρούν ώστε να σχηματίζουν ένα ενιαίο, λειτουργικό οικοσύστημα.
Στην πράξη, η αρχιτεκτονική ορίζει τα όρια και τις σχέσεις μεταξύ των στοιχείων, καθορίζοντας όχι μόνο την τεχνική τους συνύπαρξη αλλά και τις αρχές που διέπουν την ανάπτυξή τους. Μια επιτυχημένη αρχιτεκτονική συστήματος δεν είναι απλώς ένα διάγραμμα με κουτάκια και βέλη, αλλά μια συνειδητή δέσμη αποφάσεων που ισορροπεί ανάμεσα στη λειτουργικότητα, την ασφάλεια, την επεκτασιμότητα και τη συντηρησιμότητα. Είναι το πλαίσιο μέσα στο οποίο ο κώδικας αποκτά νόημα και οι άνθρωποι μπορούν να χτίσουν, να αναπτύξουν και να εξελίξουν ένα σύστημα με συνέπεια και διάρκεια.
Ποια είναι η διαφορά μεταξύ μονολιθικής, μικροϋπηρεσιακής (microservices) και serverless αρχιτεκτονικής;
Η μονολιθική, η μικροϋπηρεσιακή και η serverless αρχιτεκτονική αποτελούν τρεις διαφορετικές φιλοσοφίες οργάνωσης μιας εφαρμογής, καθεμία με τη δική της ισορροπία μεταξύ απλότητας και ευελιξίας.
Η μονολιθική αρχιτεκτονική είναι η παραδοσιακή προσέγγιση, όπου όλη η λογική της εφαρμογής το frontend, η επιχειρησιακή λογική και η πρόσβαση στα δεδομένα, βρίσκεται σε ένα ενιαίο, αδιαίρετο σύνολο. Αυτό καθιστά την ανάπτυξη απλούστερη στα αρχικά στάδια, καθώς η αλληλεπίδραση των ενοτήτων είναι άμεση και εύκολη στην κατανόηση. Ωστόσο, καθώς το σύστημα μεγαλώνει, ο μονολιθικός χαρακτήρας γίνεται βάρος, η κλιμάκωση, η συντήρηση και οι ανεξάρτητες αναβαθμίσεις μετατρέπονται σε δύσκολα εγχειρήματα.
Η μικροϋπηρεσιακή αρχιτεκτονική, αντιθέτως, διασπά το σύστημα σε μικρές, αυτόνομες υπηρεσίες, καθεμία υπεύθυνη για ένα συγκεκριμένο επιχειρησιακό αντικείμενο. Οι υπηρεσίες αυτές επικοινωνούν μέσω καλά καθορισμένων διεπαφών, συνήθως REST ή μηνυμάτων. Το μοντέλο αυτό προάγει την ανεξαρτησία, την επαναχρησιμοποίηση και την ευκολότερη κλιμάκωση, όμως εισάγει πολυπλοκότητα στο δίκτυο, στη διαχείριση δεδομένων και στην παρακολούθηση.
Τέλος, η serverless αρχιτεκτονική ωθεί την αφαίρεση ακόμη πιο πέρα. Ο προγραμματιστής επικεντρώνεται αποκλειστικά στη λογική, ενώ η εκτέλεση των λειτουργιών του αναλαμβάνεται πλήρως από την πλατφόρμα, η οποία παρέχει αυτόματη κλιμάκωση και πληρωμή ανά χρήση. Είναι ένα μοντέλο εξαιρετικά αποδοτικό για γεγονότα μικρής διάρκειας ή για εφαρμογές με μεταβλητό φορτίο. Η τιμή του είναι η εξάρτηση από τον πάροχο και ο περιορισμένος έλεγχος στην υποδομή.
Τι σημαίνει loosely coupled και high cohesion και γιατί είναι σημαντικά;
Στην επιστήμη της αρχιτεκτονικής λογισμικού, οι έννοιες της χαλαρής σύζευξης και της υψηλής συνοχής αποτελούν δύο από τις σημαντικότερες αρχές σχεδιασμού.
Η χαλαρή σύζευξη (loose coupling) αναφέρεται στον βαθμό ανεξαρτησίας μεταξύ των ενοτήτων ενός συστήματος. Ένα σύστημα θεωρείται χαλαρά συζευγμένο όταν οι αλλαγές σε ένα τμήμα του δεν επιβάλλουν μεταβολές σε άλλα. Αυτή η ιδιότητα καθιστά το σύστημα ευέλικτο, επεκτάσιμο και εύκολα συντηρήσιμο. Είναι η αρχιτεκτονική αντανάκλαση της αυτονομίας.
Η υψηλή συνοχή (high cohesion), από την άλλη πλευρά, περιγράφει το εσωτερικό επίπεδο ομοιογένειας και εστίασης ενός module. Όταν μια ενότητα εκτελεί έναν και μόνο σαφώς καθορισμένο ρόλο και οι λειτουργίες της σχετίζονται στενά μεταξύ τους, τότε επιδεικνύει υψηλή συνοχή. Η συνέπεια αυτή οδηγεί σε καθαρότερο, πιο διαχειρίσιμο και λιγότερο εύθραυστο κώδικα.
Η σημασία αυτών των δύο αρχών έγκειται στην αλληλεξάρτησή τους, ένα καλά σχεδιασμένο σύστημα επιδιώκει ταυτόχρονα υψηλή συνοχή και χαλαρή σύζευξη, ώστε να επιτυγχάνει ευκαμψία χωρίς αποσύνδεση, και ανεξαρτησία χωρίς αποδιοργάνωση. Είναι το αρχιτεκτονικό ισοδύναμο της οργανικής συνοχής που χαρακτηρίζει κάθε ώριμο σύστημα.
Τι είναι το design pattern; Μπορείς να δώσεις παραδείγματα χρήσιμων
patterns (π.χ. Singleton, Factory, Observer);
Τα design patterns αποτελούν την κωδικοποίηση της συλλογικής εμπειρίας δεκαετιών προγραμματισμού. Είναι αφαιρετικές, αποδεδειγμένες λύσεις σε επαναλαμβανόμενα προβλήματα σχεδιασμού λογισμικού. Δεν είναι έτοιμες συνταγές, αλλά καθιερωμένα πρότυπα σκέψης και οργάνωσης που βοηθούν στην οικοδόμηση σταθερών και επεκτάσιμων δομών.
Η αξία ενός pattern έγκειται στο ότι προάγει τη συνέπεια και τη σαφήνεια. Παρέχει κοινό λεξιλόγιο σε αρχιτέκτονες και προγραμματιστές, διευκολύνοντας τη συνεργασία σε μεγάλης κλίμακας έργα. Παραδείγματος χάρη, το Singleton διασφαλίζει ότι υπάρχει μόνο μία κοινή παρουσία μιας κλάσης, το Factory Method επιτρέπει τη δημιουργία αντικειμένων χωρίς να γνωρίζει ο κώδικας τον ακριβή τύπο τους, ενώ το Observer οργανώνει την επικοινωνία μεταξύ αντικειμένων με τρόπο αντιδραστικό και μη παρεμβατικό.
Σε ένα ώριμο σύστημα, τα design patterns λειτουργούν σαν αρχιτεκτονικές «μεταφορές» — κρυσταλλώνουν δοκιμασμένες αρχές σε απλούς μηχανισμούς, καθιστώντας τον σχεδιασμό πιο ευανάγνωστο και το σύστημα πιο ανθεκτικό στη φθορά του χρόνου.
Πώς θα σχεδίαζες ένα σύστημα που πρέπει να κλιμακώνεται οριζόντια;
Οριζόντια κλιμάκωση σημαίνει να αυξάνεις τη δυναμικότητα ενός συστήματος όχι ενισχύοντας τη δύναμη ενός και μόνο διακομιστή, αλλά προσθέτοντας περισσότερους ομοειδείς κόμβους στο σύνολο. Είναι η προσέγγιση που επιτρέπει στα σύγχρονα συστήματα να εξυπηρετούν εκατομμύρια χρήστες χωρίς θεμελιώδεις αλλαγές στην αρχιτεκτονική τους. Για να το επιτύχει κανείς, απαιτείται μια σειρά από συνειδητές αρχιτεκτονικές επιλογές.
Το πρώτο βήμα είναι η αποδέσμευση της εφαρμογής από κάθε μορφή εσωτερικής κατάστασης. Οι υπηρεσίες πρέπει να είναι stateless, ώστε να μπορούν να πολλαπλασιαστούν χωρίς να εξαρτώνται από δεδομένα που κρατούν τοπικά. Όλη η προσωρινή πληροφορία μεταφέρεται σε κοινό αποθετήριο ή σε συστήματα cache, όπως το Redis. Πάνω από αυτά, τοποθετείται ένας μηχανισμός εξισορρόπησης φορτίου (load balancer), ο οποίος κατανέμει τα αιτήματα στους διαθέσιμους κόμβους ανάλογα με τη διαθεσιμότητά τους.
Η υποδομή πρέπει να προβλέπει αυτοματισμούς για τη δημιουργία και καταστροφή κόμβων ανάλογα με τη ζήτηση, κάτι που υλοποιείται μέσω auto-scaling groups στο cloud ή orchestration frameworks όπως το Kubernetes. Στο επίπεδο των δεδομένων, η βάση πρέπει να υποστηρίζει replication και partitioning, ώστε να επεκτείνεται οριζόντια όπως και η εφαρμογή. Η φιλοσοφία είναι απλή αλλά βαθιά: κανένας κόμβος δεν είναι κρίσιμος, και το σύστημα οφείλει να λειτουργεί εξίσου ομαλά με έναν ή με εκατοντάδες. Αυτό είναι το νόημα της οριζόντιας επεκτασιμότητας — η αρχιτεκτονική να είναι, εκ φύσεως, πολλαπλασιάσιμη.
Με άλλα λόγια οριζόντια κλιμάκωση, ή αλλιώς horizontal scaling, σημαίνει ότι όταν ένα σύστημα χρειάζεται να εξυπηρετήσει περισσότερους χρήστες ή περισσότερα αιτήματα, δεν προσπαθείς να κάνεις έναν υπολογιστή πιο ισχυρό, αλλά προσθέτεις περισσότερους υπολογιστές (ή servers) που κάνουν την ίδια δουλειά. Είναι σαν να μην προσπαθείς να φτιάξεις έναν υπερ-σερβιτόρο, αλλά να προσλαμβάνεις περισσότερους σερβιτόρους για να εξυπηρετούν τους πελάτες πιο γρήγορα.
Για να μπορεί να λειτουργήσει έτσι ένα σύστημα, πρέπει ο κάθε υπολογιστής να μην κρατά δικά του “τοπικά” δεδομένα — δηλαδή να μην εξαρτάται από κάτι που υπάρχει μόνο σε αυτόν. Όλες οι πληροφορίες που χρειάζονται, όπως στοιχεία χρηστών ή προσωρινά δεδομένα, πρέπει να φυλάσσονται σε ένα κοινό σημείο που να το βλέπουν όλοι οι servers. Αυτό γίνεται συνήθως με εργαλεία όπως το Redis, που λειτουργεί σαν κοινή μνήμη.
Πάνω από όλους αυτούς τους servers υπάρχει ένας load balancer, ένα είδος «διαιτητή» που αποφασίζει σε ποιον server θα στείλει κάθε αίτημα, ώστε να μοιράζεται δίκαια το φορτίο και να μην υπερφορτώνεται κάποιος.
Στο cloud, η οριζόντια κλιμάκωση γίνεται αυτόματα με auto-scaling. Αν για παράδειγμα μια εφαρμογή έχει πολλή κίνηση, το σύστημα μπορεί να προσθέσει αυτόματα νέους servers. Όταν πέφτει η κίνηση, τους μειώνει για να μην υπάρχει σπατάλη.
Τέλος, όπως προαναφέρθηκε και η βάση δεδομένων πρέπει να υποστηρίζει αυτή τη φιλοσοφία, δηλαδή να μπορεί να αντιγράφει ή να χωρίζει τα δεδομένα της σε πολλά κομμάτια (replication και partitioning), ώστε να μην αποτελεί εμπόδιο στην επεκτασιμότητα.
Να θυμάσαι..
Οριζόντια κλιμάκωση σημαίνει ότι φτιάχνεις ένα σύστημα που μπορεί να μεγαλώσει «προσθέτοντας» και όχι «ενισχύοντας». Ένα σύστημα που δεν βασίζεται σε έναν υπολογιστή, αλλά σε πολλούς, οι οποίοι συνεργάζονται τόσο ομαλά, ώστε να μοιάζουν με έναν ενιαίο οργανισμό.
Δείτε και τις 20 ερωτήσεις για IT Systems Architect (Αρχιτέκτονας Συστημάτων Πληροφορικής)
nikosst
Top comments (0)