Το πρότυπο DataLoader βοηθά στην άμβλυνση των προβλημάτων με το "Whenloaded ()` στο GraphQL, αντιμετωπίζοντας το κοινό πρόβλημα ερωτήματος N+1 και βελτιστοποιώντας τα δεδομένα που λαμβάνουν μέσω μηχανισμών παρτίδας και προσωρινής αποθήκευσης.
Προβλήματα με `whenloaded ()` in graphQl
Στο GraphQL, οι διαλυτές συχνά πρέπει να λαμβάνουν σχετικά δεδομένα για πολλαπλές οντότητες. Χωρίς βελτιστοποίηση, αυτό μπορεί να οδηγήσει στο πρόβλημα N+1, όπου ένα ερώτημα για τα στοιχεία N έχει ως αποτέλεσμα πρόσθετα αιτήματα βάσης δεδομένων (συν το αρχικό), προκαλώντας σημαντική αποικοδόμηση απόδοσης. Η μέθοδος `όταν φορτώνεται ()`, η οποία περιμένει τη φόρτωση σχετικών δεδομένων, μπορεί να επιδεινώσει αυτό, ενεργοποιώντας πολλαπλά ξεχωριστά δεδομένα για κάθε στοιχείο, οδηγώντας σε αναποτελεσματικά, επαναλαμβανόμενα ερωτήματα βάσεων δεδομένων.
πώς βοηθά το πρότυπο dataloader
1.
Το πρότυπο DataLoader παρθένει πολλαπλά ατομικά αιτήματα δεδομένων σε ένα μόνο ερώτημα. Αντί να λαμβάνουν σχετικά δεδομένα ένα-προς-ένα όπως `όταν μπορεί να κάνει ()` μπορεί να κάνει, το DataLoader συλλέγει όλα τα κλειδιά που ζητούνται κατά τη διάρκεια ενός μόνο τσιμπούρι του βρόχου συμβάντος και στέλνει ένα αίτημα που έχει συγκεντρωθεί στη βάση δεδομένων. Αυτό μειώνει τον αριθμό των ερωτημάτων δραστικά, βελτιώνοντας την απόδοση. Για παράδειγμα, αντί για 16 ξεχωριστά ερωτήματα, το dataloader μπορεί να μειώσει αυτό σε 4 ερωτήματα που έχουν συγκεντρωθεί, τα οποία λαμβάνουν δεδομένα για πολλαπλά πλήκτρα ταυτόχρονα [2] [6] [8].
2.
Το DataLoader αποθηκεύει τα αποτελέσματα των δεδομένων που έχουν ληφθεί εντός του πεδίου εφαρμογής ενός μόνο αιτήματος. Εάν ζητηθεί τα ίδια δεδομένα πολλές φορές κατά τη διάρκεια της επίλυσης ενός ερωτήματος GraphQL, το DataLoader επιστρέφει το αποθηκευμένο αποτέλεσμα αντί να ερωτηθεί ξανά τη βάση δεδομένων. Αυτή η deduplication αποτρέπει περιττές αιτήσεις ότι «όταν φορτώνεται ()« διαφορετικά θα προκαλέσει [1] [3] [6].
3.
Για να αποφευχθεί η διαρροή δεδομένων και να εξασφαλιστεί η σωστή προσωρινή αποθήκευση ανά περιβάλλον χρήστη/αίτησης, δημιουργείται μια νέα παρουσία dataLoader για κάθε αίτημα GraphQL. Αυτή η προσέγγιση διατηρεί την απομόνωση και την ασφάλεια, ενώ παράλληλα επωφελείται από την παρτίδα και την προσωρινή αποθήκευση εντός αυτού του αιτήματος [3].
4. Ενσωμάτωση με διαλυτές GraphQL
Με την ενσωμάτωση του DataLoader σε resolvers GraphQL, κάθε διαλυτής καλεί το `load` στο dataloader αντί να διερευνήσει απευθείας τη βάση δεδομένων ή να βασίζεται σε` Whenloaded () `. Αυτό μετατοπίζει την ευθύνη των αποδοτικών δεδομένων που λαμβάνουν στο dataloader, το οποίο διαχειρίζεται τη διάλυση και την προσωρινή αποθήκευση διαφανώς [1] [3] [6].
Περίληψη
Το πρότυπο DataLoader μετριάζει αποτελεσματικά τις αναποτελεσματικότητες του `όταν φορτώνεται ()` στο GraphQL από:
- Συλλογή πολλαπλών αιτήσεων λήψης δεδομένων σε ερωτήματα ενιαίας παρτίδας, μειώνοντας τον αριθμό των στρογγυλών διαδρομών βάσης δεδομένων.
- Η προσωρινή αποθήκευση έφερε δεδομένα για την πρόληψη διπλών ερωτημάτων εντός του ίδιου αιτήματος.
- Δημιουργία απομονωμένων στιγμιότυπων dataloader ανά αίτημα για τη διατήρηση της ασφάλειας και της ορθότητας.
- Απλοποίηση του κώδικα διαλυτή, αφαιρώντας τη βελτιστοποίηση των δεδομένων στη βελτιστοποίηση του dataloader.
Αυτό έχει ως αποτέλεσμα σημαντικά βελτιωμένη απόδοση, επεκτασιμότητα και χρήση πόρων σε εφαρμογές GraphQL [2] [6] [7].
Αναφορές:
[1] https://www.apollographql.com/tutorials/dataloaders-typescript/04-using-a-dataloader
[2] https://wundergraph.com/blog/dataloader_3_0_breadth_first_data_loading
[3] https://github.com/graphql/dataloader
[4] https://www.parabol.co/blog/graphql-dataloader-cookbook/
[5] https://swatinem.de/blog/graphql-dataloader-part2/
[6] https://moldstud.com/articles/p-solving-the-dataloader-pattern-in-graphql-development
[7] https://ariadnegraphql.org/docs/dataloaders
[8] https://www.apollographql.com/tutorials/dataloaders-dgs/03-data-loaders-under-the-hood