29 Punkte von leelou2 2025-01-06 | 17 Kommentare | Auf WhatsApp teilen

Ich habe das URL-Shortener-Projekt immer wieder gebaut, verbessert, erneut gebaut und erneut verbessert … und am Ende ist endlich das allerallerletzte Open-Source-Projekt in Version v9 entstanden.

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


Bei der Vorbereitung des Projekts habe ich versucht, die folgenden Anforderungen unbedingt einzuhalten.

Anforderungen

  1. Die Short URL muss sehr schnell erzeugt werden können.
  • Sie darf nicht langsamer werden, nur weil die Datenmenge wächst.
  • Sie muss immer schnell sein, unabhängig von Situation, Anfrage oder verwendeten Daten.
  1. Auch die Weiterleitung von der Short URL zur Original URL muss schnell sein.
  • Eigentlich ist das selbstverständlich … 😅
  1. Es müssen Zusatzfunktionen enthalten sein, die unterschiedliche Nutzer zufriedenstellen können.
  • Wenn gewünscht, muss je nach Plattform auf unterschiedliche URLs weitergeleitet werden können.
  • Wenn gewünscht, müssen Nutzer die Daten einsehen können, die über die von ihnen erstellte URL eingehen.

Um diese Anforderungen zu erfüllen, habe ich wie folgt entwickelt.

Umgesetzte Punkte

Q. Wie kann man einen Short Key unabhängig von der Datenmenge schnell erzeugen?
A.
Im Allgemeinen gibt es verschiedene Möglichkeiten, einen Short Key zu erzeugen.
Die erste ist, einen zufälligen Wert zu generieren, in der Datenbank zu prüfen, ob er bereits existiert, und ihn zu verwenden, wenn das nicht der Fall ist. In diesem Fall ist es jedoch umständlich, die Datenbank zu prüfen und gegebenenfalls erneut zu generieren. Außerdem kann es zu erheblichen Verzögerungen kommen, wenn bereits viele Daten vorhanden sind oder wenn sich die Stellenzahl des Short Keys ändern muss.
Die zweite Möglichkeit ist, zufällige Short Keys im Voraus zu erzeugen und sie anschließend zuzuordnen. Da hier lediglich vorab erzeugte Short Keys gemappt werden, kann die Short URL immer schnell erstellt werden. Aber auch das ist keine endgültige Lösung. Es gibt Grenzen dafür, wie viele man im Voraus erzeugen kann, und es entstehen zusätzliche Überlegungen für den Fall, dass mehr Short URLs erzeugt werden als vorbereitet wurden.
Gibt es also keine noch bessere Methode?
Nach langem Überlegen habe ich die folgende Methode angewendet: eine Kombination aus einem zufälligen 4-stelligen String und einem aus dem PK abgeleiteten String. Die Erklärung der einzelnen Werte findet sich unten. Der Ablauf ist wie folgt: Wenn ein Nutzer die Erstellung einer Short URL anfragt, wird zunächst ein zufälliger 4-stelliger String erzeugt und unverändert in der Datenbank gespeichert. Der dabei ausgegebene PK wird anschließend nach der unten beschriebenen Methode in einen String umgewandelt. Aus der Kombination des zuerst erzeugten Zufalls-Strings und des PK-Strings wird dann der Short Key gebildet. Auf diese Weise lässt sich der Schlüssel selbst bei sehr großen Datenmengen schnell, sicher und ohne Duplikate erzeugen.

  • Zufällige 4 Stellen?
    Die zufälligen 4 Stellen sind hier ein wirklich zufälliger String aus englischen Kleinbuchstaben, Großbuchstaben und Ziffern. Es ist dabei unproblematisch, wenn dieser String Duplikate enthält.
  • PK als String?
    Als Nächstes kommt der PK-String als zweiter Wert. Nehmen wir an, wir erzeugen Strings der Reihe nach aus einer Kombination aus englischen Kleinbuchstaben, Großbuchstaben und Ziffern. Die Reihenfolge ist: Kleinbuchstaben a -> z, Großbuchstaben A -> Z und Ziffern 0 -> 9. Dann wäre a der erste erzeugte Wert, b der zweite, c der dritte … und so ließen sich fortlaufend beliebige Werte kombinieren. Wenn 9 erreicht ist, könnte man mit aa, ab, ac usw. weitermachen und dabei auch die Stellenzahl erhöhen. Wenn man sie in dieser Reihenfolge erzeugt, entsteht ein Index, der zu jedem String passt. Der Index von a wäre also 1. Genau darin steckt die Methode: Der PK wird zum Index, und man muss nur den String finden, der zu diesem PK passt.

Q. Wie kann die Weiterleitung von der Short URL zur Original URL schnell gemacht werden?
A.
Das wurde ganz einfach mit einem Cache gelöst. Es gibt verschiedene Services dafür, aber in diesem Projekt wurde ein In-Memory-Cache verwendet, damit Daten schnell abgefragt werden können. Zusätzlich wurden begleitende Funktionen, die über das reine Abfragen und Weiterleiten hinausgehen, in leichtgewichtigen Threads verarbeitet.

Q. Welche zusätzlichen Funktionen wurden umgesetzt?
A.
Als Erstes wurde eine Weiterleitung auf unterschiedliche URLs je nach Plattform implementiert. Für iOS und Android werden jeweils Standard-DeepLinks entgegengenommen und gespeichert. Für den Fall, dass die Weiterleitung per DeepLink nicht möglich ist, wird zusätzlich eine FallbackUrl angenommen. Darüber hinaus wird auch eine URL für Desktop-Zugriffe entgegengenommen, sodass alle Fälle abgedeckt sind.
Zweitens wurde eine Funktion hinzugefügt, bei der Nutzer den Zugriffs-Log zum Zeitpunkt der Weiterleitung auf die Original URL nachvollziehen können: Dazu wird eine Webhook-URL entgegengenommen, die jedes Mal aufgerufen wird, wenn zur Original URL weitergeleitet wird. Aktuell werden dabei nur der User Agent und die Short-URL-Informationen übermittelt.
Drittens können beim Erstellen der Short URL zusätzliche Informationen für den Head-Tag eingegeben werden. Der Zweck davon ist die Anpassung von og-Tags. Wenn diese Tags nicht eingegeben werden, wird standardmäßig die Head-Information der Default URL gespeichert.


Dieses Projekt wurde mit Rust umgesetzt. Tatsächlich lerne ich Rust erst seit zwei Monaten. Das URL-Shortener-Projekt habe ich anfangs mit FastAPI entwickelt und danach auch mit Golang umgesetzt. Als ich dann Rust gelernt habe, war ich so begeistert davon, dass ich dieses vollständig weiterentwickelte URL-Shortener-Projekt noch einmal neu gebaut habe.

Da mir Syntax, Ownership und Lifetimes noch nicht vollständig vertraut sind, kann es sein, dass es im Code noch einige Schwächen gibt. Ich freue mich daher sehr über Interesse, Unterstützung und Feedback 🙏

Vielen Dank fürs Lesen bis zum Schluss.

17 Kommentare

 
leelou2 2025-01-09

Ich habe auch ein anderes Projekt veröffentlicht – ich freue mich über euer großes Interesse 🎉
https://de.news.hada.io/topic?id=18647

 
po5678 2025-01-07

Ein wirklich hervorragendes Projekt.
Wie Sie schon geschrieben haben, wäre es großartig, wenn Docker unterstützt würde!

 
leelou2 2025-01-07

Vielen Dank 👏 Ich werde Docker im Laufe dieser Woche noch hinzufügen und hochladen 🙇‍♂️

 
po5678 2025-01-07

Ist die Eingabe einer E-Mail-Adresse vielleicht verpflichtend? Mir war nicht klar, dass ohne E-Mail-Bestätigung weder Webhooks noch die Erstellung von Adressen möglich sind.

 
leelou2 2025-01-07

Falls Sie es nur intern verwenden möchten und Anpassungen benötigen, passe ich es Ihnen unabhängig von diesem Projekt gern separat an!

 
leelou2 2025-01-07

Ja, ich habe es so eingerichtet, dass für die Nutzung als öffentlicher Service eine E-Mail-Adresse verpflichtend ist (mit E-Mail-Verifizierung ohne Registrierung).

Ich werde auch einmal überlegen, wie man es so anpassen könnte, dass bei der Eingabe eines JWT keine E-Mail-Adresse erforderlich ist 🙏

 
po5678 2025-01-07

Oh, ich installiere Ubuntu auf Lightsail und versuche es Schritt für Schritt nachzumachen, aber es gibt ziemlich viel zu installieren, etwa SSL, pkg-config, SQLite und Cargo :) Für den https-Teil wollte ich statt NPM eigentlich Cloudflare Tunnel verwenden, aber das scheint für mich doch schwierig zu sein hehe.. Ich freue mich auf eine Docker-Version! Ich habe mir ohnehin Gedanken gemacht, weil Dynamic Links wegfallen, deshalb ist das wirklich großartig.

 
leelou2 2025-01-07

Ich habe eine Dockerfile und einen ausführbaren Befehl (deploy.sh) hinzugefügt 🎉

 
leelou2 2025-01-07

Ich werde Docker so schnell wie möglich hinzufügen, haha

 
po5678 2025-01-07

Oh, aber ich habe es tatsächlich ausgeführt! Wie habe ich das gemacht? Huch

 
jin225675 2025-01-07

Ich denke, es wäre gut, wenn ihr im GitHub-Repo nicht nur im README, sondern auch auf der Website eine Demo-URL hinzufügen würdet!

Normalerweise schaue ich zuerst auf die Informationen auf der rechten Seite des Repos, um zu prüfen, ob es eine Homepage oder einen Playground gibt, daher dachte ich zuerst, es gäbe keine Demo-Seite, haha.

Ich habe mir das tolle Projekt sehr gerne angesehen!

 
leelou2 2025-01-07

Oh, das ist mir entgangen. Ich werde es sofort einrichten, danke 🤩

 
balthasar 2025-01-07

Das wirkt wie ein Projekt, in das viel Sorgfalt geflossen ist!
Ich nutze in meiner Firma ebenfalls etwas Ähnliches, und in meinem Fall musste es in Printmedien erscheinen, daher habe ich den Zeichensatz so festgelegt, dass mehrdeutige Zeichen vermieden werden.

Dazu gab es auch etwas auf GeekNews.

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

 
laeyoung 2025-01-07

Gefällt mir!! Wenn eine ID oder ein Link generiert wird, ist es wirklich hilfreich, so etwas dabei zu berücksichtigen.

 
leelou2 2025-01-07

Wow, danke 👍

 
leelou2 2025-01-06

Kann sofort verwendet werden, sobald Rust installiert und nur die Umgebungsvariablen gesetzt sind!
Der Google-URL-Dienst wird dieses Jahr eingestellt – nutzen Sie es als Alternative. Bei Fragen, Verbesserungsbedarf, Installationsmethoden und allen anderen Themen freuen wir uns über jede E-Mail 👏

 
leelou2 2025-01-06

Sie können es ganz einfach unter https://f-it.kr/ ausprobieren 🙇‍♂️