III. Παραμετροποίηση
Αποθήκευση παραμέτρων στο περιβάλλον
Οι παράμετροι (config) μιας εφαρμογής είναι όλα εκείνα που είναι πιθανό να αλλάζουν ανά ανάπτυξη της εφαρμογής (έλεγχος, παραγωγή, περιβάλλον προγραμματιστή, κλπ). Αυτό περιλαμβάνει:
- Αναγνωριστικά πόρων (resource handles) στη βάση δεδομένων, στο Memcached, και άλλες υπηρεσίες υποστήριξης
- Διαπιστευτήρια (credentials) για εξωτερικές υπηρεσίες όπως το Amazon S3 ή το Twitter
- Τιμές σχετικές με μια συγκεκριμένη ανάπτυξη όπως το κανονικό όνομα φιλοξενητή (canonical hostname) της ανάπτυξης
Οι εφαρμογές μερικές φορές αποθηκέυουν τις παραμέτρους ως σταθερές στον κώδικα. Αυτό αποτελεί παραβίαση των δώδεκα παραγόντων, το οποίο απαιτεί αυστηρό διαχωρισμό παραμέτρων από τον κώδικα. Οι παράμετροι διαφοροποιούνται σημαντικά μεταξύ αναπτύξεων, ο κώδικας όχι.
Ένα τέστ litmus για το αν μία εφαρμογή έχει αφήσει έξω την παραμετροποίηση με σωστό τρόπο είναι εάν η βάση κώδικα μπορει να γίνει ανοιχτού κώδικα ανά πάσα στιγμή, χωρίς να γίνει γνωστό κανένα διαπιστευτήριο.
Σημειώστε ότι αυτός ο ορισμός της παραμετροποίησης δεν συμπεριλαμβάνει την εσωτερική παραμετροποίηση της εφαρμογής, όπως το config/routes.rb
στο Rails, ή πως συνδέονται τα μέρη του κώδικα στο Spring. Αυτός ο τύπος παραμετροποίησης δεν μεταβάλλεται μεταξύ αναπτύξεων, οπότε είναι καλύτερα να γίνεται στον κώδικα.
Μια άλλη προσέγγιση στην παραμετροποίηση είναι η χρήση αρχείων παραμέτρων (config files) τα οποία δεν περιλαμβάνονται στο αποθετήριο της εφαρμογής, όπως το config/database.yml
στο Rails. Αυτό αποτελεί μια μεγάλη βελτίωση από το να χρησιμοποιούνται σταθερές στον κώδικα, αλλά ακόμα έχει αδυναμίες: είναι εύκολο κατά λάθος να συμπεριληφθεί το αρχείο στο αποθετήριο, υπάρχει μία τάση τα αρχεία παραμέτρων να είναι διασκορπισμένα σε διάφορα μέρη και σε διαφορετικές μορφές, καθιστώντας έτσι δύσκολο να δει και να διαχειριστεί κάποιος όλες τις παραμέτρους σε ένα μέρος. Επιπλέον, αυτές οι μορφές τείνουν να είναι συγκεκριμένες ως προς τη γλώσσα προγραμματισμού ή το πλαισιο ανάπτυξης της εφαρμογής.
Η εφαρμογή δώδεκα παραγόντων αποθηκεύει την παραμετροποίηση σε μεταβλητές περιβάλλοντος (environment variables, env vars, env). Οι μεταβλητές περιβάλλοντος αλλάζουν έυκολα μεταξύ αναπτύξεων της εφαρμογής χωρίς να αλλάξει ο κώδικας, σε σχέση με τα αρχεία παραμέτρων, υπάρχει μικρή πιθανότητα κατά λάθος να εισαχθούν στο αποθετήριο του κώδικα, και επίσης πάλι σε σχέση με τα αρχεία παραμέτρων, ή άλλους μηχανισμούς παραμετροποίησης όπως τα Java System Properties, αποτελούν ένα πρότυπο ανεξάρτητο από τη γλώσσα προγραμματισμού και το λειτουργικό σύτημα.
Μια άλλη πλευρά της διαχείρισης παραμέτρων είναι η ομαδοποίηση. Μερικές φορές οι εφαρμογές στοιβάζουν παραμέτρους σε ονομαστικές ομάδες (συχνά καλούνται “περιβάλλοντα”) που παίρνουν το όνομά τους απο συγκεκριμένες αναπτύξεις, όπως τα περιβάλλοντα development
(υλοποίηση
), test
(τέστ
), και production
(παραγωγή
) στο Rails. Αυτή η μέθοδος δεν κλιμακώνεται καθαρά: καθώς περισσότερες αναπτύξεις της εφαρμογής δημιουργούνται, νέα ονόματα περιβαλλόντων γίνονται απαραίτητα, όπως staging
(έλεγχος
) ή qa
. Καθώς το έργο επεκτείνεται περαιτέρω, οι προγραμματιστές μπορει να προσθέσουν τα δικά τους ειδικά περιβάλλοντα όπως joes-staging
, συνεπαγόμενα μια συνδυαστική έκρηξη από παραμετροποιήσεις που κάνουν την διαχείριση αναπτύξεων της εφαρμογής πολύ εύθραυστη.
Σε μια εφαρμογή δώδεκα παραγόντων, οι μεταβλητές περιβάλλοντος αποτελούν στοιχεία λεπτοφυούς ελέγχου, το καθένα πλήρως ορθογώνιο σε άλλες μεταβλητές περιβάλλοντος. Ποτέ δεν ομαδοποιούνται μαζί ως “περιβάλλοντα”, αντιθέτως διαχειρίζονται ανεξάρτητα για κάθε ανάπτυξη της εφαρμογής. Αυτό είναι ένα μοντέλο που κλιμακώνεται ομαλά προς τα πάνω καθώς η εφαρμογή φυσικά διευρύνεται σε περισσότερες αναπτύξεις κατά της διάρκεια της ζωής της.