Parça Bazlı Yükleme Mimarisi: Tasarım Rehberi
Sağlam bir parça bazlı yükleme sistemi tasarlayın. Parçalama stratejilerini, sürdürülebilir yüklemeleri ve paralel transfer optimizasyonunu öğrenin.
Parça bazlı yükleme mimarisi, bir dosyayı sabit veya değişken boyutlu parçalara böler ve bunları bağımsız olarak gönderir; bu sayede ağ aksaklığı 10 GB'lık bir yüklemeyi sıfırdan başlatmak zorunda bırakmaz. İki baskın açık standart: AWS S3 Multipart Upload (minimum 5 MB'lık parçalar, maksimum 10.000 parça) ve tus.io sürdürülebilir protokolü (RFC taslağı, yaygın biçimde uygulanmış). Doğru yapıldığında, parçalı yüklemeler yüksek gecikmeli bağlantılarda 5-10 kat daha yüksek aktarım hızı sağlar, kısa bağlantı kesintilerine dayanır ve alım tarafında paralel şifre çözmeye olanak tanır. İşte gerçekte üretimde dayanıklı bir sistemin nasıl tasarlanacağı.
Tekil Yüklemelerin Neden Ölçekte Başarısız Olduğu
5 GB'lık bir dosyanın tek HTTP PUT olarak yüklenmesi yarı düzine şekilde başarısız olur. TCP tıkanıklık pencereleri yüksek gecikmeli yollar üzerinde bağlantı kapasitesinin çok altında aktarım hızını sınırlayarak yavaş başlar. Tarayıcılar kaynak başına 6 eş zamanlı bağlantıyla sınırlar; bant genişliğinin büyük kısmını boşa bırakır. Sunucu tarafı istek zaman aşımları (nginx varsayılan 60 saniye, akış dışı için CloudFront 30 saniye) uzun yüklemeleri keser. Baz istasyonları arasında geçiş yapan mobil ağlar her birkaç dakikada bağlantıyı düşürür. Ve tek bir bit çevirme tüm transferi yeniden başlatmaya zorlar. Parçalı yüklemeler, iş birimini küçük, bağımsız yeniden denenebilir ve paralellik dostu yaparak tüm bunları çözer.
Parça Boyutu Seçimi
Parça boyutu bir dengedir. Daha küçük parçalar başarısızlıklardan daha hızlı kurtarır ve daha ince ilerleme granülerliği sağlar ancak daha fazla HTTP yükü ekler. Daha büyük parçalar el sıkışma ve TLS maliyetlerini amorti eder ancak bir parça başarısız olup yeniden iletilmesi gerektiğinde bant genişliği israfına yol açar. Tipik aralıklar: kayıplı ağlarda mobil yüklemeler için 1 MB ila 5 MB, masaüstü web yüklemeleri için 5 MB ila 16 MB, güvenilir bağlantılarda sunucudan sunucuya transferler için 16 MB ila 64 MB ve 10.000 parça tavanı 1 TB'lık dosyalarda daha büyük parçaları zorunlu kılan S3 Multipart için 100 MB veya üzeri. Bazı sistemler dinamik olarak uyum sağlar; küçük başlar ve bağlantı güvenilir olduğu kanıtlandıkça büyütür.
Sabit Boyutlu ve İçerik Tanımlı Parçalama
Sabit boyutlu parçalama (örneğin her 8 MB) uygulanması basittir, paralel dostu ve tam devam offsetlerini destekler. rsync ve restic'te kullanılan içerik tanımlı parçalama, bir dosyanın ortasına ekleme yapılmasının sonraki tüm parça sınırlarını kaydırmaması için Rabin parmak izi gibi yuvarlanan hash'e dayalı sınırlar seçer. CDC, yedekleme araçlarında tekilleştirme için mükemmeldir ancak saf dosya transferi için karmaşıklık ve CPU maliyeti ekler. Yükleme mimarileri için sabit boyutlu parçalama basitliği sayesinde kazanır ve S3 multipart parçaları veya tus.io offsetleriyle temiz şekilde eşleşir.
Sürdürülebilir Yükleme Protokolleri
tusd (Go), tus-js-client, Uppy ve birçok sunucu çerçevesinde uygulanan tus.io protokolü, parçaları eklemek için Upload-Offset başlığıyla HTTP PATCH kullanır. Bir HEAD isteği sunucudaki mevcut offseti döndürür; böylece istemci ağ kesintisi sonrası nereden devam edeceğini bilir. S3 Multipart Upload farklı bir model kullanır: UploadId almak için yüklemeyi başlatın, her parçayı (1'den başlayan indeks ile) yükleyin, ardından ETag listesiyle CompletMultipartUpload isteği gönderin. İstemciler neyin yüklendiğini görmek için ListParts sorgulayabilir. Her iki protokol de istemci yeniden başlamalarında durumu korur ve bağlantı düşmelerini zarif biçimde atlatır.
Paralel Yükleme Eş Zamanlılığı
Parçaları paralel yüklemek, yüksek gecikmeli bağlantılarda aktarım hızını önemli ölçüde artırır. HTTP/1.1, tarayıcılarda kaynak başına 6 eş zamanlı bağlantıyla sınırlar; HTTP/2, tek bağlantı üzerinden birçok akışı çoğullar ancak akış kontrol pencerelerine tabidir. Tipik bir yükleme zamanlayıcısı parçaları sıraya koyar ve sunucu 429 veya 503 sinyali verdiğinde geri basınçla birlikte 4 ila 8 paralel olarak gönderir. Çok fazla paralellik ISP şekillendirmesi ve aradaki kutu bağlantı sınırlarını tetikler; çok az bant genişliğini boşa harcar. Deneyimsel olarak, ev genişbantında 4 paralel akış ve gigabit fiberde 8 ila 16 akış çoğu iş yükü için tatlı noktayı oluşturur.
İstemci Tarafı Durum ve Devam Metadata'sı
Sürdürülebilir yüklemeler, istemcinin tarayıcı çökmesi veya dizüstü bilgisayar kapanmasından sonra devam edecek kadar yeterli durumu hatırlamasını gerektirir. Web Storage standardının bir parçası olan IndexedDB; dosyanın hash'i, parça sayısı ve hangi parçaların başarılı olduğunu içeren yükleme manifestolarını depolar. Manifestoyu dosyanın SHA-256 hash'iyle anahtarlayın; böylece aynı dosyayı yeniden eklemek kaldığı yerden devam eder. Şişkinliği önlemek için 7 günden eski eski manifestoları temizleyin. Mobilde WKWebView (iOS) ve Chrome Custom Tabs (Android), bellek baskısı altında IndexedDB'yi silebilir; bu nedenle mümkünse kritik durumu yerel depolamaya kaydedin.
Sunucu Tarafı Parça İşleme
Sunucunun parçaları eksiksiz bir dosyaya yeniden birleştirmesi veya S3 Multipart ile birleştirmeyi S3'e devretmesi gerekir. Minimum mimari: her parça PATCH'i kabul edin, yükleme kimliği ve parça indeksine göre anahtarlanan geçici bir blob'a yazın, offseti Redis veya PostgreSQL gibi bir metadata deposuna kaydedin ve CompletePart'ta birleştirin veya tamamlandı olarak işaretleyin. Parça blob'ları için yük dengelemeli arka uçların yerel durumu kolayca paylaşamayacağı yerel disk yerine nesne depolama (S3, Cloudflare R2, Backblaze B2) kullanın. Terk edilen yüklemeleri depolama alanı geri kazanmak için 24 ila 72 saat sonra çöp toplayın.
Parça ve Uçtan Uca Bütünlük Doğrulaması
Her parçayı yüklemede bir hash ile doğrulayın. S3 Multipart'ın ETag'i parça başına MD5 hash'idir (veya tam nesne için bileşik hash). Daha güçlü bütünlük için, parça başına SHA-256'yı istemci tarafında hesaplayın ve bir başlıkta gönderin; sunucu bunu parçanın yanında depolar ve yeniden okumada doğrulayabilir. Tüm parçalar yüklendikten sonra yeniden birleştirilmiş dosyanın Merkle ağacı kökünü veya akış hash'ini hesaplayın ve istemciye döndürün. İstemci bunu orijinal dosyanın kendi hash'iyle karşılaştırır. Herhangi bir uyuşmazlık, sorunlu parçaların yeniden yüklenmesini tetikler.
Şifrelemenin Parçalamayla Etkileşimi
Uçtan uca şifreleme, parçalamayı biraz karmaşıklaştırır. Her parçanın AES-GCM'de IV yeniden kullanımını önlemek için kendi nonce'una ihtiyacı vardır ve parça sınırları kimlik doğrulama şemasının bir parçası olmalıdır. Tipik yaklaşım: bir kök dosya şifreleme anahtarından HKDF-SHA256 aracılığıyla parça indeksini bağlam bilgisi olarak kullanarak parça başına bir anahtar türetin, ardından her parçayı AES-256-GCM ve sıfır veya artan nonce ile şifreleyin. Saldırganların parçaları ekleyememesi veya yeniden sıralayamaması için parça indeksini ve toplam parça sayısını AAD'ye ekleyin. Şifre çözme sırasında, düz metni serbest bırakmadan önce tüm parçaların mevcut ve sıralı olduğunu doğrulayın.
Parça Bazlı Sistemler İçin Gözlemlenebilirlik
Her parçayı izleyin. Takip edilecek metrikler: saniyede yüklenen parçalar, p50/p95/p99 parça yükleme gecikmesi, parça başına yeniden deneme oranı ve terk edilen yükleme oranı. Grafana veya Datadog'daki panolar gerilemeleri hızlı ortaya çıkarır. OpenTelemetry aracılığıyla dağıtık izler, bir istemci oturumunu sunucu tarafı parça işlemeye bağlar. Loki, Elasticsearch veya Splunk'ta aranabilir olmaları için olayları JSON formatında kaydedin. Bir müşteri yavaş yüklemeyi bildirdiğinde iz, tam olarak hangi parçaların durduğunu ve nedenini gösterir.
Hepsini Bir Araya Getirme
Üretime hazır parçalı yükleme sistemi 5 MB ila 16 MB'lık parçaları, tus.io veya S3 Multipart'ı protokol olarak, 4 ila 8 paralel akışı, IndexedDB destekli devam durumunu, parça başına SHA-256 bütünlük kontrollerini ve türetilmiş anahtarla isteğe bağlı parça başına E2EE'yi birleştirir. HexaTransfer, kararsız bağlantılarda 10 GB'lık dosyaları güvenilir şekilde yönetmek için AES-256-GCM ile istemci tarafı parçalı şifreleme ve sürdürülebilir yüklemeleri kullanır.
hexatransfer.com'da deneyin — ücretsiz, hesap gerekmez, maksimum 10 GB.
Uçtan uca şifreleme ile büyük dosyaları güvenle gönderin
Uçtan uca şifreleme ile 10 GB'a kadar dosya ücretsiz aktarın. Hesap gerekmez. Dosyalarınız yüklenmeden önce tarayıcınızda şifrelenir — başka kimse okuyamaz.
Dosya gönder