Όταν μια κρυφή μνήμη κλιμακώνεται ανάποδα
Τέσσερα μικρά αρχεία βρίσκονται στον φάκελο κρυφής μνήμης (cache) αυτής της υπηρεσίας. Το μεγαλύτερο έχει 35 byte. Μαζί περιέχουν τρεις αριθμούς μετρητών και διαβάζονται σε κάθε αίτημα μετρητή χωρίς εξαίρεση.
Υπάρχουν ώστε η διαδρομή καταμέτρησης να μη χρειάζεται να θέτει στη βάση δεδομένων τέσσερις ερωτήσεις στις οποίες η απάντηση είναι σχεδόν πάντα «όχι». Εξαιρεί αυτός ο μετρητής τις επισκέψεις του ίδιου του κατόχου του; Καταγράφει κλικ σε εξωτερικούς συνδέσμους; Καταγράφει διαδρομές μέσα στον ιστότοπο; Ανανεώνεται μόνος του; Για περισσότερους από το 99% των μετρητών κάθε απάντηση είναι όχι, και ένα αρχείο με τους λίγους αριθμούς για τους οποίους η απάντηση είναι ναι είναι φθηνότερο στην ανάγνωση από τέσσερα ερωτήματα με ευρετήριο.
Είναι φθηνότερο. Είναι όμως και το είδος του φθηνού που αντιστρέφεται.
Τι μετρήθηκε
Η ίδια ερώτηση — «είναι αυτός ο μετρητής στη λίστα;» — τέθηκε με δύο τρόπους, σε έξι μεγέθη λίστας. Με το αρχείο: ανάγνωση, αποκωδικοποίηση του JSON, αναζήτηση του αριθμού. Με τη βάση δεδομένων: μία προετοιμασμένη εντολή (prepared statement) σε στήλη με ευρετήριο. Δύο χιλιάδες επαναλήψεις για τον καθένα, πέντε γύροι, λήφθηκε η διάμεσος.
Στο σημερινό μέγεθος το αρχείο κερδίζει κατά οκτώ φορές: 0,0202 χιλιοστά του δευτερολέπτου έναντι 0,1630. Στους χίλιους αριθμούς ισοφαρίζουν. Στους δέκα χιλιάδες το αρχείο κοστίζει δώδεκα φορές περισσότερο και στους εκατό χιλιάδες 135 φορές περισσότερο, γιατί τότε πρόκειται για 578 kilobyte που πρέπει να διαβαστούν και να αναλυθούν σε κάθε προβολή.
Η γραμμή της βάσης δεδομένων δεν κινείται. 0,16 χιλιοστά του δευτερολέπτου με δύο γραμμές και 0,16 χιλιοστά του δευτερολέπτου με εκατό χιλιάδες: γι' αυτό υπάρχει ένα ευρετήριο, και είναι εύκολο να ξεχνά κανείς πόση δουλειά κρύβεται πίσω από το πόσο βαρετή φαίνεται αυτή η γραμμή.
Το άβολο σημείο
Το σημείο διασταύρωσης βρίσκεται κάπου μεταξύ 100 και 1.000 αριθμών. Αυτή η υπηρεσία έχει 2.218 μετρητές που ήταν ενεργοί τις τελευταίες τριάντα ημέρες.
Αν λοιπόν η λειτουργία εξαίρεσης είχε επιτυχία — αν όλοι όσοι έχουν μετρητή ενεργοποιούσαν το «να μη μετρώνται οι δικές μου επισκέψεις» — το αρχείο θα περιείχε 2.218 αριθμούς, θα ζύγιζε 11 kilobyte και θα κόστιζε 0,43 χιλιοστά του δευτερολέπτου ανά προβολή αντί για 0,02. Με τις χθεσινές 18.423 προβολές αυτό σημαίνει οκτώ δευτερόλεπτα δουλειάς την ημέρα για να αποφευχθεί ένα ερώτημα που θα χρειαζόταν τρία.
Η βελτιστοποίηση είναι ταχύτερη όταν η λειτουργία χρησιμοποιείται λιγότερο. Δεν υποβαθμίζεται σταδιακά με το φορτίο, όπως ένα αργό ερώτημα. Υποβαθμίζεται με την υιοθέτηση, τον μόνο άξονα που δεν παρακολουθεί κανείς, γιατί η αύξηση της υιοθέτησης υποτίθεται ότι είναι τα καλά νέα.
Γιατί εξακολουθεί να υπάρχει
Επειδή σήμερα είναι σωστή, και το «σωστό σήμερα» επιτρέπεται να είναι ο λόγος για κάτι, αρκεί κάποιος να έχει σημειώσει πότε θα πάψει να ισχύει.
Τρεις αριθμοί σε τρία αρχεία. Οκτώ φορές φθηνότερο από την εναλλακτική, σε ένα μηχάνημα όπου η διαδρομή καταμέτρησης είναι το μόνο που πρέπει να είναι γρήγορο. Αν αντικατασταθεί τώρα από το ερώτημα που νικά, θα προέκυπτε ένα χειρότερο σύστημα, δικαιολογημένο από ένα υποθετικό σενάριο.
Αυτό που χρειάζεται είναι ένας μηχανισμός συναγερμού, όχι επανεγγραφή. Το αρχείο γράφεται ούτως ή άλλως από τη βάση δεδομένων, από τον κώδικα που αλλάζει μια ρύθμιση — αυτό είναι το φυσικό σημείο για να διαπιστωθεί ότι η λίστα ξεπέρασε μερικές εκατοντάδες εγγραφές και να επισημανθεί. Μια κρυφή μνήμη με τεκμηριωμένο ανώτατο όριο είναι απόφαση. Μια κρυφή μνήμη χωρίς όριο είναι στοίχημα που δεν έχει συμφωνήσει κανείς.
Το γενικό μοτίβο
Αυτό δεν είναι επιχείρημα κατά της κρυφής μνήμης σε αρχείο. Είναι επιχείρημα υπέρ του να ξέρει κανείς προς ποια κατεύθυνση κλιμακώνεται μια κρυφή μνήμη.
Οι περισσότερες κρυφές μνήμες βελτιώνονται υπό φορτίο: περισσότερα αιτήματα, περισσότερες επιτυχίες, καλύτερη αναλογία. Αυτή είναι του άλλου είδους. Το κόστος της ανά αίτημα εξαρτάται από το πόσα δεδομένα περιέχει, και όσα περιέχει αυξάνονται μαζί με αυτό που η υπηρεσία προσπαθεί να ενθαρρύνει. Κάθε ανάγνωση πληρώνει για κάθε εγγραφή, συμπεριλαμβανομένων των 2.215 που δεν έχουν καμία σχέση με τον επισκέπτη που μετράται αυτή τη στιγμή.
Η ερώτηση που πρέπει να τίθεται για κάθε πίνακα αναζήτησης που κρατιέται στη μνήμη ή σε αρχείο δεν είναι «πόσο γρήγορος είναι» αλλά «τι τον κάνει να μεγαλώνει, και τι συμβαίνει όταν αυτό πάει καλά». Αν η απάντηση είναι «γίνεται πιο αργός», το όριο μεγέθους ανήκει στον κώδικα, δίπλα σε αυτό που γράφει το αρχείο, από την ημέρα που κατασκευάζεται.