Δοκιμή σταθερότητας
1) Βασικές έννοιες και στόχοι
Αξιοπιστία - πιθανότητα απόδοσης· ανθεκτικότητα - Η συμπεριφορά κατά τη διάρκεια και μετά από μια αποτυχία.
SLO/εσφαλμένος προϋπολογισμός: κριτήρια αποδοχής της υποβάθμισης.
Υπόθεση σταθερής κατάστασης: τυπική προσδοκία σταθερών μετρήσεων (π.χ. p95 <200 ms, ποσοστό σφάλματος <0. 5%). Το πείραμα θεωρείται επιτυχές αν η υπόθεση διατηρηθεί.
Τύποι αστοχιών: δίκτυο (καθυστέρηση, απώλεια/αντίγραφα, διαλείμματα), υπολογιστική (ΚΜΕ, μνήμη), αποθήκευση (I/O, εξάντληση δίσκων), εξαρτήσεις (5xx, timeouts, όριο ταχύτητας), λογική (μερικά περιστατικά, «αργή υποβάθμιση»), λειτουργική (απελευθέρωση, config), «σκοτεινή» (διαιρεμένος εγκέφαλος, βάρδιες ώρας).
2) Πυραμίδα βιωσιμότητας
1. Δοκιμές μονάδας λογικών αστοχιών (retrays, idempotency, timeouts).
2. Προσαρμογείς συστατικών με ένεση βλάβης (Testcontainers/tc- netem).
3. Ολοκλήρωση/σύστημα με δίκτυο/βάση δεδομένων/κρύπτες και προφίλ πραγματικού κόσμου.
4. Το χάος πειραματίζεται σε προ-prod (και στη συνέχεια περιορίζεται σε prod) σε runbooks.
5. Ημέρα παιχνιδιού - ασκήσεις σεναρίου της ομάδας (άνθρωποι + εργαλεία).
3) Δυνατότητα παρατήρησης ως βάση
SLI: p50/p95/p99 καθυστέρηση, ρυθμός σφάλματος, κορεσμός (CPU/σωρός/FD/IOPS), πτώση/χρονοδιάγραμμα, βάθος αναμονής.
Ίχνη: να βρεθούν σημεία συμφόρησης υπό αποτυχία.
Σημασιολογικές μετρήσεις ανθεκτικότητας: χαριτωμένο-υποβαθμισμένο ποσοστό επιτυχίας, ποσοστό αιτήσεων ρίψης, ποσοστό αυτοθεραπείας (MTTR).
Πειράματα επισήμανσης: 'χάος. , 'φάση = ένεση/ανάκτηση' σε γεγονότα/κούτσουρα.
4) Σφάλματα στον κατάλογο εγχύσεων
Δίκτυο: καθυστέρηση/νευρικότητα, απώλεια/διπλώματα/ανακατάταξη, περιορισμός εύρους ζώνης, καταιγίδες διάρρηξης, διαλείμματα TLS.
Υποδοχή: όριο CPU, διαρροές/όρια μνήμης, παύσεις GC, εξάντληση περιγραφέα, «ρολόι».
Αποθήκευση: αυξανόμενη καθυστέρηση, EROFS, ENOSPC, υποβάθμιση αντιγράφων, απώλεια ηγέτη.
Εξαρτήσεις: 5xx/429, επιβράδυνση, πτερύγιο DNS, παρωχημένα πιστοποιητικά, όριο ταχύτητας, «μερικές απαντήσεις».
Δεδομένα: γράψτε διαφθορά, «τρύπες» σε ρεύματα, αντίγραφα γεγονότων, συγκρούσεις έκδοσης.
Πτητικές λειτουργίες: ανεπιτυχής απελευθέρωση, σημαία χαρακτηριστικών, μετατόπιση ρυθμίσεων, χειροκίνητο σφάλμα (ως μέρος της προσομοίωσης).
5) Πρότυπα σταθερότητας (τι να ελέγξετε)
Η Jitter επαναδιατυπώνει και χρονοδιαγράμματα σε κάθε RPC.
Διακόπτης κυκλώματος (άνοιγμα/ημι-άνοιγμα, εκθετική ανάκτηση).
Διαφράγματα (απομόνωση δεξαμενών/ουρών αναμονής σε κρίσιμους τομείς).
Αφαίρεση φορτίου (επαναφορά αιτημάτων χαμηλής προτεραιότητας όταν είναι κορεσμένα).
Backpressure (σηματοδοτεί την αλυσίδα, όρια νομίσματος).
Ιδιαιτερότητα (idempotency keys on «παρενέργειες»).
Αποθήκευση και στοίβες σε περίπτωση υποβάθμισης της πηγής.
Χαριτωμένη υποβάθμιση (ελαφρές αντιδράσεις, μπαγιάτικα δεδομένα, χαρακτηριστικά απενεργοποίησης).
Χρονοδιάγραμμα του προϋπολογισμού.
Ατομικότητα/αποζημίωση (Saga/Outbox/Transactional Inbox).
Απαρτίες και αναπαραγωγή (απαρτίες R/W, υποβάθμιση συνέπειας για διαθεσιμότητα).
Αντιεντροπία/επανάληψη (ανάκτηση από τρύπες γεγονότων).
6) Συνταγές για ενέσεις και προσδοκίες (ψευδοκώδικας)
Επαναπροσδιορισμός με νευρικότητα και διακόπτη
for attempt in 1..N:
if breaker. open(): return fallback()
res = call(dep, timeout = base 0. 8)
if res. ok: return res sleep(exp_backoff(attempt) jitter(0. 5..1. 5))
if attempt == N: breaker. trip()
return fallback()
Σκίαση και backprescher
if queue. depth() > HIGH cpu. load() > 0. 85:
if request. priority < HIGH: return 503_SHED limiter. acquire () # constrain concurrency
Idempotency
key = hash("payout:"+external_id)
if store. exists(key): return store. get(key)
result = do_side_effect()
store. put(key, result, ttl=30d)
return result
7) Πειράματα: Σενάρια και Υποθέσεις
7. 1 «Αργή εξάρτηση»
Έγχυση: + 400 ms p95 έως εξωτερική API.
Αναμονή: αύξηση χρόνου ≤ X%, άνοιγμα διακόπτη, εφεδρικές αποκρίσεις, εξοικονόμηση υπηρεσίας p99 <SLA, καμία καταρράκτης κατά τη διάρκεια των retrays.
7. 2 «Μερική απώλεια κρυφής μνήμης»
Ένεση: αποτυχία του 50% των κόμβων Redis/Cache shard.
Αναμονή: αυξημένη αστοχία, αλλά χωρίς χιονοστιβάδα στην πηγή (ζητήστε coalescing/αμετάβλητη TTL), αυτόματη προθέρμανση και ανάκτηση.
7. 3 «Split-brain in the database»
Ένεση: Απώλεια του οδηγού, μετάβαση σε αντίγραφο.
Αναμονή: βραχυπρόθεσμη άρνηση εγγραφής, ανάγνωση απαρτίας, καμία απώλεια δεδομένων, Outbox δεν χάνει μηνύματα.
7. 4 «ENOSPC/δίσκος πλήρης»
Έγχυση: δίσκος 95-100%.
Αναμονή: περιστροφή αρχείων καταγραφής έκτακτης ανάγκης, αστοχία των χαρακτηριστικών μη εμπλοκής, ασφάλεια κρίσιμων αρχείων καταγραφής (WAL), προειδοποιήσεις και αυτορρευστά.
7. 5 «Διάρρηξη κυκλοφορίας»
Ένεση: × 3 RPS έως θερμό τελικό σημείο 10 λεπτά.
Προσδοκία: σκίαση χαμηλής προτεραιότητας, σταθερό p95 για «πυρηνικές» διαδρομές, ανάπτυξη αναμονής εντός ορίων, χωρίς καταιγίδες DLQ.
7. 6 «Ρολόι Skew»
Έγχυση: μετατόπιση του χρόνου του κόμβου κατά +/ − 2 λεπτά.
Αναμονή: σωστή TTL/υπογραφές (leeway), μονότονοι χρονοδιακόπτες σε retrays, έγκυρες μάρκες με αποδεκτή μετατόπιση.
8) Περιβάλλον και ασφάλεια των πειραμάτων
Ξεκινήστε με προ-prod, συνθετικά δεδομένα, ρυθμίσεις/τοπολογία όσο το δυνατόν πιο κοντά στο προϊόν.
Στις πωλήσεις - μόνο ελεγχόμενα παράθυρα, διαθέτουν σημαίες, πλάτος βήμα προς βήμα, αυτόματη ανατροπή, «κόκκινο κουμπί».
Φρουρά: RPS/όρια σφαλμάτων, φρουροί SLO, παρεμπόδιση των απελευθερώσεων κατά τη διάρκεια κρίσιμων περιστατικών.
Απαιτείται ένα runbook: πώς να γυρίσετε πίσω, ποιος να καλέσετε, πού να ψάξετε.
9) Αυτοματοποίηση και CI/CD
Κατάλογος πειραμάτων ως κωδικός (YAML/DSL): στόχοι, ενέσεις, μετρήσεις, κατώφλια, rollback «κουμπιά».
Σε κάθε απελευθέρωση, το χάος του καπνού: σύντομες ενέσεις (π.χ. 2 λεπτά + 200 λεπτά εθισμού) στο στάδιο.
Νυχτερινές διαδρομές πίνακα - Υπηρεσίες × καταστάσεις αστοχίας
Πύλη απελευθέρωσης: απαγόρευση εγκατάστασης εάν η σταθερότητα είναι κάτω από το όριο (π.χ. «εφεδρική κάλυψη <95%» κάτω από την «αργή εξάρτηση»).
10) Δεδομένα και συνέπεια
Αντιστάθμιση ελέγχου (Saga): οι εργασίες που εκτελούνται εν μέρει πρέπει να μεταφέρονται σε συμφωνημένο κράτος.
Επαναλήψεις δοκιμών/επαναλήψεις γεγονότων, παράδοση εκτός σειράς, οπές και επαναλήψεις.
Επαλήθευση αναλλοίωτων τομέων μετά από αποτυχίες: το υπόλοιπο δεν είναι αρνητικό, οι συναλλαγές δεν κολλάνε, τα όρια δεν παραβιάζονται.
11) Αντι-μοτίβα
Δοκιμή μόνο χαρούμενης διαδρομής και φορτίου χωρίς βλάβες.
Ρετράι χωρίς νευρικότητα → καταιγίδα υπό υποβάθμιση.
Δεν υπάρχει συνολικός προϋπολογισμός χρονοδιαγράμματος → κατακερματισμός χρονοδιαγραμμάτων.
Μια ενιαία δεξαμενή για όλες τις εργασίες δεν → απομόνωση (διαφράγματα).
Οι «άπειρες» ουρές → αύξηση της καθυστέρησης/PDE.
Μηδενική τηλεμετρία πειραμάτων → «τυφλές» πρακτικές χάους.
Χάος στην πώληση χωρίς rollback/όρια/υπεύθυνος ιδιοκτήτης.
12) Κατάλογος ελέγχου αρχιτεκτόνων
1. Υπόθεση σταθερής κατάστασης και καθορισμός SLO
2. Κάθε RPC έχει timeouts, jitter retreats, breakers
3. Εφαρμοσμένα διαφράγματα, περιοριστές, αντίθλιψη, αφαίρεση φορτίου
4. Cache σταθερή: coalescing, cache προστασία θύελλας, προθέρμανση
5. Outbox/Saga για παρενέργειες, idempotent κλειδιά
6. Απαρτίες/αναπαραγωγή/δοκιμή feilover
7. Υπάρχει κατάλογος πειραμάτων, νυχτερινό χάος και πύλες σε CI/CD
8. Πειράματα σημάτων μετρικών/ιχνοστοιχείων, υπάρχουν ταμπλό
9. Runbook 'και «κόκκινο κουμπί» έτοιμο, ανάθεση ευθύνης
10. Κανονικές ημέρες παιχνιδιού με Dev/SRE/Υποστήριξη
13) Μίνι εργαλεία και σενάρια δείγματος (σχέδια YAML)
Δίκτυο (tc/netem)
yaml experiment: add-latency target: svc:payments inject:
netem:
delay_ms: 300 jitter_ms: 50 loss: 2%
duration: 10m guardrails:
error_rate: "< 1%"
p95_latency: "< 400ms"
ΚΜΕ/Σωρός
yaml inject:
cpu_burn: { cores: 2, duration: 5m }
heap_fill: { mb: 512 }
Εξάρτηση
yaml inject:
dependency:
name: currency-api mode: slow p95_add_ms: 500 fallback_expectation: "serve stale rates ≤ 15m old"
Συμπέρασμα
Οι δοκιμές ανθεκτικότητας δεν είναι ένα «κόλπο χάους», αλλά μια πειθαρχία που καθιστά το σύστημα προβλέψιμο κάτω από δυσλειτουργίες. Σαφείς υποθέσεις, τηλεμετρία, ένας κατάλογος ελεγχόμενων πειραμάτων και ενσωματωμένα μοτίβα στην αρχιτεκτονική (timeouts, breakers, απομόνωση, idempotence) μετατρέπουν πιθανά περιστατικά σε ελεγχόμενα σενάρια. Η ομάδα έχει εμπιστοσύνη στις κυκλοφορίες και οι χρήστες λαμβάνουν μια σταθερή υπηρεσία ακόμα και σε συνθήκες αποτυχίας.