Modern bulut yerel uygulamalar, KYC doğrulama, tıbbi görüntüleme veya içerik yönetimi için belge işleme boru hatlarına büyük ölçüde dayanır. Erken otomasyon yaklaşımları, dosya yüklemelerini basit HTTP POST istekleri olarak düşünmekteydi ve hemen sonuç veriyordu, dağıtılmış işlemeyi göz ardı ediyordu. Güvenlik gereklilikleri virüs taraması ve yapay zeka tabanlı meta veri çıkarımını zorunlu kıldığında, testler yükleme tamamlanma süresi ile işleme mevcudiyeti arasındaki yarış koşulları nedeniyle başarısız olmaya başladı.
Ana zorluk, senkron test yürütmesi ile asenkron arka uç işlemesi arasındaki uyumsuzluktadır. Bir test 50MB'lık bir PDF yüklediğinde, HTTP 200 yanıtı yalnızca alımın gerçekleştiğini gösterir, hazır olmadığını değil — sonraki doğrulamalar virüs taraması veya küçük resim oluşturma işleminin tamamlanmamış olması durumunda başarısız olur. Ayrıca, bulut depolama son tutarlılığı, bir dosyanın yüklemeden hemen sonra 404 dönebilmesi anlamına gelir; sonraki başarıda ise, paylaşılan depolama alanları, katı ayrım mekanizmaları olmadan test kirliliği riskini taşır.
Dosya işlemeyi bir durum makinesi olarak ele alan durum farkındalığına sahip bir anket soyutlaması uygulayın (Alındı → Tarama → İşleme → Hazır). Çerçeve, iç izolasyon için UUID tabanlı anahtarlar oluşturmalı, bütünlük doğrulaması için yükleme öncesi kontrol toplamlarını hesaplamalı ve depolamada değil, sağlık/durum uç noktasına karşı üstel geri alma anketi yapmalıdır. Temizliğin garantilenmesi için try-finally blokları veya fixtürler kullanılmalı, yaşam döngüsü politikaları güvenlik ağı olarak kullanılmalıdır.
import uuid import hashlib import time from cloud_storage import StorageClient from processing_api import ProcessingClient class FileUploadValidator: def __init__(self, bucket): self.storage = StorageClient(bucket) self.processor = ProcessingClient() self.test_namespace = f"test-{uuid.uuid4()}" self.attempts = 0 def upload_and_verify(self, local_path, expected_metadata): # Bütünlük için kontrol toplamını önceden hesapla with open(local_path, 'rb') as f: file_hash = hashlib.sha256(f.read()).hexdigest() object_key = f"{self.test_namespace}/{uuid.uuid4()}.pdf" try: # Idempotansiyet anahtarı ile yükle self.storage.upload( local_path, object_key, metadata={'idempotency-key': file_hash} ) # Durum makinesi anketi start_time = time.time() while time.time() - start_time < 60: status = self.processor.get_status(object_key) if status.state == "Ready": assert status.metadata == expected_metadata assert self.storage.verify_checksum(object_key, file_hash) return True elif status.state == "Quarantine": raise SecurityException("Virüs tarayıcı tarafından dosya işaretlendi") self.attempts += 1 time.sleep(min(2 ** self.attempts, 10)) finally: # Garantili temizlik self.storage.delete_prefix(self.test_namespace)
Bir sağlık platformu, tıbbi görüntülerin DICOM yüklenmesini doğrulama gereksinimi duyuyordu ve bu, yapay zeka tabanlı anormallik tespit boru hatlarını tetikliyordu. Otomasyon paketi, yüklenen taramaların doğru teşhis küçük resimlerini oluşturduğunu ve 30 saniye içinde hasta meta verilerini doldurduğunu doğrulamak zorundaydı.
Problemler, testler hemen yüklemeden sonra küçük resim URL’lerine karşı doğrulama yaptığında ve görüntü işleme Lambda henüz çalışmadığı için HTTP 404 hataları alındığında çıkıyordu. Düzgün sabit time.sleep(10) gecikmeleri geliştirme aşamasında işe yaradı, ancak soğuk başlangıçlar ve değişken yük nedeniyle CI'de başarısız oldu; bu arada her gün binlerce test görüntüsü yüklenmesi, S3 depolama maliyetlerinin beklenmedik bir şekilde yükselmesine sebep oldu.
Çözüm 1: Kaba kuvvet senkron bekleme
Başlangıçta HTTP zaman aşımlarını uzatmayı ve işleme tamamlanana kadar engellemeyi düşündük. Bu yaklaşım belirleyici doğrulamalar ve basit uygulama sundu. Ancak, bu, işlemelerin kasıtlı olarak asenkron olduğu üretim mimarisi semantiğini ihlal etdi ve virüs tarama kuyrukları güvenlik yaması dönemlerinde tıkandığında CI pipeline zaman aşımına yol açtı.
Çözüm 2: Sabit aralıklı anket
Sonraki adım ise her 5 saniyede bir ankete geçerek en fazla 60 saniye sürdü. Bu, engellemeye göre daha iyi bir değişkenlik sağladı, ancak işleme süresi 60 saniyeyi aştığında yüksek saatlerde dalgalanmayı artırdı ve hızlı işlem sürelerinde agresif olarak anket yaparken hesaplama döngülerini boşa harcadı. Rijit zamanlama, güvenilirlik yanılsaması yaratarak performans gerilemelerini maskeledi.
Çözüm 3: Olay güdümlü webhook doğrulaması
İşlemenin tamamlandığı zamanlarda yalnızca doğrulamayı tetiklemek için S3 olay bildirimlerini SQS üzerinden dinlemeyi değerlendirdik. Bu, en iyi hız ve kaynak verimliliğini sağladı. Ancak, CI ortamlarını harici webhook’lara açmayı veya karmaşık VPN tünelleri sürdürmeyi gerektirdi; bu durum güvenlik riskleri ve yerel test yürütmeyi imkansız kılan altyapı bağımlılıkları yarattı.
Çözüm 4: Kaynak yönetimi ile adaptif durum-makinesi anketi
İşleme durum API'sını soran, üstel geri alma anketiyle (ilk 100ms, maksimum 5s) akıllı bir anket mekanizması seçtik. Çerçeve, işleme aşamalarını açıkça izlerdi (UploadConfirmed → ScanningComplete → ThumbnailGenerated → MetadataExtracted), Quarantine veya Corrupted gibi hata durumlarında hızlıca başarısız olurdu. Bunu, 24 saat sonra otomatik yaşam döngüsü silme uygulayan S3 nesne etiketlemesini zorlayan bir fixtür ölçülü kaynak yöneticisi ile birleştirdik ve ayrıca, temizleme işlemini tezgah bitiminde derhal gerçekleştirdik.
Bu çözüm, sabit gecikmelere göre %95 daha az yanlış negatifler sağladı ve gereksiz beklemelerin ortadan kaldırılmasıyla ortalama test yürütme süresini 45 saniyeden 12 saniyeye düşürdü. Temizlik mekanizmalarının garantilenmesi sayesinde depolama maliyetlerinin birikimi önlendi, ayrıca belirgin durum doğrulaması, belirli DICOM formatlarında küçük resim oluşturmanın sessiz bir şekilde başarısız olduğu kritik bir hatayı yakaladı.
Paylaşılan bulut depolama alanlarına dosya yüklerken test izolasyonunu nasıl sağlarsınız ve her test çalıştırma başına büyük maliyetlerden nasıl kaçınırsınız?
Birçok aday, her test için yeni depolar oluşturmayı önerir, bu da son derece yavaş ve pahalıdır. Doğru yaklaşım, UUID tabanlı nesne önekleri ve IAM politika kapsamı kullanmaktır.
Her test, benzersiz bir ad alanı (örneğin, test-run-${uuid}/) oluşturur ve yalnızca bu önek içinde çalışır. Bir tezgah bitiminde öneki temizlemek için, nihai tutarlı yeniden deneme mantığı kullanarak ayrlık bir cleanup yöneticisi uygulayın. Yerel geliştirme için, gerçek bulut hizmetleri yerine MinIO veya LocalStack kullanmak üzere depolama arayüzünü soyutlayın, gerçek S3 erişimini entegre test aşamaları için ayırın.
Ek olarak, etiketleme ile yaşam döngüsü politikaları uygulayın — tüm test nesnelerini automation-run: true etiketi ile etiketleyin ve temizleme hatalarına karşı bir güvenlik ağı olarak 1 gün sonra otomatik silme yapılandırın.
Sisteminin türettiği eserlerin (küçük resimler, OCR metinleri) asenkron olarak oluşturulması durumunda dosya içeriğinin bütünlüğünü nasıl doğrularsınız?
Adaylar genellikle türetilen kaynaklara karşı hemen doğrulama yapmayı dener, bu da yarış koşullarına neden olur. Doğru metodoloji, ikili bütünlük ile işlem doğrulamasını ayırmaktadır.
İlk olarak, yüklenen nesnenin SHA-256 kontrol toplamının, yüklemeden hemen sonra kaynak ile eşleştiğini doğrulayın. Ardından, türetilmiş dosyalar yerine işleme aşamalarını ortaya koyan bir durum uç noktası veya meta veri API'sini sorgulayın.
Hangi yöntemle "depo kirliliğini" önlersiniz ve testler başarısız olduğunda temizlemenin yürütülmesini sağlarsınız?
En yaygın hata, temizleme kodunu doğrulamaların arkasına yerleştirmekte, bu da hatalar nedeniyle silmenin atlanmasına yol açmaktadır. Kaynak Sahibi Deseni uygulayın ve bağlam yöneticileri (Python with ifadeleri) veya TestNG @AfterMethod garantileri kullanın.
Test yürütmesi sırasında oluşturulan kaynakların iptali için thread-safe bir kayıt tutun. Python'da, test sonuçlarından bağımsız olarak temizliğin çalıştığını garantileyen yield ve addfinalizer ile pytest fixtürlerini kullanın.
Dağıtılmış paralel yürütme için, kaynak anahtarlarında test işçi kimlikleri kullanarak, eş zamanlı temizleme işlemleri sırasında çakışmaları önleyin. Son olarak, her saat başı çalışan bir temizlik hizmeti uygulayın ve maksimum test süresinden daha eski test nesneleri için sorgulama yaparak zorla silme işlemi gerçekleştirin; bu, normal temizliği atlayan süreç çökmesi karşısında bir sigorta işlevi görür.