ΑρχικήΛογισμικάCQRS: Η βάση για μια σύγχρονη, ευέλικτη και επεκτάσιμη αρχιτεκτονική εφαρμογών

CQRS: Η βάση για μια σύγχρονη, ευέλικτη και επεκτάσιμη αρχιτεκτονική εφαρμογών

Συχνά ακούμε ότι τα πολύπλοκα συστήματα βασίζονται στο CQRS. Αλλά τι ακριβώς είναι το CQRS; Τι κρύβεται πίσω από αυτό το ακρωνύμιο και πως μπορούμε να το χρησιμοποιήσουμε;

Τι είναι το CQRS;

Το ακρωνύμιο CQRS σημαίνει “Command Query Responsibility Segregation“, δηλαδή τον διαχωρισμό των ευθυνών για τις εντολές (Commands) και τα ερωτήματα (Queries). Η βασική ιδέα του CQRS είναι ότι υπάρχουν μόνο δύο τύποι αλληλεπιδράσεων με μια εφαρμογή: είτε ο χρήστης εκτελεί μια ενέργεια με σκοπό να αλλάξει κάτι στο σύστημα, είτε θέλει να μάθει κάτι. Δεν υπάρχουν άλλες επιλογές.

Με άλλα λόγια, είτε δίνετε μια εντολή (Command) στο λογισμικό για να εκτελέσει μια συγκεκριμένη ενέργεια, είτε κάνετε μια ερώτηση (Query) για να λάβετε πληροφορίες. Η εντολή συνήθως προκαλεί μια αλλαγή και επομένως μια εγγραφή, ενώ το ερώτημα αφορά μόνο την ανάγνωση δεδομένων. Το σχέδιο CQRS προτείνει ότι θα πρέπει να διαχωρίσετε την εφαρμογή σας σε δύο μέρη: ένα για τις εγγραφές και ένα για τις αναγνώσεις.

Γιατί να χρησιμοποιήσουμε το CQRS;

Η ερώτηση που προκύπτει είναι: Γιατί να χρησιμοποιήσουμε αυτή την προσέγγιση; Η απάντηση βρίσκεται στη διαχείριση των δεδομένων. Σε μια κλασική αρχιτεκτονική, έχουμε μια διεπαφή χρήστη (UI), μια API και μια βάση δεδομένων. Το μοντέλο δεδομένων που επιλέγουμε στη βάση δεδομένων επηρεάζει σημαντικά τη λογική της εφαρμογής.

Στη θεωρία των βάσεων δεδομένων, υπάρχουν διάφορες κανονικές μορφές (Normal Forms). Η πέμπτη κανονική μορφή θεωρείται το “ιερό δισκοπότηρο” για τη δημιουργία ενός καθαρού και οργανωμένου μοντέλου δεδομένων, χωρίς διπλοτυπίες και περαιτέρω άχρηστα πράγματα.

Ωστόσο, αυτή η μορφή είναι εξαιρετικά δύσκολη στην ανάγνωση δεδομένων, αφού απαιτεί πολύπλοκες ερωτήματα. Από την άλλη πλευρά, η πρώτη κανονική μορφή είναι ιδανική για την ανάγνωση, αλλά δυσκολεύει τις εγγραφές λόγω της επανάληψης πληροφοριών.

Στην πράξη, χρησιμοποιούμε συνήθως την τρίτη κανονική μορφή, η οποία είναι ένας συμβιβασμός μεταξύ των δύο. Ωστόσο, αυτή η προσέγγιση δεν είναι ιδανική ούτε για τις εγγραφές ούτε για τις αναγνώσεις. Εδώ έρχεται το CQRS: αντί να προσπαθούμε να ικανοποιήσουμε και τις δύο ανάγκες με ένα μοντέλο δεδομένων, χρησιμοποιούμε δύο ξεχωριστά μοντέλα – ένα για τις εγγραφές και ένα για τις αναγνώσεις.

Παράδειγμα: Η δημόσια βιβλιοθήκη

Ας δούμε ένα παράδειγμα για να κατανοήσουμε καλύτερα το CQRS. Φανταστείτε μια δημόσια βιβλιοθήκη, όπου οι χρήστες μπορούν να δανείζονται βιβλία. Κάθε ενέργεια, όπως η δανεισμός, η επέκταση της δανειστικής περιόδου ή η επιστροφή ενός βιβλίου, είναι μια εντολή (Command) που αλλάζει την κατάσταση του συστήματος. Αυτές οι αλλαγές καταγράφονται ως συμβάντα (Events) σε ένα αρχείο καταγραφής (Append-Only Log), το οποίο αποτελεί το μοντέλο εγγραφής.

Από την άλλη πλευρά, αν η βιβλιοθήκη θέλει να μάθει ποια βιβλία είναι δανεισμένα αυτή τη στιγμή ή ποια βιβλία επιστράφηκαν κατεστραμμένα, αυτές είναι ερωτήματα (Queries). Για να απαντηθούν αυτές οι ερωτήσεις αποτελεσματικά, χρειαζόμαστε ένα ξεχωριστό μοντέλο ανάγνωσης, το οποίο μπορεί να είναι μια απλή πίνακας με τα τρέχοντα δανεισμένα βιβλία.

Δημιουργία μοντέλων ανάγνωσης

Το πιο ενδιαφέρον ερώτημα είναι: Πώς δημιουργούμε αυτά τα μοντέλα ανάγνωσης; Η απάντηση είναι απλή: τα δημιουργούμε παράλληλα με τα συμβάντα. Κάθε φορά που καταγράφεται ένα συμβάν, όπως η δανεισμός ενός βιβλίου, ενημερώνουμε το μοντέλο ανάγνωσης. Έτσι, όταν κάποιος ρωτά ποια βιβλία είναι δανεισμένα, η απάντηση είναι ήδη διαθέσιμη.

Το πλεονέκτημα αυτής της προσέγγισης είναι ότι μπορούμε να δημιουργήσουμε μοντέλα ανάγνωσης για συγκεκριμένες ανάγκες, χωρίς να χρειάζεται να γνωρίζουμε εκ των προτέρων ποιες ερωτήσεις θα προκύψουν στο μέλλον. Επιπλέον, μπορούμε να χρησιμοποιήσουμε διαφορετικές τεχνολογίες για κάθε μοντέλο ανάγνωσης, ανάλογα με τις ανάγκες.

Προκλήσεις και ευκαιρίες

Όπως κάθε προσέγγιση, και το CQRS έχει τις προκλήσεις του. Η κύρια δυσκολία είναι η συγχρονισμός μεταξύ του μοντέλου εγγραφής και του μοντέλου ανάγνωσης. Αυτός ο συγχρονισμός μπορεί να καθυστερήσει λίγο, γεγονός που οδηγεί σε μια κατάσταση γνωστή ως “eventual consistency” (τελικά συνοχή). Αυτό σημαίνει ότι τα δεδομένα δεν είναι άμεσα συνεπή, αλλά γίνονται συνεπή μετά από μια μικρή καθυστέρηση.

Αυτή η καθυστέρηση μπορεί να μην είναι πρόβλημα σε πολλές εφαρμογές, αλλά σε ορισμένες περιπτώσεις, όπως σε συστήματα που αφορούν την εθνική ασφάλεια, η άμεση συνοχή (strong consistency) είναι απαραίτητη.

Συμπέρασμα

Το CQRS είναι μια ισχυρή προσέγγιση για τη δημιουργία μοντέρνων και επεκτάσιμων εφαρμογών. Διαχωρίζοντας τις εγγραφές από τις αναγνώσεις, μπορούμε να βελτιστοποιήσουμε και τις δύο διαδικασίες, προσφέροντας ταχύτερες και πιο αποτελεσματικές λύσεις.

Αν και μπορεί να φαίνεται αρχικά περίπλοκο, η κατανόηση και η εφαρμογή του CQRS μπορεί να αποδειχθεί εξαιρετικά ωφέλιμη για τους προγραμματιστές.

Στέλιος Θεοδωρίδης
Στέλιος Θεοδωρίδης
Ο ήρωας μου είναι ο γάτος μου ο Τσάρλι και ακροάζομαι μόνο Psychedelic Trance
RELATED ARTICLES

Πρόσφατα άρθρα

Tηλέφωνα έκτακτης ανάγκης

Δίωξη Ηλεκτρονικού Εγκλήματος: 11188
Ελληνική Αστυνομία: 100
Χαμόγελο του Παιδιού: 210 3306140
Πυροσβεστική Υπηρεσία: 199
ΕΚΑΒ 166