Azure DocumentDB εναντίον MongoDB

Μια συνθετική σύγκριση

Το DocumentDB είναι μια βάση δεδομένων NoSQL-as-a-service που αποτελεί μέρος της πλατφόρμας Microsoft Azure. Ως κατάστημα εγγράφων, εμπίπτει στην ίδια κατηγορία με τα MongoDB, CouchDB ή RethinkDB και ακριβώς όπως αυτά, χειρίζεται έγγραφα σε μορφή JSON.

Όταν εξετάζουμε την ενσωμάτωση ενός καταστήματος εγγράφων NoSQL στα συστήματά τους, πολλές εταιρείες επιλέγουν το MongoDB επειδή είναι από τους πιο δημοφιλείς κινητήρες NoSQL εκεί έξω και έχει γίνει πολύ αξιόπιστο τα τελευταία χρόνια. Νομίζω ότι το DocumentDB συνήθως δεν λαμβάνεται υπόψη όταν λαμβάνεται αυτή η απόφαση, αν και τα χαρακτηριστικά του το καθιστούν σοβαρό υποψήφιο για το MongoDB, προσφέροντας ακόμη περισσότερα πλεονεκτήματα σε ορισμένες περιπτώσεις.

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

Ενημερώσεις αυτής της ανάρτησης

[Νοέμβριος 2016] Αφαίρεσε όλες τις αναφορές για την έλλειψη τοπικού εξομοιωτή για το DocumentDB, καθώς η Microsoft ανακοίνωσε τη γενική διαθεσιμότητα μιας τέτοιας τοπικής έκδοσης ανάπτυξης. Σημειώστε ότι ο τοπικός εξομοιωτής είναι διαθέσιμος μόνο για τα Windows αυτήν τη στιγμή (χάρη στον David Mason για την προτεινόμενη επεξεργασία!).

[Νοέμβριος 2016] Αφαίρεσε την αναφορά των αυτόματα εκκρεμών εγγράφων ως χαρακτηριστικό που είναι αποκλειστικό για το DocumentDB, καθώς ο Bo Bendtsen παρατήρησε ευγενικά ότι η MongoDB έχει παρόμοιες δυνατότητες.

[Ιανουάριος 2017] Προστέθηκε ένα τμήμα σχετικά με την ενσωματωμένη ασφάλεια του DocumentDB, όπως προτείνει η Mary Branscombe.

Οι ομοιότητες

Εννοιολογικά, υπάρχουν ορισμένες βασικές ομοιότητες μεταξύ των δύο βάσεων δεδομένων:

  • Τα έγγραφα αποθηκεύονται και προβάλλονται στη μορφή JSON
  • Τα έγγραφα μπορούν να ανακτηθούν χρησιμοποιώντας μια πλούσια γλώσσα ερωτήματος που παίζει καλά με τη σύνταξη JSON

Χαρακτηριστικά μοναδικά για το MongoDB

Ας ξεκινήσουμε απαριθμώντας τις κύριες λειτουργίες του MongoDB που δεν έχουν ομοιόμορφο λογισμικό DocumentDB.

Πλούσιες δυνατότητες ερώτησης με τον αγωγό συσσωμάτωσης

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

Σε σύγκριση, η συντακτική ερώτηση τύπου SQL του DocumentDB επιτρέπει μόνο απλό φιλτράρισμα πάνω στα έγγραφα, ακόμη και χωρίς βασικές δομές όπως αρίθμηση ή άθροισμα (αν και εργάζονται πάνω σε αυτό και μπορείτε να εργαστείτε με το διακομιστή Javascript εν τω μεταξύ). Ένα εύχρηστο φύλλο εξαπατήσεως ερωτημάτων μπορεί να βρεθεί εδώ.

ΜΕΙΩΣΗ ΧΑΡΤΗ

Κάπως παρόμοια με τον αγωγό συσσωμάτωσης, η λειτουργία του MongoDB για τη μείωση των χαρτών επιτρέπει τη ροή των εγγράφων μιας συλλογής σε 2 ξεχωριστά στάδια, τα οποία μετασχηματίζουν (ή προβάλλουν) διαδοχικά και ομαδοποιούν τα έγγραφα. Και τα δύο στάδια ορίζονται στο Javascript.

Δεν υπάρχει καμία τέτοια ιδέα στο DocumentDB, παρόλο που παρόμοια αποτελέσματα μπορούν να επιτευχθούν χρησιμοποιώντας τις αποθηκευμένες διαδικασίες (βλ. Παρακάτω).

Ευρετήρια πλήρους κειμένου

Μεταξύ των διαφόρων τύπων δεικτών που είναι διαθέσιμοι στο MongoDB, ο ευρετήριο κειμένου προσφέρει δυνατότητες αναζήτησης πλήρους κειμένου.

Το DocumentDB δεν παρέχει ευρετηρίαση πλήρους κειμένου. Ο συνιστώμενος τρόπος για να προσθέσετε αναζήτηση πλήρους κειμένου σε μια βάση δεδομένων DocumentDB είναι να την αντιστοιχίσετε με μια υπηρεσία Azure Search. υπάρχει μια καλή ιστορία ενσωμάτωσης μεταξύ των δύο.

Περισσότερες πλατφόρμες υποστηρίζονται από προγράμματα οδήγησης από την πλευρά του πελάτη

Πιστεύω ότι είναι σημαντικό να αναφέρουμε ότι οι οδηγοί της MongoDB υποστηρίζουν ένα πολύ μεγάλο εύρος πλατφορμών, ενώ το DocumentDB διαθέτει μόνο SDK για .NET, Java, Python και Node.js - αλλά μπορείτε να δοκιμάσετε την τύχη σας χρησιμοποιώντας οποιοδήποτε πρόγραμμα οδήγησης MongoDB με το DocumentDB χάρη στην υποστήριξή του για το πρωτόκολλο του MongoDB.

Χαρακτηριστικά μοναδικά για το DocumentDB

Τώρα ας κάνουμε την αντίστροφη άσκηση και απαριθμήσουμε τις δυνατότητες του DocumentDB που δεν μπορούν να βρεθούν στο MongoDB.

Διακομιστή Javascript

Αυτό είναι ένα βασικό χαρακτηριστικό του DocumentDB. Έχει ένα πλούσιο API Javascript από την πλευρά του διακομιστή, που σας επιτρέπει να δημιουργήσετε λειτουργίες επεξεργασίας δεδομένων. Αυτές οι λειτουργίες διακομιστή μπορούν να λάβουν 3 διαφορετικές μορφές:

  • αποθηκευμένες διαδικασίες που μπορούν να κάνουν σχεδόν τίποτα (εισαγωγή, αναζήτηση, ενημέρωση εγγράφων) και κλήση μέσω των SDK ή του API REST
  • (ή άγκιστρα) που εκτελούνται πριν ή μετά από συγκεκριμένες λειτουργίες (όπως για παράδειγμα σε μια εισαγωγή εγγράφου)
  • UDF (λειτουργίες που ορίζονται από το χρήστη) που μπορούν να καλούνται από και να αυξάνουν τη γλώσσα επερώτησης SQL, περιορίζοντας έτσι κάπως το χάσμα με τις δυνατότητες ερωτημάτων του MongoDB

Τώρα, το MongoDB μπορεί να εκτελέσει Javascript από την πλευρά του διακομιστή, αλλά η κατανόησή μου είναι ότι:

  • Το Map-reduce και το $ όπου ο τελεστής ερωτήματος μπορεί να χρησιμοποιηθεί μόνο για ερωτήματα, όχι για ενημερώσεις
  • Οι λειτουργίες Javascript που μπορείτε να αποθηκεύσετε στη συλλογή του ειδικού συστήματος είναι κατάλληλες μόνο για σκοπούς διαχείρισης ή συντήρησης.

Η τεκμηρίωση του MongoDB δηλώνει σαφώς ότι υπάρχουν περιορισμοί απόδοσης στην εκτέλεση Javascript από την πλευρά του διακομιστή. σε σύγκριση, το DocumentDB είναι πραγματικά σχεδιασμένο για αυτόν τον σκοπό, καθώς προετοιμάζει τον κώδικα Javascript και στη συνέχεια αποθηκεύει και εκτελεί τον προκύπτοντα bytecode.

Συναλλαγές

Χάρη στις αποθηκευμένες διαδικασίες Javascript που μόλις αναφέραμε, είναι δυνατό να εκτελέσετε συναλλαγές ACID σε μια συλλογή DocumentDB. Ο τρόπος με τον οποίο λειτουργεί είναι πολύ απλός: αν ολοκληρωθεί η λειτουργία Javascript, όλες οι λειτουργίες εγγραφής που έχει εκτελέσει δεσμεύονται. εάν η λειτουργία εκτελεί οποιαδήποτε εξαίρεση, όλες οι λειτουργίες παίρνουν πίσω.

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

Πλήρης ευρετηρίαση από προεπιλογή

Το DocumentDB ακολουθεί μια αρκετά δραστική προσέγγιση στην ευρετηρίαση: από προεπιλογή, ευρετηριάζει όλα τα πεδία των εγγράφων που αποθηκεύετε! Πολλοί από εσάς μπορεί να το δουν αυτό ως χάσιμο χρόνου επεξεργασίας και αποθηκευτικού χώρου - το οποίο ειλικρινά είναι σε κάποιο βαθμό - αλλά αυτό δίνει το ενδιαφέρον του να προσφέρει εξαιρετική απόδοση ερωτήματος από το κουτί. Για όσους προτιμούν να έχουν καλύτερο έλεγχο σε ό, τι γίνεται indexed, είναι πάντα δυνατό να οριστούν προσαρμοσμένες πολιτικές ευρετηρίασης.

(Εύκολη) παγκόσμια διανομή

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

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

Ασφάλεια

Αξίζει να σημειωθεί ότι ως υπηρεσία, το DocumentDB παρέχει ενσωματωμένη ασφάλεια και έλεγχο πρόσβασης που υπάρχουν από προεπιλογή ... Δεν υπάρχει πρόσβαση χωρίς κωδικό πρόσβασης! Και πέρα ​​από αυτό, δίνει επίσης τη δυνατότητα να ελέγχει την πρόσβαση σε συλλογές και έγγραφα με λεπτόκοκκο τρόπο, δημιουργώντας χρήστες και συνδέοντάς τους με αυτούς τους πόρους μέσω δικαιωμάτων που προστατεύονται με κωδικό πρόσβασης.

Τιμολόγηση

Το τελευταίο, αλλά σίγουρα όχι λιγότερο σημαντικό κριτήριο συγκρίσεως που πρέπει να ληφθεί υπόψη είναι το κόστος. Αλλά πρέπει να προσέξουμε να μην συγκρίνουμε τα μήλα και τα πορτοκάλια εδώ: Το DocumentDB ανήκει στην οικογένεια PaaS ενώ το MongoDB είναι μια βάση δεδομένων, όχι μια υπηρεσία. Ας πάρουμε λοιπόν το mLab, μια προσφορά MongoDB PaaS, ως σημείο σύγκρισης.

Πρώτα πρέπει να διευκρινίσω πώς χρεώνεται το DocumentDB. Κάθε συλλογή χρεώνεται σε 2 διαστάσεις:

  • χρησιμοποιημένη αποθήκευση, σε 0,25 δολάρια ανά GB / μήνα
  • επιφυλάξεις ανά μονάδα ανά δευτερόλεπτο, σε ~ 6 USD ανά 100 RU / μήνα

Ο αριθμός των σιδηροδρομικών επιχειρήσεων που επιφυλάσσετε υπαγορεύει το εγγυημένο εύρος ζώνης που θα πάρετε (θέλετε να μάθετε περισσότερα σχετικά με τις Μονάδες Αίτησης; ελέγξτε τη θέση μου!). Βασικά, μια ΕΣ αντιπροσωπεύει "την επεξεργασία που απαιτείται για την ανάγνωση ενός ενιαίου εγγράφου 1KB με 10 ιδιότητες". Τούτου λεχθέντος, δεν είναι εύκολο να αξιολογηθεί το πραγματικό κόστος πολύπλοκων εργασιών όπως μεγάλες ερωτήσεις ή επεξεργασμένη αποθηκευμένη διαδικασία, αν και αυτός ο οδηγός βοηθά πολύ. Αλλά μπορούμε να κάνουμε την αντίστροφη άσκηση του να δούμε πόσα ΕΣ θα μπορούσαμε να πάρουμε για την τιμή ενός σχεδίου mLab.

Αυτό που δεν ανέφερα μέχρι στιγμής είναι ότι το DocumentDB τρέχει σε τοπικό SSD, οπότε για να κάνουμε μια δίκαιη σύγκριση, ας πάρουμε το σχέδιο "High Performance M3" από αυτή τη σελίδα, η οποία κατά τη στιγμή της γραφής (Σεπτέμβριος 2016) τιμή 1,390 δολάρια μηνιαίως για αποθήκευση 80GB.

  • Αυτά τα 80GB θα χρεώνονται 20 δολάρια στο DocumentDB
  • Αυτό φθάνει τα 1.370 δολάρια ΗΠΑ ή περισσότερα από 22.800 ΕΣ

Αναφέρθηκα προηγουμένως ότι είναι δύσκολο να αξιολογηθεί η "αξία" μιας ΕΣ, αλλά από την εμπειρία μου, 22.800 είναι πολλά, κάτι που κυμαίνεται από 200 σύνθετα ερωτήματα ανά δευτερόλεπτο. Και παρόλο που είναι εξίσου δύσκολο να εκτιμήσουμε τις δυνατότητες αυτού του σχεδίου "Υψηλής απόδοσης M3", θα έλεγα ότι παίζουμε σε παρόμοια κλίμακα, ή τουλάχιστον δεν είναι διαφορετικές τάξεις μεγέθους.

Εκτός αυτού, αυτό που είναι ωραίο με την ελαστικότητα της ΕΣ είναι ότι είναι σχεδιασμένο να είναι μια μονάδα κλίμακας, πράγμα που σημαίνει ότι μπορείτε να ξεκινήσετε με μια μέτρια ποσότητα ΕΣ και (άψογα) να το διαβαθμίσετε καθώς η χρήση των συλλογών σας αυξάνεται, ενώ ακόμα εκμεταλλευόμενοι την τοπική απόδοση SSD από την αρχή.

Τι γίνεται με το κόστος κλειδώματος του πωλητή;

Μια ανησυχία που εκφράζεται από πολλούς είναι ο κλειδωμένος προμηθευτής: εάν χρησιμοποιώ το DocumentDB, δεν είμαι μόνο κλειδωμένος με τη Microsoft, αλλά και με την Azure ως πλατφόρμα. Θα μπορούσατε μάλιστα να υποστηρίξετε ότι η έλλειψη τέτοιας κλειδαριάς θα έπρεπε να περιληφθεί στα πλεονεκτήματα της MongoDB έναντι του DocumentDB. Συμφωνώ. Αλλά ποιο είναι το πραγματικό κόστος αυτού του κλειδώματος;

Το DocumentDB αποθηκεύει έγγραφα στη μορφή JSON. Αυτή είναι μια τυποποιημένη μορφή που χρησιμοποιείται από τις περισσότερες βάσεις δεδομένων NoSQL (hey, ακόμη και ο SQL Server μιλάει JSON!), Έτσι ώστε να μεταφέρετε τα έγγραφά σας από το DocumentDB και να τα εισάγετε σε κάποια άλλη βάση δεδομένων δεν πρέπει να αποτελεί πρόβλημα.

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

Και αν ανησυχείτε ότι μπορεί να θέλετε να μεταναστεύσετε σε MongoDB αργότερα, θυμηθείτε ότι το DocumentDB έχει συμβατότητα πρωτοκόλλου με το MongoDB, πράγμα που σημαίνει ότι μπορείτε να χρησιμοποιήσετε οποιοδήποτε πρόγραμμα οδήγησης MongoDB για να αποκτήσετε πρόσβαση στο DocumentDB και να εκτελέσετε τις περισσότερες από τις λειτουργίες CRUD.

Πώς σας προτείνω να καθοδηγήσετε την απόφασή σας

Τυλίξτε το, εδώ είναι οι πρώτες ερωτήσεις που νομίζω ότι θα μπορούσατε να αναρωτηθείτε όταν πρέπει να επιλέξετε ανάμεσα σε αυτές τις βάσεις δεδομένων (σε καμία συγκεκριμένη σειρά):

  • Πολυπλοκότητα των ερωτημάτων: Τα ερωτήματά σας απαιτούν την πλήρη ισχύ του αγωγού συσσωμάτωσης του MongoDB ή μπορείτε να τα εφαρμόσετε με το SQL DocumentDB και κάποια Javascript από την πλευρά του διακομιστή;
  • Συναλλαγές: Η επιχειρησιακή σας λογική απαιτεί συλλογικές συναλλαγές πολλαπλών εγγράφων ή είναι η ατομικότητα μονού εγγράφου του MongoDB αρκετή για τις απαιτήσεις σας;

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

Παρακαλώ σχολιάστε!

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

Ευχαριστώ για την ανάγνωση!