DevOps Foundations · Modül 3: Bash ve Python ile güvenli otomasyon
Zaman Aşımları, Yeniden Denemeler ve Testler
Ağlar kısmi ve yavaş düşer; bu dümdüz düşmekten beterdir. Bu ders beklemeyi sınırlar ve sınırları testlerle kanıtlar; takılı bağımlılık filoyu dondurmak yerine tek arayeni bozar.
10 dk okuma
Kazanımlar
- Her dış çağrıyı açık zaman aşımıyla sınırlamak
- Yalnızca idempotent işlemleri geri çekilme ve bütçeyle yeniden denemek
- Mutlu yolu değil arıza yolunu kanıtlayan test yazmak
- Sınırsız yeniden denemelerin tek arızayı çoğa çevirdiğini açıklamak
Neden önemli
Dağıtım sağlık ucunu zaman aşımı olmadan bekler. Uç takılır, dağıtım takılır, hat yuvası altı saat tutulur, üç ekip arkada kuyruğa girer. Kimse düşmedi; herkes bekledi. Sınırsız bekleyişler tek yavaş bağımlılığı donmuş organizasyona çevirir. Zaman aşımları karamsarlık değildir; takılmayı hataya çeviren mekanizmadır ve hatalar ele alınabilir.
Kavramlar
Her dış çağrı üç sayı ister: bağlantıya ne kadar beklenir, yanıta ne kadar beklenir, tüm işlem ne kadar sürebilir. timeout(1) toplamı dışarıdan dayatır; curl --connect-timeout ve --max-time parçaları dayatır; kodda Python timeout argümanları aynısını yapar. Sayıları bağımlılığın iyimserliğinden değil arayanın bütçesinden seç: iki dakikada bitmesi gereken kapı, tek çağrıya beş dakikalık zaman aşımı veremez. Zaman aşımı patlayınca hangi sınırın attığını logla; ayırt edilmemiş zaman aşımları hata ayıklanamaz.
Yalnızca tekrarı güvenliyi yeniden dene: okumalar, idempotent yazmalar ve idempotency anahtarlı işlemler. Anahtarsız idempotent-olmayan eylemleri (ücretlendir, gönder, anahtarsız oluştur) ikinci denemeyi zararsız kılan mekanizma olmadan yeniden deneme. Tıkanıklıkta on arayenin toparlanan servisi kilit adımıyla dövmesini önlemek için üstel geri çekilme ve jitter kullan; denemeleri üç gibi küçük sayıda kapa; toplamı bütçele: 30 saniyelik zaman aşımlı üç deneme, arayenin karşılaması gereken 90 saniyelik en kötü durumdur. Bütçesiz yeniden deneme politikası temennidir.
Arıza yolunu sahneyle değil denemelerle test et. Uyuyan, 429 dönen, bağlantı düşüren ve bozuk JSON sunan yerel sahte uç, test takımının her dalı deterministik kanıtlamasını sağlar. Gözlenebilir sözleşmeyi doğrula: çıkış kodları, deneme sayıları, bütçe altı geçen süre ve nöbetçi mühendisin arayacağı log satırı. Mutlu yol testleri betiğin çalıştığını kanıtlar; arıza yolu testleri güvenli olduğunu kanıtlar ve sabah 3'te önemli olan ikincisidir.
Uygulamalı örnek
Sınırlı ve bütçeli getirmeli yeniden deneme:
#!/usr/bin/env bash set -euo pipefail url="http://localhost:18090/ready" for attempt in 1 2 3; do if curl -sf --connect-timeout 3 --max-time 10 "$url" | jq -e '.ready == true' >/dev/null; then echo "ready (attempt $attempt)"; exit 0 fi sleep $((attempt * 2)) done echo "not ready after 3 attempts" >&2; exit 1
Beklenen okuma: bağlantı ve toplam zaman aşımları her denemeyi sınırlar (3/10 sn); jq -e tek başına HTTP başarısına değil içeriğe kapılanır; 2 ve 4 saniyelik uykular denemeleri ayırır; en kötü durum ek yükle 40 saniye civarındadır. Üç deneme politikadır: geçici aksaklığa yeter, katı düşmüş bağımlılığın bir dakikada yüzeye çıkmasına yetecek kadar az. L09 labı bu betiğin hak ettiği sahte API'yi kurar; kötü durumlara yeşil test ister.
Yaygın yanlış hamle
Limitsiz yeniden deneme döngüleri: uykulu while true veya taban durumuz özyineleme. Beş dakikalık upstream kesintisini, upstream'in kendi toparlanmasını geciktiren saatlerlik gürültülü yüke çevirir; sonra ağ suçlanır, döngü değil. Her yeniden denemenin üç görünür sabiti vardır: azami deneme, geri çekilme tabanı, toplam bütçe. Biri eksikse yorum ne derse desin döngü sınırsızdır.
Lab ve sonraki adım
L09 labı sahte API'yi verir (zaman aşımı, 429, bozuk JSON); her kötü girdiyi kapsayan betik ve test ister; gerçek API anahtarları asla görünmez. Buradan yol M04'e sürer; otomasyon işbirliğiyle buluşur: paylaşılan tarihe uygulanan aynı disiplin, Git.
Mini kontrol
4 soruluk isteğe bağlı öz kontrol. Yanıtlar cihazından çıkmaz, saklanmaz ve hiçbir değerlendirmeye sayılmaz.
Ders geri bildirimi
Henüz yayında geri bildirim yok.
Geri bildirim yazmak için giriş yap ve dersi tamamla.
Kaynaklar
Alıştırma
Çalıştırdığın her getirmeyi zaman aşımı ve 3 denemelik bütçeyle sınırla (curl --max-time artı döngü veya Python timeout). Takılan yerel uca karşı sürele (uyku işleyicili python http.server veya nc -l); sınırlı toplamı göster.
Geçme kriterleri
Çağrıda zaman aşımı bayrakları var; denemeler görünür sabitlerle kapalı; takılan uca karşı ölçülen toplam belirtilen bütçede kalmış.