Ιστολόγιο

Μεγαλύτεροι χώροι εργασίας χωρίς να περιμένει κανείς

Κάθε έργο στο Mythex παίρνει δικό του χώρο εργασίας: έναν μικρό cloud υπολογιστή όπου ο πράκτορας γράφει κώδικα και τρέχει η προεπισκόπηση της εφαρμογής σας. Είχαμε αυξήσει τη μνήμη των νέων χώρων από 1 GB σε 2 GB, αλλά οι παλιοί έμειναν στο 1 GB, περίπου το ένα τέταρτο από αυτούς τη μέρα που ελέγξαμε. Η πρώτη μας διόρθωση μετέφερε ένα έργο σε μεγαλύτερο χώρο όταν ανοιγόταν την επόμενη φορά. Την πρώτη του μέρα στην παραγωγή, αυτό έκανε έναν χρήστη να περιμένει επτά λεπτά. Βάλαμε σκληρό χρονικό όριο, και μετά αφαιρέσαμε τη μετακίνηση από το άνοιγμα ενός έργου εντελώς.

Γιατί οι παλιοί χώροι έμειναν μικροί

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

Αυτό είχε σημασία. Ένας από τους μικρούς χώρους έμεινε χωρίς μνήμη κατά ένα git push, ενώ ξεκινούσε η προεπισκόπηση, και δεν απάντησε για 11 λεπτά. Μια δημοσίευση απέτυχε εξαιτίας αυτού.

Πρώτη προσπάθεια: μετακίνηση του έργου κατά την αφύπνιση

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

Η μετακίνηση λειτουργούσε ως εξής:

  1. Έλεγχος μεγέθους. Αν ο χώρος είναι μικρότερος από 2 GB, μετακινείται. Αν το μέγεθος είναι άγνωστο, δεν γίνεται τίποτα.
  2. Να μην διαταραχθεί μια δημοσίευση. Μια δημοσίευση διαβάζει τα αρχεία του χώρου, οπότε αν τρέχει μία, η μετακίνηση παραλείπεται.
  3. Συμπίεση του έργου. Αρχειοθετούνται όλα τα αρχεία του έργου, συμπεριλαμβανομένου του git ιστορικού του, δηλαδή κάθε checkpoint που έχει το έργο, και του αρχείου .env της εφαρμογής, που ανήκει στον ιδιοκτήτη. Αφήνονται έξω οι εγκατεστημένες εξαρτήσεις (node_modules), που μπορούν να εγκατασταθούν ξανά.
  4. Αντιγραφή κατευθείαν. Το αρχείο ρέει από τον παλιό χώρο σε έναν καινούργιο των 2 GB, ώστε να μην χρειάζεται να χωρέσει ποτέ στη μνήμη του δικού μας διακομιστή.
  5. Σύγκριση πριν την αλλαγή. Μετρώνται τα αρχεία, διαβάζεται το τελευταίο checkpoint και μετρώνται τα checkpoints, και στους δύο χώρους. Η αλλαγή γίνεται μόνο αν ταιριάζουν και τα τρία.
  6. Κράτηση του παλιού σε κάθε αποτυχία. Οποιοδήποτε σφάλμα ή ασυμφωνία πετά τον νέο χώρο και ανοίγει το έργο στον παλιό, όπως πριν.

Μια λεπτομέρεια στη σύγκριση είχε μεγαλύτερη σημασία από ό,τι φαίνεται. Ο έλεγχος τρέχει ως λογαριασμός διαχειριστή, και το git αρνείται να διαβάσει αποθετήριο που ανήκει σε άλλον χρήστη. Δεν τύπωνε τίποτα και στις δύο πλευρές, και το «τίποτα» ταίριαζε με το «τίποτα», οπότε ο έλεγχος πέρασε χωρίς να συγκρίνει καθόλου ιστορικό. Πείσαμε το git να εμπιστεύεται τον φάκελο και προσθέσαμε ένα τεστ ώστε αυτό να μην επανεμφανιστεί.

Τι πήγε στραβά την πρώτη μέρα

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

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

Δεύτερη προσπάθεια: σκληρός προϋπολογισμός

Μέσα στην ίδια μέρα αλλάξαμε τέσσερα πράγματα:

  • Ένα λεπτό για ολόκληρη τη μετακίνηση. Κάθε βήμα (έλεγχος μεγέθους, συμπίεση, δημιουργία του νέου χώρου, αντιγραφή, αποσυμπίεση, σύγκριση) μοιράζεται έναν ενιαίο προϋπολογισμό 60 δευτερολέπτων. Όταν τελειώσει, το έργο ανοίγει στον παλιό χώρο.
  • Να σταματά η δουλειά, όχι μόνο η αναμονή. Το να εγκαταλείπουμε από τη δική μας πλευρά δεν αρκεί, αν η αρχειοθέτηση συνεχίζει μέσα στον χώρο που πρόκειται να χρησιμοποιήσει ο ιδιοκτήτης. Κάθε εντολή αρχειοθέτησης σκοτώνεται πλέον μέσα στον ίδιο τον χώρο λίγο πριν λήξει ο προϋπολογισμός. Αν ο νέος χώρος φτάσει αφού έχουμε εγκαταλείψει, πετιέται.
  • Να μην περιμένει ο ιδιοκτήτης τον καθαρισμό. Η διαγραφή του προσωρινού αρχείου γίνεται πλέον στο παρασκήνιο.
  • Να μην προσπαθούμε ξανά σε κάθε άνοιγμα. Ένα έργο που δεν μπόρεσε να μετακινηθεί αφήνεται ήσυχο για 24 ώρες, ώστε μια αποτυχία να κοστίζει το πολύ μία καθυστέρηση την ημέρα, όχι μία σε κάθε άνοιγμα.

Τρίτη προσπάθεια: βγάλτε το από την αφύπνιση

Αυτό έκανε τη χειρότερη περίπτωση ένα λεπτό. Αλλά ένα λεπτό είναι ακόμη ένα λεπτό, και καταλάβαμε ότι η μετακίνηση δεν χρειαζόταν να βρίσκεται στον δρόμο κανενός.

Δεν δημιουργείται πια κανένας χώρος του 1 GB. Άρα αυτό δεν είναι μια συνεχής διαδικασία· είναι μία εφάπαξ εργασία με σταθερή λίστα χώρων. Όταν γινόταν μέσα στην αφύπνιση, ένας πραγματικός άνθρωπος πλήρωνε κάθε αργή μετακίνηση, και ο μόνος τρόπος να μάθουμε ότι ένας χώρος δεν θα μετακινούνταν ήταν ότι κάποιος είχε μόλις περιμένει γι' αυτόν.

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

Τι κρατήσαμε από όλο αυτό

  • Η αλλαγή μεγέθους δεν είναι πάντα δυνατή. Όταν μια πλατφόρμα κλειδώνει το μέγεθος τη στιγμή της δημιουργίας, η αύξηση της προεπιλογής βοηθά μόνο τα νέα πράγματα. Σχεδιάστε για τα παλιά.
  • «Κανείς δεν το χρησιμοποιεί ακόμη» δεν σημαίνει ότι κανείς δεν περιμένει. Η δουλειά που γίνεται στο δρόμο προς ένα προϊόν είναι δουλειά που την βλέπει ένας άνθρωπος.
  • Βάλτε προϋπολογισμό σε οτιδήποτε βρίσκεται στο μονοπάτι ενός χρήστη, και σταματήστε τη δουλειά όταν τελειώσει. Το να λήγει ο χρόνος από τη δική μας πλευρά, ενώ μια εντολή συνεχίζει να τρέχει αλλού, μετακινεί απλώς το πρόβλημα.
  • Μια εφάπαξ μετάβαση ανήκει σε εφάπαξ εργασία. Το να την κρύβετε μέσα σε καθημερινές ενέργειες την κάνει φθηνότερη στη συγγραφή και ακριβότερη στην εκτέλεση.
  • Δοκιμάστε τους ελέγχους ασφαλείας σας. Μια σύγκριση που δεν συγκρίνει τίποτα μοιάζει ακριβώς με μια που πέρασε.

Αν χτίζετε στο Mythex, δεν χρειάζεται να κάνετε τίποτα. Ο στόχος είναι απλώς λιγότεροι χώροι που τελειώνουν τη μνήμη τους, με το άνοιγμα ενός έργου εξίσου γρήγορο με πριν. Ο τρόπος που μπαίνουν σε παύση και ξυπνούν οι χώροι περιγράφεται στα docs, στο ιδιωτικό χώρο εργασίας. Για μια άλλη ιστορία με εξάντληση μνήμης, δείτε το crash λόγω μνήμης που κρυβόταν σε μια ετικέτα προόδου.

Mythex · Pricing · Χτίστε οτιδήποτε με AI · Πρότυπα ιστοσελίδων και εφαρμογών · Το Mythex σε σύγκριση · Γλωσσάρι δημιουργίας εφαρμογών με AI · Δωρεάν εργαλεία δημιουργίας εφαρμογών με AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)