Επικοινωνία με την υποστήριξη

Απαντάμε μέσω e-mail, συνήθως μέσα σε δύο ημέρες.

Το Google reCAPTCHA ελέγχει αυτή την υποβολή για κατάχρηση· δεδομένα αποστέλλονται στην Google. Το script φορτώνεται μόνο όταν ανοίξει αυτή η φόρμα.

← Όλα τα άρθρα

Προσωρινή αποθήκευση εικόνων μετρητών στη μνήμη

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

Προφανής υποψήφιος για cache. Οι ενδιαφέρουσες αποφάσεις ήταν πού να μπει και με ποιο κλειδί.

Όχι στον δίσκο

Όλα αυτά τρέχουν σε έναν μικρό διακομιστή, και ο δίσκος είναι κάρτα SD. Η αποθήκευση των σχεδιασμένων εικόνων εκεί θα σήμαινε περίπου 70 MB εγγραφών την ημέρα, με αντάλλαγμα μια μετρημένη εξοικονόμηση 1,6 λεπτών χρόνου CPU την ημέρα.

Κακή ανταλλαγή. Οι κάρτες SD φθείρονται από τις εγγραφές, και αυτό που αγοράζεται είναι ένα σφάλμα στρογγυλοποίησης σε ένα μηχάνημα που δεν περιορίζεται από τη CPU. Έτσι η cache βρίσκεται στο /dev/shm, που είναι tmpfs, δηλαδή RAM. Μετρήσεις εκεί: 0,027 ms για ανάγνωση, 0,036 ms για εγγραφή, 1,9 GB ελεύθερα.

τι θα κόστιζε, ανά ημέρα70 MBτι θα κέρδιζε, ανά ημέρα1,6 λεπ.σκόπιμα διαφορετικές μονάδες — αυτή είναι η ανταλλαγή

Με την επανεκκίνηση όλα χάνονται. Για μια cache αυτό δεν είναι απώλεια, είναι η φυσιολογική περίπτωση.

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

Το κλειδί περιέχει τους αριθμούς

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

Έτσι οι εμφανιζόμενες τιμές μπαίνουν μέσα στο κλειδί. Αν αλλάξει ένας αριθμός, το κλειδί είναι διαφορετικό, και η εικόνα σχεδιάζεται από την αρχή. Το στοίχημα δεν γίνεται προσεκτικά· απλώς εξαφανίζεται. Κάθε καταμετρημένη επίσκεψη αυξάνει τουλάχιστον το συνολικό άθροισμα, οπότε σε καμία καταμετρημένη επίσκεψη δεν μπορεί να σερβιριστεί παλιά εικόνα. Η λήξη που απομένει είναι μόνο ένα άνω όριο για τις τιμές που δεν βρίσκονται στο κλειδί — τα εβδομαδιαία, μηνιαία και ετήσια στοιχεία.

Τι έπρεπε να ελεγχθεί πρώτα

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

  • κανένα σχέδιο δεν χρησιμοποιεί rand(), mt_rand(), shuffle() ή uniqid()
  • κανένα σχέδιο δεν διαβάζει το ρολόι με ακρίβεια μεγαλύτερη από την ώρα
  • οι παράμετροι παρακολούθησης του παλιού script δεν διαβάζονται πουθενά στον κώδικα

Αυτό το τελευταίο έδωσε την καλύτερη αποτυχία όλης της άσκησης. Όσο οι παράμετροι αυτές ήταν ακόμη μέρος του κλειδιού, κάθε αίτημα έφερε ελαφρώς διαφορετικές συντεταγμένες ποντικιού, οπότε κάθε κλειδί ήταν μοναδικό. Η cache λειτούργησε μια ολόκληρη ημέρα και κατέγραψε 13 ευστοχίες. Λειτουργούσε τέλεια και δεν έκανε τίποτα, που είναι το πιο δύσκολο να το παρατηρήσει κανείς είδος βλάβης.

Κι αν κάτι εδώ αποτύχει — μη αναγνώσιμος κατάλογος, γεμάτος δίσκος, κατεστραμμένη καταχώριση — η εικόνα απλώς σχεδιάζεται με τον κανονικό τρόπο. Μια cache δεν πρέπει ποτέ να είναι ο λόγος που ένας μετρητής δεν εμφανίζεται.

Διαφήμιση