29 poin oleh leelou2 2025-01-06 | 17 komentar | Bagikan ke WhatsApp

Saya terus mengulang membuat dan meningkatkan proyek URL Shortener... dan akhirnya berhasil membuat proyek open source v9 yang benar-benar versi final-final-final.

๐Ÿš€ Github : https://github.com/lee-lou2/rust-url-shortener


Saat menyiapkan proyek ini, saya benar-benar berusaha menjaga persyaratan berikut.

Persyaratan

  1. Short URL harus bisa dibuat dengan sangat cepat
  • Tidak boleh melambat hanya karena jumlah data bertambah
  • Harus tetap cepat kapan pun, dalam situasi apa pun, dan dengan data apa pun yang digunakan untuk request
  1. Pemindahan dari Short URL ke Original URL juga harus cepat
  • Sebenarnya ini hal yang sudah sewajarnya... ๐Ÿ˜…
  1. Harus menyertakan fitur tambahan yang bisa memuaskan beragam pengguna
  • Jika diinginkan, harus bisa mengarahkan ke URL yang berbeda untuk tiap platform
  • Jika diinginkan, pengguna harus bisa melihat data yang masuk melalui URL yang mereka buat

Untuk memenuhi persyaratan tersebut, saya mengembangkannya seperti berikut.

Hal yang diterapkan

Q. Bagaimana cara membuat Short Key dengan cepat tanpa terpengaruh jumlah data?
A.
Secara umum ada beberapa cara untuk membuat Short Key.
Pertama, ada metode membuat nilai acak lalu memeriksa apakah nilai itu sudah ada di database, dan jika belum ada maka langsung digunakan. Namun dalam kasus ini ada kerepotan karena harus mengecek ke database lalu mungkin perlu membuatnya sekali lagi. Selain itu, jika data sudah sangat banyak atau ketika jumlah digit Short Key perlu berubah, keterlambatan besar bisa terjadi.
Kedua, ada metode membuat Short Key acak terlebih dahulu lalu mencocokkannya saat diperlukan. Karena hanya mencocokkan Short Key yang sudah disiapkan, Short URL memang selalu bisa dibuat dengan cepat. Namun ini juga bukan jawaban yang sempurna. Bisa ada batasan dalam jumlah key yang disiapkan sebelumnya, dan ketika Short URL yang dibuat melebihi jumlah yang telah dipersiapkan, ada hal-hal tambahan yang perlu dipertimbangkan.
Lalu, adakah cara yang lebih baik lagi?
Setelah banyak berpikir, saya menerapkan metode berikut: menggabungkan string acak 4 karakter dengan string yang memanfaatkan PK. Penjelasan tiap nilainya bisa dilihat di bawah. Urutannya seperti ini. Saat pengguna meminta pembuatan Short URL, sistem membuat string acak 4 karakter lalu menyimpannya ke database apa adanya. PK yang diterbitkan saat penyimpanan kemudian diubah menjadi string dengan metode yang dijelaskan di bawah. Short Key dibuat dengan menggabungkan string acak yang pertama kali dibuat dengan string PK tersebut. Dengan cara ini, seberapa pun banyaknya data yang menumpuk, key dapat dibuat dengan cepat, aman, dan tanpa duplikasi.

  • String acak 4 karakter?
    Yang dimaksud string acak 4 karakter di sini adalah string yang benar-benar acak dan terdiri dari huruf kecil/besar alfabet Inggris serta angka. String ini boleh saja mengalami duplikasi.
  • PK menjadi string?
    Berikutnya adalah string PK sebagai nilai kedua. Misalkan kita membuat string secara berurutan dengan mengombinasikan huruf kecil/besar alfabet Inggris dan angka. Urutannya adalah huruf kecil a -> z, huruf besar A -> Z, lalu angka 0 -> 9. Maka a akan menjadi nilai pertama yang dibuat, b nilai kedua, c nilai ketiga, ... dan seterusnya, sehingga kita bisa menyusun nilai secara berurutan. Setelah sampai 9, jumlah digit juga bisa bertambah menjadi aa, ab, ac, dan seterusnya. Jika dibuat berurutan seperti ini, akan ada indeks yang sesuai untuk tiap string. Dengan kata lain, indeks a adalah 1. Di sinilah letak idenya. PK menjadi indeks, dan kita hanya perlu menemukan string yang sesuai dengan PK tersebut.

Q. Bagaimana agar pemindahan dari Short URL ke Original URL bisa berlangsung cepat?
A.
Untuk ini saya menggunakan cache dengan cara yang sangat sederhana. Ada berbagai layanan yang bisa digunakan, tetapi pada proyek ini saya menerapkan memory cache agar data dapat diambil dengan cepat. Selain itu, fitur tambahan di luar sekadar mengambil data dan melakukan pengalihan diproses dengan membuat lightweight thread.

Q. Fitur tambahan apa saja yang diimplementasikan?
A.
Pertama, saya mengimplementasikan agar URL tujuan bisa berbeda untuk tiap platform. Sistem menerima DeepLink dasar untuk iOS dan Android, lalu juga menerima FallbackUrl untuk berjaga-jaga jika perpindahan lewat DeepLink gagal. Selain itu, sistem juga menerima URL tujuan saat diakses dari desktop agar semua kasus bisa ditangani.
Kedua, pada saat berpindah ke Original URL, agar pengguna bisa memeriksa log akses, saya menambahkan fitur untuk menerima webhook URL dan memanggil webhook URL tersebut setiap kali terjadi perpindahan ke Original URL. Saat ini implementasinya mengirimkan hanya User Agent dan informasi Short URL.
Ketiga, saat membuat Short URL, informasi tag Head juga bisa dimasukkan tambahan. Tujuan penambahan ini adalah untuk mengustomisasi tag og. Jika tag tersebut tidak dimasukkan, sistem diatur agar menyimpan informasi head dari Default URL.


Proyek ini dibuat menggunakan Rust. Sebenarnya saya baru belajar Rust sekitar 2 bulan. Awalnya proyek URL Shortener ini saya kembangkan dengan FastAPI, lalu berikutnya juga pernah saya kembangkan dengan Golang. Setelah itu, saat mempelajari Rust, saya benar-benar terpikat olehnya, sehingga saya kembali membuat proyek URL Shortener yang sepenuhnya disempurnakan.

Karena saya masih belum sepenuhnya terbiasa dengan sintaks, ownership, lifetime, dan hal-hal lainnya, mungkin masih ada kekurangan pada kode. Jadi saya sangat mengharapkan perhatian, dukungan, dan feedback dari kalian ๐Ÿ™

Terima kasih sudah membaca sampai akhir

17 komentar

 
leelou2 2025-01-09

Saya juga mengunggah proyek lain, mohon dukungannya ya ๐ŸŽ‰
https://id.news.hada.io/topic?id=18647

 
po5678 2025-01-07

Proyek yang sangat luar biasa.
Seperti yang Anda tuliskan, akan sangat bagus jika ada dukungan Docker!

 
leelou2 2025-01-07

Terima kasih ๐Ÿ‘ Docker akan saya tambahkan dan unggah minggu ini ๐Ÿ™‡โ€โ™‚๏ธ

 
po5678 2025-01-07

Apakah memasukkan email wajib? Saya tidak tahu bahwa tanpa verifikasi email, webhook atau pembuatan alamat tidak bisa dilakukan.

 
leelou2 2025-01-07

Kalau mungkin hanya digunakan secara internal dan perlu kustomisasi, saya bisa bantu membuat versi khusus secara terpisah dari proyek tersebut!

 
leelou2 2025-01-07

Ya, karena ditujukan untuk digunakan sebagai layanan publik, saya menerapkannya agar email wajib dimasukkan (menggunakan verifikasi email tanpa pendaftaran anggota).

Saya juga akan coba mempertimbangkan cara untuk mengubahnya agar saat memasukkan JWT, email tidak wajib ada ๐Ÿ™

 
po5678 2025-01-07

Wah, saya coba ikut panduannya dengan memasang Ubuntu di Lightsail, tapi ternyata ada banyak yang harus diinstal seperti SSL, pkg-config, SQLite, dan Cargo :) Saya sempat ingin memakai Cloudflare Tunnel untuk bagian https ini, bukan NPM, tapi sepertinya tetap terlalu sulit buat saya hehehe.. Saya tunggu versi Docker-nya! Kebetulan saya juga sedang bingung karena dynamic link sudah hilang, jadi ini bagus sekali.

 
leelou2 2025-01-07

Saya menambahkan Dockerfile dan perintah yang bisa dijalankan (deploy.sh) ๐ŸŽ‰

 
leelou2 2025-01-07

Saya akan menambahkan Docker secepat mungkin wkwk

 
po5678 2025-01-07

Oh, tapi memang berhasil dijalankan! Gimana caranya ya? Hoeng

 
jin225675 2025-01-07

Sepertinya akan lebih bagus jika Anda menambahkan URL demo tidak hanya di README repo GitHub, tetapi juga di website!

Biasanya saya lebih dulu melihat informasi di sisi kanan repo untuk mengecek apakah ada homepage atau playground, jadi saya sempat mengira tidak ada situs demo haha

Senang sekali bisa melihat-lihat proyek yang bagus ini!

 
leelou2 2025-01-07

Wah, saya tadi kelewatan. Akan langsung saya atur sekarang. Terima kasih ๐Ÿคฉ

 
balthasar 2025-01-07

Ini proyek yang terlihat dibuat dengan penuh perhatian!
Saya juga memakai sesuatu yang mirip dengan ini di perusahaan, dan dalam kasus saya, karena harus dimuat di media cetak, saya mengatur himpunan karakter agar menghindari karakter yang ambigu.

Ternyata ada juga pembahasan terkait di GeekNews.

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

 
laeyoung 2025-01-07

Bagus!! Saat membuat id atau menghasilkan tautan, memang akan lebih baik kalau hal itu juga dipertimbangkan.

 
leelou2 2025-01-07

Wow, terima kasih ๐Ÿ‘

 
leelou2 2025-01-06

Cukup instal Rust dan atur variabel lingkungan, lalu bisa langsung digunakan!
Layanan Google URL akan dihentikan tahun ini, jadi silakan gunakan ini sebagai alternatif. Jika ada hal yang ingin ditanyakan, bagian yang perlu ditingkatkan, atau cara instalasi, semua email sangat kami sambut ๐Ÿ‘

 
leelou2 2025-01-06

Anda bisa mencobanya dengan mudah di https://f-it.kr/ ๐Ÿ™‡โ€โ™‚๏ธ