Executando verificação de segurança...
19

Pitch: Como eu criei um encurtador de URL com Spring Boot, Next.JS e Redis

Oi, meu nome é Vitor Medeiro, sou desenvolvedor há mais ou menos 7 anos e estou criando o curto.io, um micro-saas de engajamento com links curtos, que está em um pré do pré do pré stage, mas com um Beta Launch a caminho.

Com o objetivo de tirar algo do papel e conseguir passar algum conhecimento com isso, decidi lançar uma versão simples de um encurtador (motor usado pelo curto.io), grauito, utilizando as tecnologias Spring Boot, Next.js, Mongo.db e Redis.

Arquitetura

O desenho da solução inicial para esse sistema é o seguinte:

Desenho curto.io

Next.js

A aplicação web com qual o usuário vai interagir, que vai carregar tanto a parte "deslogada" quanto a parte logada do sistema, que ainda está em desenvolvimento mas podemos ter um preview da página de criação de links.

Preview página de criação de links

Foi feito da maneira mais simples que eu conheço, pois não domino muito da arte do frontend, então foi feito na mais básica stack no frontend com CSS Modules, pois eu já tinha alguns componentes prontos.

Nesse momento está hospedado na vercel, e você pode vê-lo aqui: https://curto.io

Spring Boot

É o backend principal da minha aplicação, feita em Kotlin somente pelo motivo de eu já conhecer a linguagem e ter experiência com o ecossistema Java, partir pra esse lado me deu muita produtivdade na hora de codificar os endpoints da API.

Apesar de existir a opção de usar as API routes do Next.js, e ser uma ótima opção devido ao incrível serverless da Vercel, decidi por manter o melhor dos dois mundos separados, para que a aplicação não fique tão cara 🤑, então to mantendo o melhor dos dois mundos, o uptime magnífico do serverless, com o conforto do serverfull, devido minha experiência no passado.

OBS: Deixo aqui uma coisa extremamente importante na adoção de uma tecnologia para um produto e/ou sistema: trabalhe com o que você conhece e domina 🤝, isso é extremamente importante no sucesso de um produto.

Redis

Devido sua característica de KVS (Key Value Store), funciona como uma luva para armazenar os tokens dos links curtos para que possamos posteriormente "trocar" por links longos na aplicação, garantindo rapidez e escala na hora de redirecionarmos os usuários, evitando com que a minha API principal seja bombardeada com tanto tráfego no redirecionamento.

Para o redis, estou utilizando Upstash, uma solução que provê o redis como uma plataforma serverless, que vai ser muito legal para o momento da minha aplicação, que vai escalar no decorrer do tempo, além de oferecer um preço muito bacana.

Como funciona o Redirecionamento?

Coloquei dois desenhos (de procedência duvidosa) que explica mais ou menos o fluxo das duas principais funções do projeto: Criar links curtos e redirecioná-los para links longos.

  1. Criação de um link curto

Criar link curto

  1. Redirecionamento de um link curto para um link longo.

Redirecionamento link curto para link longo

Roadmap do produto

Você pode acompanhar um roadmap público do projeto aqui, com as principais features sendo feitas antes do lançamento beta da aplicação, do qual vou avisar vocês assim que estiver perto 🤝.

Pretendo postar mais coisas a medida que as features forem sendo feitas, acredito que podemos aprender muitas coisas juntos.

Conclusão

Espero que com isso alguém possa ter tido algum insight sobre como funciona um encurtador, que apesar de simples, pode carregar um desafio enorme na hora de escalar.

Quer conversar mais comigo? Vou deixar abaixo formas de me contatar.

E-mail: [email protected]
Linkedin: https://curr.to/COm4c
GitHub: https://curr.to/fb2uA

Carregando publicação patrocinada...
2

Parabéns pelo projeto Vitor! Eu adoro saber que algo tão massa está sendo criado por alguém aqui da comunidade!

Uma coisa que me chamou atenção foi no fluxograma do caso de uso de quando a pessoa acessa o link curto. Ele vai direto no Redis ou checa se exisge no Redis e caso não exista ele vai até o banco de dados?

Talvez minha pergunta seja trivial para você, mas no desenho não mostrou isso, e me gera um pouco de preocupação nesse sentido pois caso o redis reinicie, ele não terá mais o histórico, visto que ele salva em memoria..

É o único ponto de atenção que encontrei, mas talvez você já deva estar fazendo isso e só não colocou no desenho

No mais, achei muito massa MESMO! Usar o bitly principalmente pra quem cria conteúdo é um problema pq as plataformas punem quando você usa um link do bitly. Vou usar o cortu.io sempre que fizer alguma ação.

Muito obrigado o/

1

Eu utilizo o redis como fonte de dados mesmo, um key value store, o Upstash fornece um storage duravel, entao mesmo se minha instancia reinicia, meu volume mantém os dados.

Durante o redirecionamento o objetivo é evitar ao máximo ir na API, usando só o Redis para obter os dados.

Mas caso aconteca de eu perder esse storage, temos um mecanismo de "sincronia" dos links com o Redis, a fim de manter a consistencia entre as duas bases, mas a intencão é precisar o mínimo possivel da API para o redirecionamento, devido a quantidade de "cliques" ser muito superior que os links. (Falamos de uma razao atualmente de 100:1, 100 clicks por link criado por enquanto)

Sobre as plataformas punirem, consegue me contar mais sobre a sua experiencia? Eu tenho a minha mas seria muito enriquecedor saber sobre a sua!

1

Ahh como eu imaginei! Você já tava tratando isso haha! Show de bola, obrigado por explicar.

Então, eu crio conteúdo pra internet há 13 anos, já passei por sites de humor, portal de league of legends, canal com foco em Hip Hop, já ensinei a programar e atualmente falo sobre liderança em tecnologia.

Nessa trajetória eu sempre precisei usar encurtador, no começo eu usava o finado Migre.me do Jhonnyken, mas ele morreu e passei a usar o bitly.

Em várias campanhas de google ads, facebook ads e etc eu sempre usei encurtador para medir o número de cliques e comparar com o analytics pra ver se tava perdendo leads e etc.

E percebi que em meados de 2018, sempre que eu usava o Bitly o custo por lead era mais caro.

E digo mais, no organico, se você coloca o bitly ele simplesmente não entrega o conteúdo. Seja no Instagram, facebook ou Twitter. Até mesmo em descrição de Youtube.

Isso não acontece com outros encurtadores pelo que percebi, mas são meio rudimentares, e foi isso que gostei no seu, me parece algo que vai escalar pra algo com um pouco mais de recurso e que pode ajudar muito no meu caso(e também pra quem faz campanhas de trafego, por exemplo)...

Acho que é isso, se precisar de algo me avisa que a gente troca uma ideia!

1

Que legal cara, muito obrigado pelo depoimento, muito bacana saber sobre seu caso de uso.

Se você me permitir, vou entrar em contato com você pra falarmos mais sobre a evolução do produto, seria legal ter insights do seu caso de uso.

A intenção é ser justamente uma alternativa ao bitly, short.io, pensada primariamente pro brasileiro, oferecendo além de um preço diferenciado, uma experiência focada em resolver os problemas dos usuarios!

Obrigado pelo feedback!

2

Muito bom o artigo! Eu também estava tentando criar um encurtador para o TabNews, o TabNe.ws, só que eu estou utilizando FastAPI. Pretendo fazer uma Pitch se eu for lançar oficialmente.

1
1

Bom demais, Vitor! Parabéns e boa sorte com o projeto. Aliás, muito boa a didática (e os desenhos duvidosos kkkkk) pra explicar o funcionamento, esclareceu algumas dúvidas que eu tinha sobre. Sucesso!

1
1
1

Eu comprei o dominio na Namecheap e apontei pra mesma app na vercel, e entao eu tenho uma Edge Middleware que baseado no dominio, direciona pra um lugar diferente:

curto.io redireciona pra app principal
curr.to redireciona para um "motor de redirect", que eh justamente o meu segundo desenho.

1

Fala Vitor, gostei do seu projeto cara, tanto o design quanto a arquitetura, está ficando muito bom, parabéns!

Uma pergunta, qual app vc usa pra criar os fluxogramas? gostei do formato ficou bem explicativo.

Abraço!

1
1
1
1

Rapaz, você foi simples e objetivo, parabéns pelo projeto.

Concordo com você quanto a utilizar as ferramentas que domina, afinal pra quê ter dor de cabeça certo? Salvo quando se está estudando novas ferramentas claro!!!

Vou acompanhar seu projeto, mais uma vez parabéns...

1
1

Massa! A interface está ficando muito bonita.

Um "bug" que eu achei foi que durante a animação do confete (ao encurtar uma URL no mobile) a tela é redimensionada e fica maior do que a tela do celular.

Posso estar errado, mas se não me engano, um erro parecido acontecia no TabNews e já foi corrigido em um PR.

1
1
1

Muito legal, realmente eu estava precisando e também tinha em mente em fazer algo semelhante, antes de ver o seu artigo. Bom que agora tenho a inspiração e o conhecimento de como funciona. Show de bola.