← Όλα τα άρθρα

Bot 24/7 ως Windows service: τι σπάει στην πράξη

Το να τρέχεις ένα bot 24/7 ως Windows service με έμαθε ότι ο κώδικας είναι το εύκολο μισό. Χαλάνε το ρεύμα, το ρολόι, τα updates, τα restart.

Bot 24/7 ως Windows service: τι σπάει στην πράξη

Το να τρέχεις ένα bot 24/7 ως Windows service σημαίνει ότι παραδίδεις τη διεργασία στο λειτουργικό: ξεκινά στο boot, ξαναξεκινά μετά από crash, και συνεχίζει να τρέχει ακόμη κι όταν δεν είναι κανείς συνδεδεμένος.

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

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

Φτιάχνω ιστοσελίδες για να ζήσω. Μια ιστοσελίδα αποτυγχάνει ευγενικά. Κάποιος κάνει reload, και το μαθαίνεις από ένα log ή ένα monitor. Ένα σύστημα που τρέχει χωρίς επίβλεψη αποτυγχάνει σιωπηλά, στις τρεις τα ξημερώματα, και μέχρι να το προσέξεις έχει ήδη έντεκα ώρες που είναι χαλασμένο. Αυτή η διαφορά άλλαξε τον τρόπο που χτίζω.

Γιατί να τρέχει ως Windows service και όχι σε ένα terminal;

Γιατί ένα terminal εξαρτάται από εσένα. Ένα service όχι.

Η πρώτη εκδοχή έτρεχε όπως τρέχει κάθε πρώτη εκδοχή: ένα ελαχιστοποιημένο terminal που υποσχέθηκα στον εαυτό μου ότι δεν θα κλείσω. Μετά τα Windows εγκατέστησαν ένα update. Μετά έκανα restart για έναν άσχετο λόγο. Μετά έκλεισα λάθος παράθυρο.

Η λύση πήρε ένα απόγευμα και δεν έχει καμία λάμψη. Το έκανα κανονικό Windows service με το NSSM, που τυλίγει οποιοδήποτε εκτελέσιμο σε service. Ξεκινά στο boot. Ξαναξεκινά μετά από crash. Δεν το νοιάζει αν είναι κάποιος συνδεδεμένος. Τίποτα στην εφαρμογή δεν άλλαξε. Αυτό που άλλαξε είναι ότι η ζωή της δεν εξαρτάται πια από το πόσο συγκεντρωμένος είμαι.

Ο κανόνας που θα κρατούσα: τη στιγμή που μια διεργασία πρέπει να ζήσει περισσότερο από τη συνεδρία σου, παύει να είναι script και γίνεται service. Φέρσου της ανάλογα.

Τι χαλάει πραγματικά όταν κάτι τρέχει 24/7;

Όχι ο αλγόριθμος. Η ειλικρινής λίστα, κατά σειρά συχνότητας:

Κανένα από αυτά δεν είναι bug λογικής. Όλα είναι bugs λειτουργίας. Λογισμικό που τρέχει μόνο του δεν είναι πια ακριβώς εφαρμογή. Είναι ένα μικρό σύστημα χωρίς επιτήρηση, και τα συστήματα χωρίς επιτήρηση χαλάνε με βαρετούς, φυσικούς τρόπους: ρεύμα, δίσκος, ρολόι, δίκτυο, και το λειτουργικό που αποφασίζει ότι ξέρει καλύτερα.

Γιατί πρέπει το σύστημα να αναφέρει τα δικά του restart;

Γιατί το restart είναι η πρώτη προειδοποίηση που θα πάρεις, και από προεπιλογή δεν αφήνει κανένα ίχνος.

Η αλλαγή που ανέβασε περισσότερο τη σιγουριά μου ήταν μικροσκοπική. Το σύστημα μού έστελνε ήδη μια σύντομη ημερήσια σύνοψη. Πρόσθεσα μία γραμμή: κάθε restart της διεργασίας από την προηγούμενη σύνοψη, με χρονοσήμανση. Αυτό ήταν όλο το feature.

Πριν, ένα νυχτερινό restart ήταν αόρατο. Το σύστημα σηκωνόταν, συνέχιζε, και το πρωί φαινόταν υγιές. Τώρα το restart είναι μια γραμμή σε ένα μήνυμα που ήδη διαβάζω. Δύο φορές αυτή η γραμμή ήταν η πρώτη ένδειξη πραγματικού προβλήματος, ώρες πριν το δείξει οτιδήποτε άλλο. Τη δεύτερη φορά ήταν το hardware. Τρία restart σε μία νύχτα δεν είναι μοτίβο λογισμικού. Το να τα δω στοιβαγμένα μου είπε να πάω να κοιτάξω το ίδιο το μηχάνημα αντί για τον κώδικα.

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

Πώς κάνεις μια διεργασία ασφαλή να σκοτωθεί οποιαδήποτε στιγμή;

Θεωρείς δεδομένο ότι θα σκοτωθεί, και σχεδιάζεις γι' αυτό από νωρίς.

Η κατάσταση πάει στον δίσκο, όχι στη μνήμη, σε κάθε σημείο όπου θα ήταν ακριβό να χαθεί. Στην εκκίνηση ελέγχεται αν το προηγούμενο τρέξιμο τελείωσε καθαρά. Αν δεν τελείωσε, γίνεται ανάκτηση αντί για μαντεψιά. Ό,τι πρέπει να συμβεί μία φορά την ημέρα φυλάσσεται με έλεγχο για το αν έγινε ήδη σήμερα, γιατί ένα restart στο λάθος λεπτό θα το κάνει ευχαρίστως δύο φορές. Τίποτα σημαντικό δεν ζει μόνο μέσα σε μια μεταβλητή.

Τίποτα από αυτά δεν είναι έξυπνη μηχανική. Είναι απλώς η αποδοχή ότι το «έσκασε» είναι κανονικό γεγονός με συνηθισμένη διαδρομή ανάκαμψης, και όχι εξαίρεση που θα είσαι ξύπνιος να την προσέχεις.

Τι αλλάζει αυτό για το site ενός πελάτη;

Περισσότερα απ' όσα περίμενα, και γι' αυτό το γράφω σε ένα blog web developer.

Τα ίδια αντανακλαστικά ισχύουν για μια νυχτερινή εργασία, ένα προγραμματισμένο export, έναν webhook consumer, μια αποστολή newsletter. Αυτός ο κώδικας δεν είναι ποτέ το ενδιαφέρον κομμάτι ενός έργου, οπότε συνήθως παίρνει τη λιγότερη φροντίδα. Καμία ιστορία για restart. Καμία ορατότητα. Καμία καταγραφή για τα τρεξίματα που σιωπηλά δεν έγιναν. Και μετά ο πελάτης αναφέρει στο πέρασμα ότι «έχει καιρό» να λάβει την εβδομαδιαία αναφορά, και κανείς δεν μπορεί να πει από πότε.

Πλέον, ό,τι παραδίδω και τρέχει χωρίς επίβλεψη παίρνει τρία πράγματα πριν το θεωρήσω έτοιμο. Τρέχει ως εποπτευόμενο service. Αναφέρει τι του συνέβη, όχι μόνο τι παρήγαγε. Και μπορεί να σκοτωθεί οποιαδήποτε στιγμή χωρίς να αφήσει ζημιά πίσω του. Ίσως μισή μέρα παραπάνω δουλειά. Είναι η διαφορά ανάμεσα σε ένα σύστημα που το χειρίζεσαι και σε ένα που σταματάει στα ήσυχα.

Η ίδια λογική είναι πίσω από το plugin που έφτιαξα για να αυτοματοποιώ τις αγγαρείες του site μου. Αυτοματισμό που δεν βλέπεις, δεν τον εμπιστεύεσαι. Γι' αυτό ασχολούμαι και με πράγματα όπως οι συνδέσεις βάσης σε προγραμματισμένες εργασίες, που μοιάζουν λεπτομέρεια μέχρι να είναι αυτή η εργασία το μόνο ξύπνιο πράγμα στις τέσσερις το πρωί. Υπάρχουν κι άλλα τέτοια στο blog.

Περισσότερα για το Helios όταν κερδίσει το δικαίωμα να γραφτούν. Προς το παρόν το μάθημα είναι αυτό που μεταφέρεται παντού: το δύσκολο κομμάτι της αυτοματοποίησης δεν είναι η αυτοματοποίηση. Είναι όλα όσα συμβαίνουν όσο κοιμάσαι.

Φτιάχνεις κάτι που πρέπει να τρέχει είτε το βλέπει κανείς είτε όχι; Αυτή είναι η δουλειά μου: sites, services, και οι σωληνώσεις που τα κρατούν ζωντανά.