Een URL-shortener ontwerpen
Doorloop het systeemontwerp van een URL-verkortingsservice en houd rekening met schaalbaarheid, opslag en beschikbaarheid.
Een URL-shortener ontwerpen is een gratis Basiskennis van systeemontwerp voor backendontwikkelaars-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Basiskennis van systeemontwerp voor backendontwikkelaars. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Basiskennis van systeemontwerp voor backendontwikkelaars bevat in totaal 4 lessen.
Inleiding tot URL-verkorters
Welkom! In deze les ontwerpen we een service voor het verkorten van URL's, vergelijkbaar met Bitly of TinyURL. Deze services nemen een lange, complexe URL en zetten deze om in een veel kortere en beter hanteerbare URL.
URL-verkorters zijn bijzonder handig om links te delen op sociale media, in e-mails of overal waar de ruimte beperkt is. Ze bieden vaak ook analyses, waarbij wordt bijgehouden hoe vaak er op een verkorte link wordt geklikt.
Kernfunctionaliteit: verkorten en doorsturen
Een URL-verkorter voert voornamelijk twee belangrijke functies uit:
- Verkorten: Neemt een lange URL als invoer en genereert een unieke, korte code. Deze code wordt vervolgens gebruikt om de korte URL samen te stellen.
- Doorsturen: Wanneer een gebruiker een korte URL opent, zoekt de service de bijbehorende lange URL op en stuurt de browser van de gebruiker daarheen door.
Deze twee bewerkingen vormen de basis van het hele systeem.
Unieke korte codes genereren
De kern van een URL-verkorter is de mogelijkheid om unieke, korte en vaak voor mensen leesbare codes te genereren. Veelgebruikte aanpakken zijn:
- Sequentiële ID's + Base62-codering: Gebruik een automatisch oplopende database-ID en zet deze om in een Base62-tekenreeks. Base62 gebruikt 0-9, a-z en A-Z (62 tekens), waardoor kortere codes mogelijk zijn dan met Base10.
- Hashfuncties: Pas een hashfunctie, zoals MD5 of SHA256, toe op de lange URL. Gebruik een deel van de hash om de korte code te vormen. Hierbij moet je botsingen afhandelen.
- Willekeurige tekenreeksen genereren: Genereer een willekeurige tekenreeks met een vaste lengte. Ook hierbij moet je de uniciteit controleren om botsingen te voorkomen.
Voorbeeld van Base62-codering
Bekijk een eenvoudig Python-voorbeeld van Base62-codering. Dit is een populaire methode om korte codes uit sequentiële ID's te genereren. Zo blijft de uniciteit gewaarborgd en blijven de codes compact.
BASE62_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
def encode_base62(num):
if num == 0:
return BASE62_CHARS[0]
result = []
while num > 0:
result.append(BASE62_CHARS[num % 62])
num //= 62
return "".join(reversed(result))
# Example usage:
if __name__ == "__main__":
test_id = 12345
short_code = encode_base62(test_id)
print(f"ID: {test_id} -> Short Code: {short_code}")
test_id_large = 9876543210
short_code_large = encode_base62(test_id_large)
print(f"ID: {test_id_large} -> Short Code: {short_code_large}")Databaseschema voor URL's
Om onze URL-koppelingen op te slaan, hebben we een database nodig. Een eenvoudig schema kan er als volgt uitzien, met een relationele database zoals PostgreSQL:
- id: Primaire sleutel (automatisch oplopend geheel getal)
- short_code: VARCHAR(10) - De unieke korte tekenreeks
- long_url: TEXT - De oorspronkelijke, lange URL
- created_at: TIMESTAMP - Wanneer de korte URL is aangemaakt
- user_id: INT (optioneel) - Als gebruikers accounts kunnen aanmaken
- click_count: INT (optioneel) - Voor eenvoudige analyses
Een NoSQL-database kan ook werken en biedt flexibiliteit bij de ontwikkeling van het schema.
De doorstuurservice
Wanneer een gebruiker op een korte URL klikt, zoals https://tiny.url/abcde, neemt de doorstuurservice het over. Deze voert de volgende stappen uit:
- Haalt de
short_code, bijvoorbeeldabcde, uit de URL. - Vraagt de database op om de bijbehorende
long_urlte vinden. - Stuurt een HTTP-omleidingsantwoord 301 (Moved Permanently) of 302 (Found) naar de browser van de gebruiker, met de
long_urlals doel.
301 versus 302: 301 is bedoeld voor permanente omleidingen en wordt door browsers in de cache opgeslagen; 302 is tijdelijk. Voor URL-verkorters heeft 301 vaak de voorkeur vanwege de prestaties na de eerste aanmaak.
Botsingen en uniciteit afhandelen
Het is essentieel dat elke gegenereerde korte code uniek is. Als we hashfuncties of willekeurige tekenreeksen gebruiken, zijn botsingen mogelijk: twee verschillende lange URL's krijgen dan dezelfde korte code. Bij langere codes komt dit zelden voor.
Strategieën om botsingen af te handelen:
- Databasecontrole: Probeer de nieuwe koppeling altijd in te voegen en vang een schending van de unieke beperking op. Als er een botsing optreedt, genereer je de code opnieuw en probeer je het nogmaals.
- Vooraf controleren: Vraag vóór het invoegen de database op om te controleren of de code al bestaat. Dit kan bij hoge gelijktijdigheid leiden tot racecondities. Unieke beperkingen op databaseniveau hebben daarom de voorkeur.
- Gedistribueerde ID-generatie: Gebruik voor sequentiële ID's een gedistribueerde ID-generator, zoals Snowflake ID, om wereldwijd unieke ID's te garanderen die vervolgens met Base62 kunnen worden gecodeerd.
Overwegingen voor schaalbaarheid
Een populaire URL-verkorter moet miljoenen verzoeken kunnen verwerken. Belangrijke punten voor schaalbaarheid zijn:
- Database: De database wordt een knelpunt. Overweeg om de database te sharden op basis van
short_codeof een gedistribueerde sleutel-waardearchief te gebruiken. Leesreplica's zijn essentieel voor de doorstuurservice. - Caching: Sla vaak opgevraagde koppelingen van korte naar lange URL's in de cache op, bijvoorbeeld met Redis of Memcached, om de belasting van de database te verminderen, vooral voor het doorstuurpad.
- Asynchrone verwerking: Stuur voor klikanalyses klikgebeurtenissen naar een berichtenwachtrij voor asynchrone verwerking, in plaats van een teller synchroon te verhogen.
- Load balancers: Verdeel binnenkomend verkeer over meerdere instanties van je verkortings- en doorstuurservices.
Eenvoudige klikanalyses
Naast het verkorten bieden veel services eenvoudige analyses. Zo houd je klikken bij:
- Wanneer een korte URL wordt geopend, verhoog je
click_countin de database voor die specifieke koppeling. - Bij veel verkeer kan het bijwerken van deze teller een knelpunt worden. Een beter schaalbare aanpak is om een bericht naar een wachtrij te sturen, zoals Kafka of RabbitMQ, en een afzonderlijk werkproces de aantallen asynchroon te laten bijwerken of gedetailleerde kliklogboeken te laten opslaan.
- Voor gedetailleerde analyses kun je onder andere de verwijzende pagina, user-agent en het IP-adres opslaan in een afzonderlijke analysedatabase, zoals een datawarehouse.
Uitdaging: URL-verkorter
Bij het ontwerpen van de doorstuurservice voor een URL-verkorter: welke HTTP-antwoordcode is het belangrijkst om naar de browser van de gebruiker te sturen, en waarom?
Samenvatting: ontwerp van een URL-verkorter
We hebben de belangrijkste onderdelen van het ontwerpen van een URL-verkorter doorlopen!
- We hebben de twee hoofdfuncties behandeld: verkorten en doorsturen.
- We hebben methoden voor het genereren van unieke korte codes onderzocht, zoals Base62-codering.
- We hebben het databaseschema voor het opslaan van koppelingen en de werking van de doorstuurservice besproken.
- We hebben belangrijke aspecten behandeld, zoals het afhandelen van botsingen, schaalbaarheid met caching en sharding en eenvoudige klikanalyses.
Deze casestudy laat zien hoe verschillende principes van systeemontwerp samenkomen om een functionele en schaalbare service te bouwen.
Leer Basiskennis van systeemontwerp voor backendontwikkelaars met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Een URL-shortener ontwerpen” gratis?
Ja — de volledige tekst van “Een URL-shortener ontwerpen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Basiskennis van systeemontwerp voor backendontwikkelaars wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Basiskennis van systeemontwerp voor backendontwikkelaars bevat in totaal 4 lessen.
Wat leer ik in “Een URL-shortener ontwerpen”?
Doorloop het systeemontwerp van een URL-verkortingsservice en houd rekening met schaalbaarheid, opslag en beschikbaarheid. Je oefent met Basiskennis van systeemontwerp voor backendontwikkelaars door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Basiskennis van systeemontwerp voor backendontwikkelaars te beginnen?
Ervaring vooraf is niet nodig. Basiskennis van systeemontwerp voor backendontwikkelaars op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Een URL-shortener ontwerpen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Basiskennis van systeemontwerp voor backendontwikkelaars?
Ja. Elke les over Basiskennis van systeemontwerp voor backendontwikkelaars bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Een URL-shortener ontwerpen
- Een socialmediafeed bouwen
- Een e-commerceplatform schalen
- Een realtime-chatsysteem ontwerpen