URL Kısaltıcı Tasarımı — Parçaları Tek Sistemde Birleştirmek
Önce şunu oku: SQL İndeksleme ve EXPLAIN , Cache Stratejileri — Defter Ne Zaman Yalan Söyler? , Rate Limiting — Kapıdan Saniyede Kaç Kişi Geçer?
30 saniyede özet
Bir sistemi tasarlamak kutu çizmekle değil, birkaç çarpmayla başlar. URL kısaltıcıda sayılar okuma ağırlıklı bir sistem gösterir; asıl sorular kısa kodun nasıl üretileceği ve yönlendirmenin nasıl hızlı tutulacağıdır.
Tiyatroda paltonu vestiyere verdiğinde görevli sana küçük bir fiş uzatır. Uzun paltoyu taşımazsın, cebinde yalnızca bir numara vardır.
Adım adım oku
- Uzun paltoyu verirsin, karşılığında küçük bir fiş alırsın.
- Fiş numarası, paltonun asıldığı yerle birlikte deftere yazılır.
- Fişi gösteren paltosunu geri alır.
- En çok istenen paltolar tezgâhın hemen dibinde asılı durur.
-
Bayt: Pazarlama, SMS'lere sığacak kısa kampanya linkleri istiyor. Günde milyonlarca!
-
Sen: Kafka, Kubernetes, beş mikroservis... Nereden başlasam?
-
Bayt: Kutulardan değil. Önce birkaç soru, sonra birkaç çarpma.
-
Bayt: Bu derste yeni bir şey öğrenmeyeceksin; bildiklerini birleştireceksin.
Önce soru, sonra kutu
Önce ne yapılacağı netleşir: uzun adresi kısaltmak, kısa kodla yönlendirmek, tıklamaları saymak. Sonra kaba hesap gelir; kesin olması gerekmez, büyüklüğü doğru olsun yeter.
yeni link günde 1 milyon → saniyede ≈ 12 yazma (1.000.000 / 86.400)tıklama link başına 100 → saniyede ≈ 1.200 okumabeş yıl 1 milyon × 365 × 5 → ≈ 1,8 milyar kayıtSayılar iki şey söyler: sistem okuma ağırlıklı ve veri tek bir veritabanına sığar. Kafka ya da shard’lı veritabanı bu ölçekte bir sorunu çözmez.
Kafam karıştı, daha basit anlat
Önce ne istendiğini yaz, sonra üç çarpma yap. Sayılar sana hangi parçaya ihtiyacın olduğunu söyler.
Bir sistemi tasarlamaya başlarken ilk adım hangisidir?
Günde 1 milyon yeni kısa link oluşuyor ve her link ortalama 100 kez açılıyor. Saniyedeki ortalama yönlendirme sayısı yaklaşık kaçtır?
Kısa kodu kim üretir?
Kodlar base62Sayıları 0-9, a-z ve A-Z olmak üzere 62 karakterle yazmak. Kısa ve URL'de sorunsuz kodlar üretir; her ek karakter kod sayısını 62 katına çıkarır.Sözlükte gör → ile yazılır: rakamlar, küçük ve büyük harfler. 1,8 milyar kayıt için 6 karakter yeter, çünkü 62⁶ yaklaşık 56,8 milyar eder.
Kısa kodu şöyle üretiyorsun: uzun adresin SHA-256 hash'ini base62'ye çevir, ilk 7 karakteri al. Hash'ler benzersiz olduğuna göre bu güvenli mi? Cevabı göster
Değil. Hash’in tamamı neredeyse benzersizdir ama ilk 7 karakteri değildir. Milyarlarca linkte farklı adresler aynı kodu alır; kontrol yoksa yeni link eskisinin üstüne yazılır.
Çakışma sanılandan erken gelir; buna doğum günü paradoksuRastgele seçilen değerlerin, sanılandan çok daha erken çakışması. 23 kişilik bir grupta iki kişinin aynı günde doğmuş olma olasılığı yarıyı geçer.Sözlükte gör → denir. Güvenli iki yol var.
Sayaç her sayıyı bir kez verir; instance’lar sayaçtan bin sayılık bloklar alıp kendi içinde harcar. Rastgele kod ise çakışabilir, ama veritabanındaki benzersizlik kuralı çakışmayı yakalar ve yeni bir kod denenir.
Kafam karıştı, daha basit anlat
Hash’in bir parçasını kesmek kod çakıştırır. Ya her numarayı bir kez veren bir sayaç kullan ya da rastgele seç ve çakışırsa yeniden dene.
Beş yılda yaklaşık 1,8 milyar kısa link birikecek. Kodlar base62 (a-z, A-Z, 0-9) ile yazılırsa en az kaç karakter gerekir?
Kısa kodu şöyle üretiyorsun: uzun adresin SHA-256 hash'ini base62'ye çevir, ilk 7 karakteri al. Milyarlarca link olunca ne olur?
Satır satır: bir tıklamanın yolu
Okuma yazmanın yüz katı, üstelik tıklamaların çoğu birkaç popüler linke gidiyor. Kod → adres eşlemesi de neredeyse hiç değişmiyor. Bu, cache stratejileri dersindeki cache-asideUygulamanın önce cache'e baktığı, bulamazsa veritabanından okuyup cache'e koyduğu düzen. Cache veritabanının yanında durur; düşerse uygulama veritabanından devam eder.Sözlükte gör → için biçilmiş kaftan.
Kısa koddan uzun adrese
@GetMapping("/{code}")ResponseEntity<Void> redirect(@PathVariable String code) { String target = cache.get(code); if (target == null) { target = links.findTarget(code).orElseThrow(LinkNotFound::new); cache.set(code, target, Duration.ofHours(24)); } clicks.publish(new Clicked(code, Instant.now())); return ResponseEntity.status(HttpStatus.FOUND).location(URI.create(target)).build();}Debug
tıklama Önce cache. Popüler kodlar burada; çoğu tıklama veritabanına hiç uğramaz.
- code
- = aZ3k9Q
Sol/sağ ok tuşlarıyla da gezebilirsin.
301 kalıcı yönlendirmedir ve tarayıcılar onu saklayabilir. Servisin yükü azalır, ama sonraki tıklamalar sayılmaz ve yanlış bir hedef tarayıcılarda takılı kalabilir.
Her kısa linkin kaç kez tıklandığını saymak istiyorsun. Yönlendirme için hangi HTTP durum kodu daha uygun?
Kendin gör
Sayıları sen seç: ölçek, okuma oranı, kısa kodun üretimi ve cache. Her adım bir satır hesap.
URL kısaltıcı: zarfın arkasına hesap
Tohum 1Oynat ya da adımla: her adım bir satır hesap.
Şu an ne oldu?
Kutuları çizmeden önce birkaç çarpma
Kaç yazma, kaç okuma, kaç kayıt? Cevaplar hangi parçaya ihtiyaç olduğunu söyler.
Görevler0/3
Günde 100 milyon linki beş yıl boyunca kaç karakterle karşıladığını göraçık
İpucu
Ölçeği en büyüğe çek.
Kısa kodların sessizce çakıştığı bir tasarım kuraçık
İpucu
Kodu adresin hash'inden kes, kontrol ekleme.
En büyük ölçekte çakışmasız, tahmin edilemez ve cache'li bir tasarım kuraçık
İpucu
Rastgele kod, benzersizlik kontrolü ve okuma yolunda cache.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanı oynat. Günde 100 milyon link, kod hash’ten kesiliyor, cache yok. Çakışma kesin ve veritabanı her tıklamayı taşıyor.
- Kısa kodu “Sayaç + base62” yap. Çakışma bitti, ama kodlar sıralı.
- “Rastgele kod + benzersizlik kontrolü” seç ve cache’i aç. Veritabanına giden okuma onda bire iner.
- Ölçeği küçült. Kod uzunluğunun ve depolamanın nasıl değiştiğine bak.
Okumalar yazmaların 100 katı ve linklerin küçük bir kısmı tıklamaların büyük kısmını alıyor. Veritabanını rahatlatmak için ilk kaldıraç hangisi?
Tuzaklar
Sıralı kodlar taranır. Sayaçtan gelen kod aZ3k9Q ise sonraki aZ3k9R’dir; biri kodları sırayla deneyip başkalarının linklerini bulabilir. Özel içerik için kod rastgele olur ve kısa link hiçbir zaman yetkilendirmenin yerini tutmaz.
Oluşturma ucu kötüye kullanılır. Açık bir kısaltıcı, zararlı siteleri gizlemek için birebirdir. Oluşturma rate limit ile sınırlanır ve hedef adresler kontrol edilir.
Hash’e güvenip üzerine yazmak. Kimliği elle verilen bir entity’de save, satır varsa onu günceller. Çakışan bir kod, eski linkin hedefini sessizce değiştirir; ekleme “yoksa ekle” diye yapılır.
Kafam karıştı, daha basit anlat
Kodu rastgele seç, kimin ne kadar link açtığını sınırla, var olan bir kodun üstüne asla yazma.
Bazı kullanıcılar kısa linklerinin başka bir siteye gittiğini söylüyor. Kodu incele.
Derinleş · Kampanya linkleri: şema, kod üretimi ve yönlendirme 4 dosya · ~83 satır · ilk okumada atlayabilirsin
Kendini sına
Önce hızlı bir ısınma: puan yok, kayıt yok. Sonra asıl sorular.
Bir tasarıma başlamanın en iyi yolu, önce bütün kutuları çizmektir.
Kodları bir sayaçtan üretiyorsun ve on instance var. Her yeni link için veritabanından sıradaki sayıyı istemek bir darboğaz oldu. Yaygın çözüm hangisi?
Aklında kalacak üç şey
- 1 Tasarım gereksinim ve kaba hesapla başlar. Günlük sayıyı 86.400'e bölmek saniyelik yükü, beş yıllık toplam da kod uzunluğunu ve depolamayı verir.
- 2 Hash'in ilk birkaç karakteri benzersiz değildir. Benzersizlik ya sayaçtan gelir ya da veritabanı kuralıyla yakalanan çakışmadan ve yeni denemeden.
- 3 Okuma ağırlıklı sistemde ilk kaldıraç, yönlendirme yolundaki cache'tir. Tıklama sayılacaksa 302 döner, çünkü 301 tarayıcıda saklanır.
4 kart sonraki derste seni bekliyor