Dropbox Benzeri Bir Görsel Yükleme Hizmetinin Yüksek Seviyeli Tasarımı (HLD)
Günümüz dijital dünyasında, görsellerin depolanması, işlenmesi ve sunulması, birçok uygulamanın temel bir gereksinimidir. Dropbox gibi platformlar, kullanıcıların dosyalarını kolayca yüklemesini ve yönetmesini sağlayarak bu alanda standartları belirlemiştir. Bu teknik makale, Dropbox benzeri, yüksek oranda ölçeklenebilir ve güvenilir bir görsel yükleme hizmetinin Yüksek Seviyeli Tasarımını (HLD) ele almaktadır. Sistemin temel bileşenlerini, veri akışını, depolama stratejilerini, güvenlik önlemlerini ve ölçeklenebilirlik yaklaşımlarını detaylı bir şekilde inceleyeceğiz.
1. Giriş ve Temel Gereksinimler
Herhangi bir büyük ölçekli sistemin tasarımına başlarken, temel gereksinimleri ve hedefleri net bir şekilde belirlemek kritik öneme sahiptir. Görsel yükleme hizmetimiz için de bu adımlar, sistemin doğru temeller üzerine inşa edilmesini sağlar.
1.1. Temel Gereksinimler
- Görsel Yükleme: Kullanıcıların farklı formatlardaki (JPEG, PNG, GIF vb.) görselleri sisteme yükleyebilmesi.
- Görsel Depolama: Yüklenen görsellerin güvenli, dayanıklı ve yüksek erişilebilirliğe sahip bir şekilde saklanması.
- Görsel İşleme: Yüklenen görsellerin otomatik olarak yeniden boyutlandırılması, sıkıştırılması ve farklı formatlara dönüştürülmesi (örn. thumbnail oluşturma).
- Görsel Erişimi: Yüklenen görsellere güvenli ve hızlı bir şekilde erişim sağlanması.
- Ölçeklenebilirlik: Milyonlarca kullanıcının ve milyarlarca görselin sorunsuz bir şekilde yönetilebilmesi.
- Güvenlik: Kullanıcı verilerinin ve görsellerin yetkisiz erişime karşı korunması.
- Dayanıklılık: Sistem hatalarına karşı dirençli olması ve veri kaybının önlenmesi.
- Düşük Gecikme: Yükleme ve erişim işlemlerinin hızlı olması.
1.2. Hedef Kitle ve Kullanım Senaryoları
Bu hizmet, bireysel kullanıcılardan kurumsal uygulamalara kadar geniş bir kitleye hitap edebilir. Örnek kullanım senaryoları şunlardır:
- Sosyal medya platformlarında profil fotoğrafı veya gönderi görseli yükleme.
- E-ticaret sitelerinde ürün görsellerini yönetme.
- Blog ve içerik yönetim sistemlerinde makale görselleri ekleme.
- Kişisel bulut depolama çözümleri.
1.3. Kapsam Dışı Konular
Bu HLD’de, kullanıcı arayüzü (UI) tasarımı, faturalandırma sistemleri veya gelişmiş yapay zeka tabanlı görsel tanıma gibi konulara odaklanılmayacaktır. Odak noktamız, görsel yükleme ve işleme hizmetinin temel backend mimarisidir.
2. Sistem Mimarisine Genel Bakış
Görsel yükleme hizmetimizin yüksek seviyeli mimarisi, modüler ve mikroservis tabanlı bir yaklaşımı benimser. Bu, her bir bileşenin bağımsız olarak ölçeklenmesine ve geliştirilmesine olanak tanır.
2.1. Temel Bileşenler
Sistem aşağıdaki ana bileşenlerden oluşacaktır:
- API Gateway: Tüm istemci isteklerini karşılayan ve yönlendiren tek giriş noktası. Kimlik doğrulama, yetkilendirme ve hız sınırlama gibi işlevleri yerine getirebilir.
- Yükleme Servisi (Upload Service): Görsel yükleme isteklerini yönetir, ön imzalı URL’ler oluşturur ve meta verileri işler.
- İşleme Servisi (Processing Service): Yüklenen görselleri asenkron olarak işler (boyutlandırma, sıkıştırma, format dönüştürme).
- Depolama Servisi (Storage Service): Görsel dosyalarını ve meta verilerini yönetir.
- Bildirim Servisi (Notification Service): Görsel işleme tamamlandığında veya hatalar oluştuğunda ilgili servislere veya kullanıcılara bildirim gönderir.
- Veritabanı (Metadata DB): Görsel meta verilerini (kimlik, boyut, format, depolama konumu, kullanıcı bilgisi vb.) saklar.
- Nesne Depolama (Object Storage): Görsel dosyalarının kendilerini saklar (örn. Amazon S3, Google Cloud Storage).
- Mesaj Kuyruğu (Message Queue): Servisler arası asenkron iletişimi sağlar (örn. Kafka, RabbitMQ, SQS).
- CDN (Content Delivery Network): Görsel dosyalarının hızlı ve düşük gecikmeyle kullanıcılara sunulmasını sağlar.
2.2. Veri Akışı
Bir görselin yüklenmesinden işlenip sunulmasına kadar olan temel veri akışı şu şekildedir:
- Kullanıcı, istemci uygulaması üzerinden görseli yüklemek için API Gateway’e istek gönderir.
- API Gateway, isteği Yükleme Servisi’ne yönlendirir.
- Yükleme Servisi, görsel için benzersiz bir kimlik oluşturur, meta verileri Veritabanı’na kaydeder ve istemciye doğrudan Nesne Depolama’ya yükleme yapabilmesi için ön imzalı bir URL (pre-signed URL) döner.
- İstemci, görseli doğrudan Nesne Depolama’ya yükler.
- Nesne Depolama, yükleme tamamlandığında bir olay (event) tetikler.
- Bu olay, Mesaj Kuyruğu’na bir mesaj gönderir.
- İşleme Servisi, Mesaj Kuyruğu’ndan mesajı alır ve görseli Nesne Depolama’dan indirir.
- İşleme Servisi, görseli boyutlandırır, sıkıştırır ve farklı versiyonlarını (thumbnail, orta, büyük) oluşturur, ardından bu versiyonları tekrar Nesne Depolama’ya kaydeder. Yeni meta veriler Veritabanı’na güncellenir.
- İşleme tamamlandığında, Bildirim Servisi aracılığıyla ilgili istemciye veya servislere bilgi verilir.
- Kullanıcılar, görselleri API Gateway üzerinden talep ettiklerinde, CDN üzerinden hızlı bir şekilde sunulur.
2.3. API Tasarımı
RESTful API’ler tercih edilecek olup, JSON formatında veri alışverişi yapılacaktır. Temel API uç noktaları şunları içerebilir:
// Görsel yüklemek için ön imzalı URL alma
POST /api/v1/images/upload-url
Request Body: { "fileName": "example.jpg", "fileType": "image/jpeg" }
Response: { "uploadUrl": "https://s3.aws.com/...", "imageId": "unique-id-123" }
// Yüklenen görselin meta verilerini güncelleme (işleme sonrası)
PUT /api/v1/images/{imageId}/metadata
Request Body: { "status": "processed", "versions": { "thumbnail": "url", "medium": "url" } }
// Görseli ID ile alma
GET /api/v1/images/{imageId}
Response: { "imageId": "unique-id-123", "url": "https://cdn.example.com/...", "versions": {...} }
// Kullanıcının tüm görsellerini listeleme
GET /api/v1/users/{userId}/images
3. Depolama Katmanı Tasarımı
Depolama katmanı, görsel yükleme hizmetinin kalbidir. Hem görsel dosyalarının kendilerinin hem de bu dosyaların meta verilerinin verimli ve güvenli bir şekilde saklanması gerekmektedir.
3.1. Nesne Depolama Seçenekleri
Görsel dosyaları için geleneksel dosya sistemleri yerine nesne depolama çözümleri tercih edilmelidir. Bu çözümler, yüksek ölçeklenebilirlik, dayanıklılık ve maliyet etkinliği sunar.
- Amazon S3 (Simple Storage Service): Endüstri standardı, yüksek dayanıklılık (%99.999999999), ölçeklenebilirlik ve çeşitli depolama sınıfları sunar.
- Google Cloud Storage: S3'e benzer özellikler sunan bir diğer güçlü nesne depolama hizmeti.
- Azure Blob Storage: Microsoft Azure ekosisteminde benzer yetenekler sağlar.
Bu hizmetler, ön imzalı URL'ler (pre-signed URLs) aracılığıyla istemcilerin doğrudan yükleme yapmasına olanak tanıyarak backend sunucularının yükünü azaltır.
3.2. Meta Veri Depolama
Görsel dosyalarının kendileri nesne depolamada saklanırken, görsellerle ilgili bilgilerin (dosya adı, boyutu, formatı, yükleme tarihi, kullanıcı ID'si, işleme durumu, farklı boyutlardaki URL'ler vb.) ayrı bir veritabanında tutulması gerekir.
Veritabanı seçimi, veri modeli ve ölçeklenebilirlik gereksinimlerine bağlıdır:
- İlişkisel Veritabanları (PostgreSQL, MySQL): Eğer görsel meta verileri arasında karmaşık ilişkiler varsa ve ACID garantileri önemliyse tercih edilebilir. Dikey ve yatay ölçeklendirme için sharding gerekebilir.
- NoSQL Veritabanları (Cassandra, DynamoDB, MongoDB): Yüksek okuma/yazma throughput'u ve yatay ölçeklenebilirlik gerektiren durumlarda idealdir. Özellikle anahtar-değer veya belge tabanlı modeller için uygundur.
Bu senaryoda, görsel ID'si üzerinden hızlı erişim ve yüksek ölçeklenebilirlik gerektiğinden, DynamoDB veya Cassandra gibi NoSQL bir veritabanı daha uygun olabilir. Veri modeli şu şekilde tasarlanabilir:
| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
imageId |
UUID | Görselin benzersiz kimliği (Primary Key) |
userId |
UUID | Görseli yükleyen kullanıcının kimliği |
fileName |
String | Orijinal dosya adı |
fileSize |
Long | Dosya boyutu (byte) |
mimeType |
String | Dosya tipi (örn. image/jpeg) |
uploadDate |
Timestamp | Yükleme tarihi ve saati |
status |
String | İşleme durumu (pending, processed, failed) |
originalUrl |
String | Orijinal görselin depolama URL'si |
versions |
Map/JSON | Farklı boyutlardaki görsellerin URL'leri (thumbnail, medium, large) |
3.3. Veri Tutarlılığı ve Yedekleme
Nesne depolama çözümleri genellikle yüksek dayanıklılık ve veri çoğaltma (replication) sunar. Meta veri veritabanı için ise düzenli yedeklemeler ve felaket kurtarma stratejileri (multi-AZ deployment, point-in-time recovery) uygulanmalıdır. Görsel dosyaları ile meta verileri arasındaki tutarlılığı sağlamak için, işlem tamamlandığında her iki depolama alanının da güncellendiğinden emin olunmalıdır.
4. Görsel Yükleme ve İşleme Akışı
Görsel yükleme ve işleme süreci, performans ve kullanıcı deneyimi açısından kritik öneme sahiptir. Asenkron ve optimize edilmiş bir akış tasarlamak gereklidir.
4.1. Yükleme Mekanizmaları
Büyük dosyaların doğrudan backend sunucularına yüklenmesi, sunucuların kaynaklarını tüketebilir ve ölçeklenebilirliği düşürebilir. Bu nedenle "doğrudan yükleme" (direct upload) yöntemi tercih edilir:
- Kullanıcı, görseli yüklemek istediğinde, Yükleme Servisi'nden bir ön imzalı URL talep eder.
- Yükleme Servisi, Nesne Depolama sağlayıcısından (örn. S3) belirli bir süre geçerli olacak (örn. 15 dakika) bir ön imzalı URL alır ve bu URL'yi istemciye döner.
- İstemci, görsel dosyasını doğrudan bu ön imzalı URL'ye HTTP PUT isteği ile yükler. Bu sayede backend sunucuları sadece meta veri işleme ile ilgilenir, dosya aktarımı yükünü Nesne Depolama servisine bırakır.
- Yükleme tamamlandığında, Nesne Depolama bir olay tetikler (örn. S3 Event Notifications).
4.2. Asenkron Görsel İşleme
Görsel işleme (boyutlandırma, sıkıştırma, filigran ekleme vb.) zaman alıcı bir işlem olabilir ve senkron olarak yapılması kullanıcı deneyimini olumsuz etkiler. Bu nedenle asenkron bir yaklaşım benimsenir:
- Nesne Depolama'dan gelen yükleme tamamlama olayı, Mesaj Kuyruğu'na bir mesaj gönderir.
- İşleme Servisi, Mesaj Kuyruğu'ndan mesajları dinler ve alır.
- Mesajı alan İşleme Servisi örneği, orijinal görseli Nesne Depolama'dan indirir.
- Görsel üzerinde gerekli işlemleri (örn. 100x100 thumbnail, 800x600 orta boyut, sıkıştırma) yapar.
- Oluşturulan farklı versiyonları tekrar Nesne Depolama'ya kaydeder (örn.
{imageId}/original.jpg,{imageId}/thumb.jpg,{imageId}/medium.jpg). - İşleme tamamlandığında, meta veri veritabanındaki görselin durumu "processed" olarak güncellenir ve farklı versiyonların URL'leri kaydedilir.
- İşleme sonucunu (başarılı/başarısız) Bildirim Servisi aracılığıyla yayınlar.
İşleme Servisi, talebin yoğunluğuna göre otomatik olarak ölçeklenebilen bir yapıya sahip olmalıdır (örn. AWS Lambda, Kubernetes Pod'ları).
4.3. Güvenlik ve Yetkilendirme
Yükleme ve erişim süreçlerinde güvenlik en üst düzeyde tutulmalıdır:
- Kimlik Doğrulama (Authentication): Kullanıcıların kimlikleri API Gateway veya ayrı bir Kimlik Doğrulama Servisi tarafından doğrulanır (örn. JWT, OAuth).
- Yetkilendirme (Authorization): Kullanıcıların yalnızca kendi görsellerini yüklemesine, görüntülemesine veya silmesine izin verilir. Yetkilendirme token'ları (örn. JWT içindeki kullanıcı ID'si) kullanılarak her istekte kontrol yapılır.
- Ön İmzalı URL Güvenliği: Ön imzalı URL'ler kısa ömürlü olmalı ve sadece belirli bir işlemi (örn. PUT) gerçekleştirmesi için yetkilendirilmelidir.
- Veri Şifreleme: Görseller hem aktarım sırasında (HTTPS) hem de depolama sırasında (at-rest encryption) şifrelenmelidir. Nesne depolama servisleri genellikle bu özelliği sunar.
5. Ölçeklenebilirlik, Performans ve Güvenlik
Yüksek hacimli bir görsel yükleme hizmeti için ölçeklenebilirlik, performans ve güvenlik temel tasarım prensipleridir.
5.1. Yük Dengeleme ve Otomatik Ölçekleme
Tüm servisler (Yükleme Servisi, İşleme Servisi vb.) stateless (durumsuz) olarak tasarlanmalı ve yatay olarak ölçeklenebilir olmalıdır. Yük dengeleyiciler (Load Balancers) gelen istekleri servis örnekleri arasında dağıtarak tek bir hata noktasını ortadan kaldırır ve yüksek erişilebilirlik sağlar.
Bulut sağlayıcılarının otomatik ölçekleme grupları (Auto Scaling Groups) veya Kubernetes gibi konteyner orkestrasyon araçları kullanılarak, CPU kullanımı, bellek veya mesaj kuyruğu derinliği gibi metrikler baz alınarak servis örnekleri otomatik olarak artırılıp azaltılabilir.
5.2. CDN Kullanımı ve Önbellekleme
Görsel sunumu için CDN (Content Delivery Network) kullanımı zorunludur. CDN'ler, görselleri coğrafi olarak kullanıcılara daha yakın sunucularda önbelleğe alarak gecikmeyi azaltır ve yükleme sürelerini iyileştirir. Ayrıca, ana sunucuların üzerindeki yükü azaltır.
- Görsel URL'leri CDN domain'leri üzerinden yayınlanır.
- CDN, görselleri Nesne Depolama'dan çeker ve dünya genelindeki uç sunucularında önbelleğe alır.
- Önbellekleme başlıkları (Cache-Control) doğru bir şekilde ayarlanarak görsellerin ne kadar süreyle önbellekte kalacağı yönetilir.
Meta veri için ise, sık erişilen veriler için Redis gibi dağıtık bir önbellek (distributed cache) kullanılabilir.
5.3. Güvenlik Mekanizmaları
Daha önce bahsedilen kimlik doğrulama ve yetkilendirme mekanizmalarına ek olarak:
- DDoS Koruması: API Gateway veya CDN katmanında DDoS saldırılarına karşı koruma sağlanır (örn. AWS WAF, Cloudflare).
- Giriş Doğrulama: Tüm API girişleri (input validation) titizlikle doğrulanmalı, SQL enjeksiyonu, XSS gibi saldırılara karşı önlem alınmalıdır.
- En Az Ayrıcalık Prensibi: Her servise ve kullanıcıya yalnızca işini yapmak için gerekli olan en az ayrıcalıklar tanınır.
- Sürekli Güvenlik Denetimi: Sistem düzenli olarak güvenlik açıkları için taranmalı ve denetlenmelidir.
6. Hata Yönetimi, İzleme ve Sonuç
Herhangi bir dağıtık sistemde hatalar kaçınılmazdır. Bu hataları yönetmek, sistemi izlemek ve sorunları hızlıca tespit etmek, hizmetin kararlılığı için hayati öneme sahiptir.
6.1. Hata Kurtarma Stratejileri
- Tekrar Deneme (Retry) Mekanizmaları: Geçici ağ hataları veya servis kesintileri durumunda başarısız olan istekler otomatik olarak tekrar denenmelidir (üstel geri çekilme - exponential backoff ile).
- Devre Kesici (Circuit Breaker) Desenleri: Sürekli başarısız olan servislere yapılan istekleri kısa devre yaparak sistemin genel sağlığını korur ve aşırı yüklenmeyi önler.
- Ölü Harf Kuyrukları (Dead Letter Queues - DLQ): Mesaj kuyruğundan işlenemeyen mesajlar DLQ'ye yönlendirilerek daha sonra manuel veya otomatik olarak incelenmesi sağlanır.
- Veri Tutarlılığı: İşlemlerin atomik olduğundan emin olmak için dağıtık işlemler ve telafi edici işlemler (compensating transactions) kullanılabilir.
6.2. İzleme ve Uyarı Sistemleri
Sistemin performansını ve sağlığını sürekli izlemek, potansiyel sorunları proaktif olarak tespit etmeyi sağlar.
- Metrik Toplama: Servislerin CPU kullanımı, bellek tüketimi, ağ trafiği, istek gecikmesi, hata oranları gibi metrikler Prometheus, Grafana gibi araçlarla toplanır ve görselleştirilir.
- Dağıtık İzleme (Distributed Tracing): Bir isteğin sistemdeki farklı servisler arasında nasıl hareket ettiğini izlemek için Jaeger, Zipkin gibi araçlar kullanılır. Bu, performans darboğazlarını ve hata kaynaklarını bulmada yardımcı olur.
- Uyarılar: Belirlenen eşik değerler aşıldığında (örn. hata oranı %5'in üzerine çıktığında, disk alanı %90 dolduğunda) ilgili ekiplere otomatik uyarılar gönderilir (e-posta, Slack, PagerDuty).
6.3. Günlükleme (Logging)
Tüm servisler standart bir formatta günlükler (logs) üretmelidir. Bu günlükler merkezi bir günlük toplama sistemine (örn. ELK Stack - Elasticsearch, Logstash, Kibana; veya Splunk) gönderilerek kolayca aranabilir, filtrelenebilir ve analiz edilebilir hale getirilir. Günlükler, hata ayıklama ve güvenlik denetimi için kritik öneme sahiptir.
Sonuç
Dropbox benzeri bir görsel yükleme hizmetinin yüksek seviyeli tasarımı, ölçeklenebilirlik, dayanıklılık, performans ve güvenlik gibi temel prensiplere dayanır. Mikroservis mimarisi, nesne depolama, mesaj kuyrukları, CDN ve asenkron işleme gibi modern bulut teknolojileri kullanılarak, milyonlarca kullanıcının milyarlarca görseli sorunsuz bir şekilde yükleyip yönetebileceği sağlam bir sistem inşa edilebilir. Bu HLD, gelecekteki geliştirmeler ve ek özellikler için sağlam bir temel sunmaktadır. Sürekli izleme, otomatik ölçekleme ve proaktif hata yönetimi ile sistemin uzun vadeli başarısı ve güvenilirliği sağlanabilir.
SSS (Sık Sorulan Sorular)
- Görsel yükleme hizmeti için neden HLD önemlidir?
- HLD, sistemin temel bileşenlerini, veri akışını ve ana etkileşimlerini yüksek seviyede tanımlayarak, karmaşık sistemlerin tutarlı ve ölçeklenebilir bir şekilde tasarlanmasını sağlar. Bu, geliştirme sürecinde yol haritası görevi görür ve olası sorunların erken aşamada tespit edilmesine yardımcı olur.
- Hangi depolama çözümü tercih edilmelidir?
- Görsel dosyalarının kendileri için Amazon S3, Google Cloud Storage veya Azure Blob Storage gibi nesne depolama çözümleri, yüksek ölçeklenebilirlik, dayanıklılık ve maliyet etkinliği nedeniyle tercih edilmelidir. Görsel meta verileri için ise, uygulamanın özel gereksinimlerine göre NoSQL (örn. DynamoDB, Cassandra) veya ilişkisel (örn. PostgreSQL) bir veritabanı seçilebilir.
- Büyük dosyaların yüklenmesi nasıl yönetilir?
- Büyük dosyaların yüklenmesi için "ön imzalı URL" (pre-signed URL) yöntemi kullanılır. Bu yöntemle istemci, backend sunucusundan aldığı özel bir URL aracılığıyla dosyayı doğrudan nesne depolama servisine yükler. Bu, backend sunucularının dosya aktarım yükünden kurtulmasını ve ölçeklenebilirliğin artmasını sağlar.
- Güvenlik nasıl sağlanır?
- Güvenlik, kimlik doğrulama (authentication) ve yetkilendirme (authorization), ön imzalı URL'lerin kısa ömürlü ve kısıtlı yetkili olması, aktarım sırasında (HTTPS) ve depolama sırasında (at-rest encryption) veri şifrelemesi, giriş doğrulama ve DDoS koruması gibi çok katmanlı yaklaşımlarla sağlanır.
- Sistemin maliyeti nasıl optimize edilir?
- Maliyet optimizasyonu için CDN kullanımı (bant genişliği maliyetlerini azaltır), nesne depolama katmanında farklı depolama sınıflarının (örn. S3 Standard, S3 Infrequent Access) kullanılması, otomatik ölçekleme ile kaynakların dinamik olarak ayarlanması ve sunucusuz (serverless) mimarilerin (örn. AWS Lambda) işleme servisleri için kullanılması gibi stratejiler uygulanabilir.