Dostlar, selam. Bu seferki hikayem, iki farklı servisi birbirine konuşturan şirin mi şirin bir middleware botuyla ilgili. Her şey yolundaydı, FastAPI ile yazdığım bot, A servisinden veriyi alıyor, biraz işliyor, B servisine güzelce yolluyordu. Ta ki A servisinin backend'cileri "Hadi bi v2'ye geçelim, daha şık olur" diyene kadar. O andan sonra botum, bir daha asla konuşmadı. Sessiz, derin, karanlık bir sessizlik.
İlk başta basit bir endpoint değişikliği sandım. Loglara baktım, bot çalışıyor gibi görünüyor ama B servisine hiç veri gitmiyor. requests kütüphanesiyle yapılan isteklerde hata fırlatmıyor, sadece boş response dönüyor. Kafayı yiyecektim. "Acaba benim kodumda mı sorun var?" diye kendi yazdığım şeyi 50 kere debug ettim. Meğerse sorun bambaşka bir yerdeymiş.
A servisinin yeni v2 API'si, eski JSON yapısını değil, tamamen farklı, iç içe geçmiş bir schema ile veri dönüyormuş. Üstelik başarılı isteklerde bile artık 200 OK değil, 201 Created dönüyormuş. Benim saf bot ise hala eski endpoint'e istek atıp, eski key'leri parse etmeye çalışıyordu. Ve en kötüsü, bu servis hata mesajlarını da çok "nazikçe", ana response body'sinin içine gömüyordu. Yani standart HTTP Status kontrolü bile işe yaramıyordu.
Python:
# Eskiden çalışan naif kod
response = requests.get("https://api-a.com/v1/data")
data = response.json()["items"] # 🚨 V2'de "items" diye bir key yok artık!
Çözüm, defansif kod yazmakta ve her şeyi loglamakta yattı. Artık sadece status code'a değil, response header'daki Content-Type'a ve body'nin structure'ına da bakıyorum. Gelen verinin beklediğim formatta olup olmadığını kontrol eden bir validator yazdım. En önemlisi, artık tüm request ve response'ları (tabii ki hassas dataları maskeledikten sonra) detaylı bir şekilde logluyorum.
Python:
# Yeni ve paranoyak yaklaşım
response = requests.get("https://api-a.com/v2/data")
log(f"Status: {response.status_code}, Headers: {dict(response.headers)}")
if response.status_code not in [200, 201]:
raise CustomAPIError("Beklenmeyen status kodu!")
raw_data = response.json()
# Gelen verinin şeması doğru mu?
if not validate_schema(raw_data):
log(f"Şema uyumsuz! Gelen veri: {raw_data}")
raise InvalidDataError("API şeması değişmiş olabilir.")
Sonuç olarak, başka servislere bağımlı çalışan bir bot/middleware yazıyorsanız, onların sizi habersiz değiştirebileceğini ASLA unutmayın. API dokümanı? O sadece bir "niyet beyanıdır". Gerçek hayat, loglarınızda saklıdır.
Siz de böyle "sessiz katil" API değişiklikleri yaşadınız mı? Bu tarz external dependency'leri nasıl sağlamlaştırıyorsunuz? Belki Circuit Breaker pattern falan mı kullanmalıyım artık?