29 pontos por leelou2 2025-01-06 | 17 comentários | Compartilhar no WhatsApp

Depois de criar, melhorar, criar de novo e melhorar de novo o projeto de URL Shortener... repetindo esse processo, finalmente cheguei ao projeto open source v9 definitivo-definitivo-definitivo.

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


Ao preparar o projeto, procurei seguir rigorosamente os requisitos abaixo.

Requisitos

  1. A Short URL deve ser gerada muito rapidamente
  • Não pode ficar mais lenta só porque a quantidade de dados aumentou
  • Deve ser rápida independentemente da situação, do momento ou dos dados usados na requisição
  1. O redirecionamento da Short URL para a Original URL também deve ser rápido
  • Na verdade, isso é meio óbvio... 😅
  1. Deve incluir recursos adicionais capazes de atender diferentes tipos de usuários
  • Se desejado, deve ser possível redirecionar para URLs diferentes por plataforma
  • Se desejado, o usuário deve poder verificar os dados de entrada da URL que ele criou

Para atender a esses requisitos, desenvolvi da seguinte forma.

O que foi aplicado

Q. Como gerar uma Short Key rapidamente, independentemente do volume de dados?
A.
De modo geral, existem várias formas de gerar uma Short Key.
A primeira é gerar um valor aleatório, verificar no banco de dados se ele já existe e, se não existir, usá-lo diretamente. Mas, nesse caso, há o incômodo de consultar o banco de dados e eventualmente precisar gerar novamente. Além disso, quando já existe muito dado ou quando chega o momento de alterar o número de caracteres da Short Key, pode haver bastante latência.
A segunda é gerar várias Short Keys aleatórias com antecedência e depois apenas fazer o mapeamento. Como nesse caso basta associar uma Short Key previamente criada, é possível gerar a Short URL rapidamente em qualquer momento. Ainda assim, isso também não é a solução ideal. Pode haver limites para o que é pré-gerado, e também surgem pontos extras a considerar caso sejam criadas mais Short URLs do que o volume preparado antecipadamente.
Então, não haveria um método ainda melhor?
Depois de pensar bastante, apliquei o método abaixo: combinar uma string aleatória de 4 caracteres com uma string baseada na PK. Consulte abaixo a explicação de cada valor. A ordem é a seguinte: quando o usuário solicita a criação de uma Short URL, uma string aleatória de 4 caracteres é gerada e salva diretamente no banco de dados. Ao salvar, a PK emitida é convertida em string pelo método descrito abaixo. Em seguida, a string aleatória gerada inicialmente é combinada com a string da PK para formar a Short Key. Dessa forma, não importa o quanto os dados aumentem: ela pode ser gerada com rapidez, segurança e sem duplicações.

  • Número aleatório de 4 dígitos?
    Aqui, o valor aleatório de 4 caracteres é uma string realmente aleatória composta por letras minúsculas/maiúsculas do alfabeto inglês e números. Não há problema se essa string tiver duplicações.
  • Converter a PK em string?
    Em seguida vem o segundo valor, a string da PK. Suponha que criemos strings em ordem combinando letras minúsculas/maiúsculas do alfabeto inglês e números. A ordem é: letras minúsculas de a -> z, letras maiúsculas de A -> Z e números de 0 -> 9. Então a seria o primeiro valor criado, b o segundo, c o terceiro, e assim por diante, permitindo combinar valores de forma sequencial. Depois de chegar até 9, seria possível continuar aumentando o número de caracteres com aa, ab, ac etc. Se criarmos assim em ordem, cada string passa a ter um índice correspondente. O índice de a, por exemplo, seria 1. E aqui está o ponto principal: a PK se torna o índice, e basta encontrar a string correspondente àquela PK.

Q. Como tornar rápido o redirecionamento da Short URL para a Original URL?
A.
Aqui usei cache de forma bem simples. Existem vários serviços possíveis, mas neste projeto apliquei cache em memória para permitir consultas rápidas aos dados. Além disso, recursos complementares que vão além de simplesmente consultar os dados e redirecionar são tratados por meio da criação de threads leves.

Q. Que recursos adicionais foram implementados?
A.
Primeiro, implementei o redirecionamento para URLs diferentes por plataforma. São recebidos e armazenados os DeepLinks padrão de iOS e Android, e também é recebido um FallbackUrl para o caso de não ser possível abrir o DeepLink. Além disso, também é recebida a URL para redirecionamento quando o acesso é feito por desktop, cobrindo todos os cenários.
Em segundo lugar, no momento em que ocorre o redirecionamento para a Original URL, adicionei uma função para que o usuário possa verificar os logs de acesso: é possível receber uma URL de webhook, e toda vez que houver redirecionamento para a Original URL essa URL de webhook será chamada. No momento, a implementação envia apenas o User Agent e as informações da Short URL.
Em terceiro lugar, ao criar a Short URL, passei a permitir a inserção adicional das informações da tag head. O objetivo disso é customizar as tags og. Caso essas tags não sejam informadas, o sistema foi configurado para salvar as informações de head da Default URL.


Este projeto foi feito usando Rust. Na verdade, faz apenas 2 meses que comecei a aprender Rust. No começo, desenvolvi o projeto de URL Shortener em FastAPI e depois também em Golang. Então, ao aprender Rust, acabei me encantando muito e resolvi criar mais uma vez um projeto de URL Shortener totalmente aprimorado.

Ainda não estou totalmente acostumado com a sintaxe, ownership, lifetimes e outros conceitos, então talvez ainda existam pontos fracos no código. Ficarei muito grato por interesse, apoio e feedback 🙏

Obrigado por ler até o fim.

17 comentários

 
leelou2 2025-01-09

Também publiquei outros projetos, agradeço muito o interesse de vocês 🎉
https://pt.news.hada.io/topic?id=18647

 
po5678 2025-01-07

É um projeto excelente.
Como você escreveu, seria ótimo se houvesse suporte a Docker!

 
leelou2 2025-01-07

Obrigado 👏 Vou adicionar o Docker ainda esta semana e publicar 🙇‍♂️

 
po5678 2025-01-07

Por acaso, informar o e-mail é obrigatório? Eu não sabia que, sem a verificação por e-mail, não era possível usar o webhook nem gerar endereços.

 
leelou2 2025-01-07

Caso você precise de algo personalizado para uso apenas interno, posso fazer uma customização à parte, separadamente desse projeto!

 
leelou2 2025-01-07

Sim, como foi configurado para ser usado como um serviço público, deixei o e-mail como obrigatório (usando verificação por e-mail sem cadastro de usuário).

Também vou pensar em uma forma de ajustar para que, ao inserir o JWT, não seja necessário ter e-mail 🙏

 
po5678 2025-01-07

Nossa, estou instalando no Ubuntu Lightsail e seguindo o passo a passo, mas tem bastante coisa para instalar, como SSL, pkg-config, sqlite e cargo :) Eu até pensei em usar Cloudflare Tunnel nessa parte do https em vez de NPM, mas realmente acho isso difícil haha.. Vou ficar no aguardo da versão com Docker! Eu já estava preocupado porque o Dynamic Link acabou, então isso é bom demais.

 
leelou2 2025-01-07

Adicionei o Dockerfile e um comando executável (deploy.sh) 🎉

 
leelou2 2025-01-07

Vou adicionar Docker o mais rápido possível kkk

 
po5678 2025-01-07

Ah, mas eu consegui executar! Como foi que eu fiz isso? Eita

 
jin225675 2025-01-07

Acho que seria bom adicionar a URL de demonstração no website, além do README no repositório do GitHub!

Normalmente eu costumo olhar primeiro as informações na lateral direita do repositório para ver se há uma homepage ou playground, então achei que não existia um site de demonstração haha

Gostei muito de conhecer o projeto, parabéns!

 
leelou2 2025-01-07

Ah, eu tinha deixado passar isso; vou configurar agora mesmo. Obrigado 🤩

 
balthasar 2025-01-07

Parece ser um projeto feito com bastante capricho!
Eu também uso algo parecido que fiz na empresa e, no meu caso, como precisava sair em mídia impressa, configurei o conjunto de caracteres para evitar caracteres ambíguos.

Também tinha algo relacionado no GeekNews.

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

 
laeyoung 2025-01-07

Ficou legal!! Quando gera um id ou um link, realmente é bom levar isso em consideração.

 
leelou2 2025-01-07

Uau, obrigado 👍

 
leelou2 2025-01-06

Basta instalar o Rust e definir apenas as variáveis de ambiente para usar imediatamente!
Como o serviço de URL do Google será encerrado este ano, use isto como alternativa. Qualquer dúvida, ponto que precise de melhoria ou forma de instalação, todas as mensagens por e-mail são bem-vindas 👏

 
leelou2 2025-01-06

Você pode experimentar de forma simples em https://f-it.kr/ 🙇‍♂️