Excalidraw ile Sistem Tasarımı: URL Kısaltıcı Mimarisi
Excalidraw, karmaşık beyaz tahta çizimlerini net sistem diyagramlarına dönüştürür. Yük dengeleyiciler, mesaj kuyrukları ve önbellek katmanları kullanarak adım adım bir URL kısaltıcı tasarlamayı öğrenin.
Bir sistem tasarımı mülakatında URL kısaltıcı tasarlamak için 45 dakikanız var. Beyaz tahta silgisiyle uğraşmak zaman kaybettirir. Excalidraw, bileşenleri düşünce hızında sürüklemenize, yeniden boyutlandırmanıza ve birleştirmenize olanak tanır. İşte günde 10 milyon kısa URL'yi işleyen gerçek bir mimariyi çizmek için nasıl kullanacağınız.
1. Yük Dengeleyici Katmanıyla Başlayın
LB (HAProxy / NGINX) etiketli bir dikdörtgen çizin. Onu üç web sunucusu düğümüne bağlamak için oklar kullanın. Excalidraw'da düz çizgiler oluşturmak için sürüklerken Shift tuşuna basılı tutun. Bir metin etiketi ekleyin: Round-Robin & Sağlık Kontrolleri. Yük dengeleyici, gelen POST (kısa URL oluştur) ve GET (yönlendir) isteklerini dağıtır. Günlük 10 milyon istek için, LB'nin arkasında en az 3 web sunucusuna ihtiyacınız var. Gerçek sistemde, LB ayrıca TLS'yi sonlandırır ve hız sınırlama ile DDoS'a karşı korur.
2. Önbellek Katmanı – Redis Kümesi
Redis Düğümü 1/2/3 etiketli üç daire çizin ve bunları kesikli çizgilerle (küme çoğaltma) birleştirin. Web sunucularından önbellek kümesine bir ok ekleyin. Okun üzerine GET / SHORT_ID yazın. Önbellek, 1 saat TTL ile (short_id → long_url) depolar. 1 GB bellek ve giriş başına ~100 bayt ile bu önbellek 10 milyon eşleme tutar – günlük aktif kümeniz için yeterli. Yalnızca en sık erişilen anahtarları önbelleğe alın. Önbellek ıskalama olursa, web sunucusu veritabanına yönelir. Excalidraw'da “Önbellek isabeti?” yazılı bir karar elması ve “URL'yi döndür” veya “DB'yi sorgula” okları ekleyin.
3. Yazma Yolu Ayrıştırması için Mesaj Kuyruğu
Üzerinde RabbitMQ / Kafka yazılı bir kuyruk simgesi (dalgalı bir silindir veya dikdörtgen) çizin. Web sunucusu düğümlerinden bağlayın. Kuyruk, kullanıcılar aynı anda kısa URL oluşturduğunda patlamaları emer. Bir kullanıcı POST /shorten gönderdiğinde, web sunucusu benzersiz bir ID oluşturur (Base62 kodlaması kullanarak – aşağıdaki koda bakın), eşlemeyi dağıtık bir önbelleğe yazar ve kuyruğa bir asenkron olay iter. Daha sonra bir tüketici çalışanı kuyruktan okur ve eşlemeyi veritabanına kalıcı hale getirir. Bu, hızlı yazma yolunu (önbellek + kuyruk) yavaş yazma yolundan (DB) ayırır. Kuyruktan sonra Async Worker Pool (4 örnek) etiketli iki tüketici çalışan kutusu çizin.
// Base62 ID oluşturma (sözde kod)
function generateShortId(longUrl, timestamp) {
const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
const hash = md5(longUrl + timestamp);
let id = '';
for (let i = 0; i < 7; i++) { // 62^7 = 3,5 trilyon kombinasyon
const index = parseInt(hash.substring(i * 4, i * 4 + 4), 16) % 62;
id += chars[index];
}
return id;
}
4. Veritabanı Parça Katmanı
DB Parça 1/2/3 (PostgreSQL) etiketli üç veritabanı silindiri çizin. Etraflarına Tutarlı Karma etiketli noktalı bir çizgi ekleyin. Kısa ID'nin karması, satırın hangi parçada saklanacağını belirler. Toplam 10 milyon satır için her parça yaklaşık 3,3 milyon satır tutar. ID'ye göre bölümleme size doğrusal ölçeklenebilirlik sağlar. Benzersiz, sıralı ID'ler üreten bir Dağıtık ID Servisi kutusu (ör. Snowflake) çizin. Bu servis, web sunucularına getUniqueId() okuyla bağlı ayrı bir Excalidraw dikdörtgeni olabilir.
Temel Bileşenlere Genel Bakış
- Yük Dengeleyici – trafik dağıtımı, SSL sonlandırma, hız sınırlama.
- Web Sunucuları – durumsuz uygulama düğümleri (3–5 örnek).
- Önbellek (Redis) – sıcak eşlemeler için bellekte depolama (TTL 1s).
- Mesaj Kuyruğu – yazma kalıcılığı için asenkron ayrıştırma.
- Çalışanlar – kuyruğu tüketir, DB'ye yazar.
- Veritabanı Parçaları – karma ile parçalanmış (PostgreSQL / MySQL).
- ID Servisi – benzersiz, zaman sıralı kısa kodlar üretir (Snowflake).
5. Hepsini Excalidraw'da Bir Araya Getirmek
Boş bir tuvalle başlayın. Sunucular için dikdörtgenler, önbellek düğümleri için daireler, veritabanları için silindirler kullanın. Renk kodlaması: ağ için mavi (LB, web), önbellek için yeşil, kuyruk için turuncu, DB için kırmızı. Akışı tamamlamak için LB'den önce bir DNS dikdörtgeni ekleyin. Son diyagramınız soldan sağa bir akışa sahip olmalı: Kullanıcı → DNS → LB → Web Sunucuları → (Önbellek | Kuyruk → Çalışanlar → DB Parçaları). Bir mülakatta bu diyagram Excalidraw ile 15 dakika sürer – ve çizerken ödünleşimleri (önbellek geçersizliği, kuyruk geri basıncı, parça yeniden dengeleme) açıklayabilirsiniz.
Profesyonel ipucu: Excalidraw'ın “Izgaraya Hizala” ve “Düz Oklar” özellikleri diyagramınızı herhangi bir mülakatçıyı etkileyecek kadar temiz tutar. Diyagramı .excalidraw dosyası olarak kaydedin ve diğer tasarımlar için (örneğin, bir sohbet sistemi veya hız sınırlayıcı) şablon olarak yeniden kullanın.
Artık ölçeklenebilir bir URL kısaltıcı için taşınabilir, görsel bir plana sahipsiniz. Bu taslağı sunuma hazır bir mimariye dönüştürmek ister misiniz? Smartees, Excalidraw diyagramlarını içe aktarmanıza ve etkileşimli, paylaşılabilir sistem tasarım belgeleri oluşturmanıza olanak tanır. Smartees'i ücretsiz deneyin ve iki kere çizmeyi bırakın.
Beyaz Tahta
Free, browser-side, one sign-in for downloads.