29 puan yazan leelou2 2025-01-06 | 17 yorum | WhatsApp'ta paylaş

URL Shortener projesini yapıp geliştirip tekrar yapıp tekrar geliştirip... derken sonunda en en en son v9 açık kaynak projeyi ortaya çıkardım.

🚀 Github : https://github.com/lee-lou2/rust-url-shortener


Projeyi hazırlarken aşağıdaki gereksinimlere mutlaka uymaya çalıştım.

Gereksinimler

  1. Short URL çok hızlı üretilmeli
  • Veri arttıkça yavaşlamamalı
  • Ne zaman, hangi durumda ve hangi veriyle istek gelirse gelsin hızlı olmalı
  1. Short URL'den Original URL'e yönlendirme de hızlı olmalı
  • Aslında bu zaten çok doğal bir beklenti... 😅
  1. Farklı kullanıcıları memnun edebilecek ek özellikler içermeli
  • İstenirse platforma göre farklı URL'lere yönlendirebilmeli
  • İstenirse kullanıcının oluşturduğu URL'e gelen veriler görülebilmeli

Bu gereksinimleri karşılamak için aşağıdaki gibi geliştirdim.

Uygulananlar

Q. Short Key üretimini veri miktarından bağımsız olarak nasıl hızlı yapabiliriz?
A.
Genel olarak Short Key üretmenin çeşitli yolları vardır.
Birincisi, rastgele bir değer üretip bunun veritabanında olup olmadığını kontrol etmek ve yoksa aynen kullanmaktır. Ancak bu yöntemde veritabanına bakmak ve gerekirse tekrar üretmek gibi bir zahmet vardır. Ayrıca veri çok arttığında ya da Short Key uzunluğunun değişmesi gereken bir noktaya gelindiğinde ciddi gecikmeler oluşabilir.
İkincisi, rastgele Short Key'leri önceden üretip eşleştirme yöntemidir. Bu yaklaşımda önceden hazırlanmış Short Key sadece eşleştirildiği için Short URL her zaman hızlı üretilebilir. Ancak bu da kesin çözüm değildir. Önceden üretilebilecek miktarın bir sınırı olabilir ve önceden hazırlananlardan daha fazla Short URL üretilirse ayrıca ele alınması gereken durumlar ortaya çıkar.
Peki daha da iyi bir yöntem yok mu?
Uzun düşünceler sonunda şu yöntemi uyguladım: rastgele 4 karakterlik bir dize ile PK kullanılarak üretilen bir dizenin birleştirilmesi. Her değerin açıklamasını aşağıda bulabilirsiniz. Akış şu şekilde: Kullanıcı Short URL oluşturma isteği gönderdiğinde rastgele 4 karakterlik bir dize üretilir ve doğrudan veritabanına kaydedilir. Kayıt sırasında verilen PK, aşağıdaki açıklamadaki yöntemle bir dizeye dönüştürülür. İlk oluşturulan rastgele dize ile PK dizesi birleştirilerek Short Key oluşturulur. Böylece veri ne kadar artarsa artsın, çakışma olmadan hızlı ve güvenli şekilde üretim yapılabilir.

  • Rastgele 4 karakter nedir?
    Buradaki rastgele 4 karakter; İngilizce küçük/büyük harfler ve rakamlardan oluşan gerçekten rastgele bir dizgedir. Bu dizgede tekrar oluşması sorun değildir.
  • PK'nin dizeye çevrilmesi?
    Sıradaki ikinci değer PK dizesidir. İngilizce küçük/büyük harfler ve rakamları birleştirerek dizeleri sırayla oluşturduğumuzu düşünelim. Sıra küçük harflerde a -> z, büyük harflerde A -> Z ve rakamlarda 0 -> 9 şeklindedir. Buna göre a oluşturulan ilk değer, b ikinci, c üçüncü olur ve bu şekilde sırayla değerler üretilebilir. 9'a kadar tamamlandıktan sonra aa, ab, ac şeklinde basamak sayısı artırılarak devam edilebilir. Bu şekilde sırayla üretildiğinde her dizenin bir indeksi oluşur. Örneğin a'nın indeksi 1 olur. Buradaki fikir şudur: PK bu indeks olur ve o PK'ye karşılık gelen dizeyi bulmak yeterlidir.

Q. Short URL'den Original URL'e yönlendirmeyi nasıl hızlı yapabiliriz?
A.
Burada oldukça basit biçimde cache kullandım. Çeşitli servis seçenekleri olsa da bu projede veriye hızlı erişmek için memory cache uyguladım. Ayrıca yalnızca veriyi okuyup yönlendirmek dışında kalan ek işlevleri de hafif thread'ler oluşturarak işledim.

Q. Hangi ek özellikleri gerçekleştirdiniz?
A.
İlk olarak, platforma göre farklı URL'lere yönlendirme olacak şekilde geliştirdim. iOS ve Android için temel DeepLink değerlerini alıp kaydettim; DeepLink'e gidilemediğinde kullanılmak üzere ayrıca bir FallbackUrl de alındı. Bunun yanında masaüstünden erişildiğinde gidilecek URL'i de alarak tüm durumları kapsadım.
İkinci olarak, Original URL'e yönlendirme anında kullanıcının erişim loglarını görebilmesi için bir webhook URL alıp her yönlendirmede bu webhook URL'ini çağıran bir özellik ekledim. Şu anda yalnızca User Agent ve Short URL bilgileri iletilecek şekilde geliştirdim.
Üçüncü olarak, Short URL oluşturulurken Head tag içeriğinin ek olarak girilebilmesini sağladım. Bunun amacı og tag'lerini özelleştirmekti. İlgili tag'ler girilmezse varsayılan URL'in head bilgisinin kaydedilmesini sağlayacak şekilde işledim.


Bu projede Rust kullandım. Aslında Rust öğrenmeye başlayalı henüz sadece 2 ay oldu. URL Shortener projesini ilk başta FastAPI ile geliştirmiş, sonrasında Golang ile de yapmıştım. Ardından Rust öğrenirken ona çok büyük bir ilgi duydum ve tamamen geliştirilmiş bir URL Shortener projesini bir kez daha yapmaya karar verdim.

Sözdizimi, ownership ve lifetime gibi konulara hâlâ tam alışamadığım için kod tarafında eksikler olabilir; bu yüzden ilgi, destek ve geri bildirimlerinizi bekliyorum 🙏

Sonuna kadar okuduğunuz için teşekkürler

17 yorum

 
leelou2 2025-01-09

Başka projeler de yükledim, yoğun ilginizi bekliyorum 🎉
https://tr.news.hada.io/topic?id=18647

 
po5678 2025-01-07

Çok harika bir proje.
Yazdığınız gibi, Docker desteği olursa çok iyi olur gibi görünüyor!

 
leelou2 2025-01-07

Teşekkürler 👏 Docker'ı bu hafta içinde ekleyip yükleyeceğim 🙇‍♂️

 
po5678 2025-01-07

Acaba e-posta girişi zorunlu mu? E-posta doğrulaması yapılmazsa webhook ya da adres oluşturulamayacağını bilmiyordum.

 
leelou2 2025-01-07

Eğer bunu yalnızca kurum içinde kullanacaksanız ve özelleştirme gerekiyorsa, ilgili projeden ayrı olarak sizin için ayrıca özelleştirebilirim!

 
leelou2 2025-01-07

Evet, herkese açık bir hizmet olarak kullanılabilmesi için e-postayı zorunlu olacak şekilde ayarladım (üye kaydı olmadan e-posta doğrulaması kullanılıyor)

JWT girildiğinde e-posta gerekmeyecek şekilde değiştirme seçeneğini de bir kez düşüneceğim 🙏

 
po5678 2025-01-07

Vay, Ubuntu Lightsail kurup adım adım takip etmeye çalışıyorum ama SSL, pkg-config, sqlite, cargo derken kurulması gereken çok şey var :) Ben https kısmında NPM yerine Cloudflare Tunnel kullanmayı düşünmüştüm ama galiba bu iş bana yine zor geliyor hehe.. Docker sürümünü merakla bekliyorum! Zaten dynamic link ortadan kalktığı için ne yapacağımı düşünüyordum, o yüzden bu çok iyi oldu.

 
leelou2 2025-01-07

Dockerfile ve çalıştırılabilir komutları içeren deploy.sh dosyasını ekledim 🎉

 
leelou2 2025-01-07

Mümkün olan en kısa sürede Docker desteğini ekleyeceğim lol

 
po5678 2025-01-07

Vay ama çalıştırdım! Bunu nasıl yaptım ki? Hah?

 
jin225675 2025-01-07

GitHub reposunda README dışında website’e de bir demo URL’si eklerseniz iyi olabilir diye düşünüyorum!

Genelde ana sayfa ya da playground olup olmadığını kontrol etmek için önce reponun sağ tarafındaki bilgilere bakıyorum; bu yüzden demo sitesi yok sanmıştım :)

Güzel projeyi keyifle inceledim, elinize sağlık!

 
leelou2 2025-01-07

Aa, bunu kaçırmışım; hemen ayarlamam gerekecek, teşekkürler 🤩

 
balthasar 2025-01-07

Özen gösterildiği belli olan bir proje!
Ben de şirkette benzer bir şey yapıp kullanıyorum; benim durumumda basılı mecralarda yer alması gerektiği için belirsiz karakterlerden kaçınacak şekilde karakter kümesini ayarlamıştım.

İlgili içerik de GeekNews'te vardı.

https://tr.news.hada.io/topic?id=14479

 
laeyoung 2025-01-07

Güzelmiş!! id ya da bağlantı üretirken, bunu da dikkate alsa iyi olur diye düşünüyordum

 
leelou2 2025-01-07

Vay, teşekkürler 👍

 
leelou2 2025-01-06

Rust'u kurup yalnızca ortam değişkenlerini ayarlarsanız hemen kullanabilirsiniz!
Google URL hizmeti bu yıl sona eriyor; alternatif olarak kullanın. Merak ettikleriniz, iyileştirilmesi gereken noktalar veya kurulum yöntemleri gibi her türlü içerikli e-postayı memnuniyetle karşılıyorum 👏

 
leelou2 2025-01-06

https://f-it.kr/ adresinde kısaca deneyebilirsiniz 🙇‍♂️