{"id":4375,"date":"2022-05-24T15:16:23","date_gmt":"2022-05-24T18:16:23","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4375"},"modified":"2025-04-28T10:46:35","modified_gmt":"2025-04-28T13:46:35","slug":"iniciando-o-design-arquitetural-de-um-encurtador-de-urls","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/","title":{"rendered":"Cap 4.1 Iniciando o design arquitetural de um &#8220;encurtador de URLs&#8221;"},"content":{"rendered":"<p><strong>Conhecimento, ganha-se estudando. Entendimento, ganha-se refletindo sobre algo estudado. Sabedoria, ganha-se com a pr\u00e1tica.<\/strong><\/p>\n<p>Nesse cap\u00edtulo, usaremos alguns dos conceitos discutidos nesse livro para iniciar a elabora\u00e7\u00e3o do <em>design<\/em> arquitetural de um encurtador de URLs. Iremos tratar, obviamente de um cen\u00e1rio fict\u00edcio.<\/p>\n<h2>O que \u00e9 um &#8220;Encurtador de URLs&#8221;<\/h2>\n<p><strong>URLs longas s\u00e3o mais dif\u00edceis de lembrar, manter e compartilhar. O encurtamento de URL \u00e9 uma t\u00e9cnica, adotada frequentemente, para transformar endere\u00e7os HTTP em links mais curtos.\u00a0<\/strong><\/p>\n<p>O encurtamento de URLs ganhou destaque, primeiro, com a populariza\u00e7\u00e3o do Twitter &#8211; onde, originalmente, havia um limite de 140 caracteres por postagens. A ideia original era &#8220;economizar&#8221; caracteres nas URLs compartilhadas para permitir a adi\u00e7\u00e3o de mais informa\u00e7\u00f5es em um tu\u00edte. Atualmente, a plataforma j\u00e1 oferece esse recurso <em>built<\/em><em>-in.<\/em><\/p>\n<p>Alguns servi\u00e7os para encurtamento de URLs geram estat\u00edsticas de acessos a partir dos <em>links<\/em> encurtados. Tamb\u00e9m tem se tornado comum permitir a personaliza\u00e7\u00e3o da URL curta, facilitando a leitura.<\/p>\n<p>A ado\u00e7\u00e3o de um encurtador de URL pode tornar o acesso a um site perceptivelmente mais lento, devido a necessidade de mais requisi\u00e7\u00f5es HTTP e DNS.<\/p>\n<h2>Coletando informa\u00e7\u00f5es para o Haiku<\/h2>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">Architecture Haiku<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">N\u00e3o sabe o que \u00e9 um &#8220;Architecture Haiku&#8221;? Consulte agora esse t\u00f3pico no cap\u00edtulo em que tratamos sobre documenta\u00e7\u00e3o de software.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/volume-1\/documentacao-arquitetural-na-medida-certa\/#Consideracoes_sobre_Architecture_Haiku\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> <em>Designs<\/em> arquiteturais devem atender os objetivos do neg\u00f3cio, respeitando restri\u00e7\u00f5es, satisfazendo atributos de qualidade, mitigando riscos e reduzindo custos. N\u00e3o h\u00e1 trabalho de arquitetura sem explicita\u00e7\u00e3o dos requisitos do neg\u00f3cio.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Em nosso &#8220;cen\u00e1rio fict\u00edcio&#8221;, as pessoas do neg\u00f3cio t\u00eam (para variar) a expectativa de lan\u00e7ar o servi\u00e7o no menor prazo poss\u00edvel. Algumas j\u00e1 atuaram em empresas que forneciam servi\u00e7os semelhantes, por isso, tem bom conhecimento do que funciona e n\u00e3o funciona na \u00e1rea.<\/p>\n<p>As principais <em>features<\/em> do servi\u00e7o, segundo descrito pelas pessoas do neg\u00f3cio, s\u00e3o:<\/p>\n<ol>\n<li>Encurtar URLs; ou seja, fornecida uma URL longa pelo usu\u00e1rio, gerar uma URL muito menor.<\/li>\n<li>Redirecionamento r\u00e1pido; ou seja, acessada uma URL encurtada, gerada pela plataforma, redirecionar o usu\u00e1rio para a URL original<\/li>\n<\/ol>\n<hr \/>\n<p>Infere-se, por caracter\u00edsticas do que se est\u00e1 oferencendo, que os atributos <span style=\"text-decoration: underline;\">disponibilidade<\/span>, <span style=\"text-decoration: underline;\">escalabilidade<\/span> e <span style=\"text-decoration: underline;\">resili\u00eancia<\/span> s\u00e3o aqueles que se destacam.<\/p>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">Atributos de qualidade<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Disponibilidade, escalabilidade e resili\u00eancia s\u00e3o tr\u00eas atributos de qualidade. Quer relembrar o conceito? Consulte agora o t\u00f3pico onde o explicamos.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/volume-1\/definindo-arquitetura-de-software-e-o-papel-do-arquiteto\/#A_estrategia_na_arquitetura_de_software\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong><span style=\"text-decoration: underline;\">N\u00c3O<\/span><\/strong> h\u00e1 expectativa de gerar estat\u00edsticas, permitir altera\u00e7\u00e3o ou exclus\u00e3o de URLs inseridas na plataforma, tampouco permitir customiza\u00e7\u00e3o das URLs geradas.<\/p>\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Defini\u00e7\u00e3o: Requisito inverso<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><strong>Requisito Inverso \u00e9 uma descri\u00e7\u00e3o para demandas em uma especifica\u00e7\u00e3o de escopo negativo, <\/strong>ou seja, de algo que n\u00e3o ser\u00e1 feito ou ou expectativa que n\u00e3o ser\u00e1 atendida.<\/p>\r\n<\/div>\n<p>Estimam-se 10 milh\u00f5es de novas URLs sendo encurtadas diariamente. O formato da URL encurtada dever\u00e1 ser <code>www.abc.com\/&lt;id&gt;<\/code>. Sendo que a parte <code>id<\/code> deve ser uma cadeia o mais curta poss\u00edvel compostas por n\u00fameros (0-9) e letras (a-z, A-Z).<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> N\u00e3o \u00e9 poss\u00edvel discutir escalabilidade e disponibilidade com nenhuma estimativa relacionada a <em>workloads<\/em>.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Algumas estimativas de &#8220;papel de p\u00e3o&#8221;<\/h2>\n<p>Com base nas informa\u00e7\u00f5es levantadas com o neg\u00f3cio, em nosso cen\u00e1rio fict\u00edcio, \u00e9 poss\u00edvel elaborar algumas estimativas, grosseiras, mas j\u00e1 suficientes para orientar algumas decis\u00f5es de <em>design.<\/em><\/p>\n<p>A ideia n\u00e3o \u00e9, necessariamente, chegar a precis\u00e3o decimal, mas &#8220;compartilhar a vis\u00e3o&#8221; de n\u00fameros mais tang\u00edveis e come\u00e7ar a estabelecer restri\u00e7\u00f5es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4141 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao.png\" alt=\"\" width=\"727\" height=\"223\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao.png 1136w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-300x92.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-1024x314.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-768x235.png 768w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/><\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> A propor\u00e7\u00e3o de 10 para 1 em opera\u00e7\u00f5es de leitura e grava\u00e7\u00e3o \u00e9 uma refer\u00eancia segura, embora conservadora, para a maioria dos cen\u00e1rios. Serve, pelo menos, como um bom ponto de partida.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Eventualmente, \u00e9 interessante discutir com o neg\u00f3cio sobre poss\u00edveis sazonalidades, como hor\u00e1rios com volumes de uso mais altos.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Pessoas do &#8220;neg\u00f3cio&#8221; t\u00eam tremenda validade de &#8220;apontar os n\u00fameros&#8221;. Da\u00ed, a import\u00e2ncia de criar um referencial, mesmo que impreciso, como ponto de partida, buscando obviamente aprimor\u00e1-los com o andamento do projeto.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Para come\u00e7ar a dimensionar infra, \u00e9 importante considerar que os recursos alocados podem estar &#8220;consumidos&#8221; at\u00e9 80% durante a execu\u00e7\u00e3o para evitar riscos de exaust\u00e3o.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Sempre explicite desdobramentos associados a carga de trabalho que est\u00e1 sendo projetada. Isso facilita no alinhamento do time e no estabelecimento de <em>fitness functions<\/em>.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>A partir da carga identificada, \u00e9 poss\u00edvel determinar algumas <em>fitness functions.\u00a0<\/em><\/p>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">Architectural fitness function<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Architectural fitness functions s\u00e3o fundamentais para o desenvolvimento de arquiteturas evolutivas. Relembre o conceito<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem\/#Evolvability_e_Architectural_Fitness_Functions\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>E as integra\u00e7\u00f5es?<\/h2>\n<p>Raramente um software ir\u00e1 funcionar de forma isolada e independente, como uma ilha. <strong>Integra\u00e7\u00f5es, muitas vezes, s\u00e3o necess\u00e1rias para que o software atenda os objetivos de neg\u00f3cios.<\/strong> U<strong>m modelo alto n\u00edvel de quais integra\u00e7\u00f5es s\u00e3o necess\u00e1rias \u00e9 um \u00f3timo ponto de partida, para abrir um di\u00e1logo com o time de neg\u00f3cios.<\/strong><\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Utilizar uma ADL pode auxiliar a comunica\u00e7\u00e3o com o time de neg\u00f3cio. Uma modelagem de <em>System Context<\/em> da nota\u00e7\u00e3o C4 <em>model<\/em> \u00e9 um \u00f3timo ponto de partida!<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Planejar as integra\u00e7\u00f5es \u00e9 algo cr\u00edtico, n\u00e3o raro softwares apresentam instabilidades por falhas na integra\u00e7\u00e3o com outros sistemas. Buscar uma vis\u00e3o mais clara das integra\u00e7\u00f5es, pode levar ao refinamento dos objetivos de neg\u00f3cio, restri\u00e7\u00f5es e atributos de qualidade.<\/p>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">Integrando sistemas de software<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Sejam as integra\u00e7\u00f5es expl\u00edcitas, com esfor\u00e7o de desenvolvimento do time para fazer com que ela aconte\u00e7a, ou impl\u00edcitas, acontecendo a revelia e gerando apenas dificuldade para evolu\u00e7\u00e3o, as integra\u00e7\u00f5es s\u00e3o aspecto cr\u00edtico da arquitetura de qualquer software.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/integrando-sistemas-de-software\/#Aspectos_arquiteturais_relevantes_em_integracoes\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Adicionar uma perspectiva de integra\u00e7\u00f5es no documento de <em>Haiku<\/em>, produz novas linhas de questionamento junto ao time de neg\u00f3cio a fim de validar a solu\u00e7\u00e3o. Por exemplo,\u00a0 ao explicitar as integra\u00e7\u00f5es percebe-se que o software proposto tem como objetivo ser um servi\u00e7o interno da plataforma atual e deveria se integrar com outros &#8220;servi\u00e7os&#8221; existentes. Considerando esta hip\u00f3tese, o time pode conduzir uma nova proposta de solu\u00e7\u00e3o avaliando ferramentas existentes no mercado.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> O papel do arquiteto \u00e9 garantir que a solu\u00e7\u00e3o proposta atenda os objetivos de neg\u00f3cio, respeite as restri\u00e7\u00f5es, atenda atributos de qualidade com o menor custo ou risco. Ou seja, algumas vezes &#8220;comprar&#8221; pode ser mais adequado do que desenvolver em casa!<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Organizando informa\u00e7\u00f5es para gerar as primeiras ADRs<\/h2>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">Architecture Decision Record<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">O bom arquiteto garante que decis\u00f5es sejam tomadas, justificadas e comunicadas! Precisa relembrar o que \u00e9 uma ADR? Visite o t\u00f3pico onde introduzimos o conceito.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/volume-1\/documentacao-arquitetural-na-medida-certa\/#Consideracoes_sobre_ADRs_Architecture_Decision_Records\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>A partir das informa\u00e7\u00f5es obtidas para formula\u00e7\u00e3o do <em>Haiku<\/em> e dos &#8220;n\u00fameros no papel de p\u00e3o&#8221;, j\u00e1 \u00e9 poss\u00edvel indicar algumas ADRs em status de &#8220;aberta para discuss\u00e3o&#8221;. Essas ADRs indicariam a &#8220;inclina\u00e7\u00e3o arquitetural&#8221; para diversos aspectos importantes, possibilitando debates com especialistas.<\/p>\n<h4>Endpoints<\/h4>\n<p>Parece ser adequado desenvolver o servi\u00e7o como uma API REST. Destacam-se dois <em>endpoints<\/em> principais.<\/p>\n<ol>\n<li>Encurtamento de URL com <code>POST www.abc.com\/shorten?url=&lt;long-url&gt;<\/code><\/li>\n<li>Redirecionamento com <code>GET www.abc.com\/&lt;short-url&gt;<\/code><\/li>\n<\/ol>\n<h4>Redirecionamentos<\/h4>\n<p>H\u00e1 duas op\u00e7\u00f5es b\u00e1sicas de redirecionamento em HTTP:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/HTTP\/Status\/301\">Status code 301<\/a> &#8211; indicando que o recurso endere\u00e7ado pela URL solicitada foi movido <span style=\"text-decoration: underline;\">permanentemente<\/span> para um novo endere\u00e7o;<\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/HTTP\/Status\/302\">Status code 302<\/a> &#8211; indicado que o recurso endere\u00e7ado pela URL solicitada foi movido\u00a0<span style=\"text-decoration: underline;\">temporariamente<\/span> para um novo endere\u00e7o<\/li>\n<\/ul>\n<hr \/>\n<p>Retornar 301 \u00e9, de longe, a forma mais econ\u00f4mica de implementar o redirecionamento, afinal, evitar\u00e1 que os servidores do servi\u00e7o sejam acionados desnecessariamente, uma vez que o\u00a0<em>browser\u00a0<\/em>cliente dever\u00e1 promover o redirecionamento sozinho.<\/p>\n<p>Retornar 302, por outro lado, n\u00e3o diminui a quantidade de acionamentos, mas habilita fazer\u00a0<em>tracking\u00a0<\/em>de acesso e gerar estat\u00edsticas (algo desnecess\u00e1rio, conforme o neg\u00f3cio)<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Sempre valide com o neg\u00f3cio o que est\u00e1 indicado nas expectativas antes de tomar decis\u00f5es que sejam absolutamente dif\u00edceis de reverter.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Pelo indicado, at\u00e9 aqui, nas informa\u00e7\u00f5es de neg\u00f3cio, o retorno mais adequado \u00e9 301.<\/p>\n<h4>Tamanho da chave para URLs encurtadas<\/h4>\n<p>Cada URL longa dever\u00e1 ser submetida a uma fun\u00e7\u00e3o de <em>hashing\u00a0<\/em>capaz de gerar uma chave encurtada. Essa chave poder\u00e1 ser composta por n\u00fameros (0-9) e letras (a-z, A-Z), totalizando 62 poss\u00edveis caracteres.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4145\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/comprimento_hash.png\" alt=\"\" width=\"446\" height=\"255\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/comprimento_hash.png 598w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/comprimento_hash-300x172.png 300w\" sizes=\"(max-width: 446px) 100vw, 446px\" \/><\/p>\n<p>Em an\u00e1lise simples, chaves com 6 caracteres de comprimento seriam mais que suficientes para acomodar o per\u00edodo estimado de opera\u00e7\u00e3o. Entretanto, 7 caracteres seriam suficientes para a eternidade.<\/p>\n<h4>Estrat\u00e9gia para gera\u00e7\u00e3o da chave<\/h4>\n<p>Sabendo-se o tamanho adequado da chave (6 ou 7 caracteres) \u00e9 interessante determinar qual seria a estrat\u00e9gia para gera\u00e7\u00e3o da chave.<\/p>\n<p><strong>Uma primeira abordagem poss\u00edvel seria utilizar algum algoritmo de <em>hashing<\/em> como CRC32 ou MD5.<\/strong> O problema \u00e9 que ambos geram sa\u00eddas com mais de 7 caracteres (CRC32 tem 8 caracteres e MD5 tem 32 caracteres), demandando alguma estrat\u00e9gia de corte.<\/p>\n<p>Al\u00e9m disso, h\u00e1 riscos de colis\u00f5es. Ou seja, duas URLs gerando chaves id\u00eanticas (risco significativamente ampliado com o necessidade de corte). Na pr\u00e1tica, o uso de\u00a0<em>hashing\u00a0<\/em>implica em &#8220;idas e voltas&#8221; ao banco para detecter chaves j\u00e1 utilizadas em consultas potencialmente onerosas, eventualmente minimizadas pela ado\u00e7\u00e3o de t\u00e9cnicas como <em>Bloom Filters<\/em>.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Bloom Filter<\/p>\r\n<\/p>\n<p>Um\u00a0<strong>Bloom Filter<\/strong>\u00a0\u00e9 uma estrutura de dados probabil\u00edstica, que demanda pouqu\u00edssimo espa\u00e7o, concebida por\u00a0<a href=\"https:\/\/en.wikipedia.org\/w\/index.php?title=Burton_Howard_Bloom&amp;action=edit&amp;redlink=1\">Burton Howard Bloom<\/a>\u00a0em 1970.<strong>\u00a0Ela \u00e9 utilizada para testar se um elemento est\u00e1 presente em um conjunto sem necessitar consultar a lista completa de elementos presente nesse conjunto.<\/strong><\/p>\n<p>Eventualmente, a estrutura pode apontar um falso positivo (indicando que um elemento est\u00e1 em um conjunto quando, na verdade, n\u00e3o est\u00e1). Entretanto, jamais gera um falso negativo.<\/p>\n<p>Quanto mais elementos s\u00e3o adicionados a uma Bloom filter, maiores s\u00e3o as chances de um falso positivo.<\/p>\n<p><\/div>\n<p><strong>Outra alternativa \u00e9 utilizar o \u00edndice inteiro, auto-incrementado, para gerar chaves atrav\u00e9s de convers\u00e3o usando <em>base62 <\/em>(aderente a quantidade de caracteres suportados).<\/strong> A obten\u00e7\u00e3o dos \u00edndices cont\u00ednuos sem gerar gargalos em um sistema distribu\u00eddo poderia acontecer pela ado\u00e7\u00e3o da t\u00e9cnica como HiLo.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">HiLo<\/p>\r\n<\/p>\n<p>HiLo \u00e9 uma t\u00e9cnica extremamente eficiente para gerar sequ\u00eancias num\u00e9ricas, sem riscos de colis\u00e3o, em ambientes distribu\u00eddos.<\/p>\n<p>Nessa t\u00e9cnica &#8220;clientes&#8221; HiLo solicitam para um servidor um intervalo de identificadores, por exemplo [0-32] que n\u00e3o ser\u00e1 mais fornecido em qualquer futura requisi\u00e7\u00e3o.\u00a0 Caber\u00e1 ao servidor, manter controle dos intervalos fornecidos.<\/p>\n<p>Com posse do intervalo, um &#8220;cliente&#8221; HiLo poder\u00e1 utilizar seus elementos com seguran\u00e7a.<\/p>\n<p><\/div>\n<p><strong>Entre as duas abordagens, a melhor solu\u00e7\u00e3o parece ser aquela que utiliza \u00edndices auto-incrementados.<\/strong><\/p>\n<h4>Caching<\/h4>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Toda vez que escalabilidade figurar entre os principais atributos de qualidade de um sistema, deve-se considerar a utiliza\u00e7\u00e3o de <em>caching.<\/em><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Como a expectativa de que a propor\u00e7\u00e3o de leituras e grava\u00e7\u00f5es \u00e9 de 10 para 1, faz sentido considerar a ado\u00e7\u00e3o de estrat\u00e9gias de <em>caching<\/em>. Aparentemente, a melhor solu\u00e7\u00e3o aparenta ser\u00a0<em>caching\u00a0<\/em>distribu\u00eddo, eventualmente recorrendo a alguma solu\u00e7\u00e3o de borda.<\/p>\n<h4>Estilo arquitetural e principais tecnologias candidatas<\/h4>\n<strong>Todas as ADRs identificadas at\u00e9 aqui parecem ser favor\u00e1veis a arquiteturas modernas, usando fun\u00e7\u00f5es (FaaS).<\/strong> Na plataforma da Microsoft, isso pode ser feito com Azure Functions. Na plataforma da AWS, faz sentido considerar AWS Lambdas.\n<hr \/>\nA natureza n\u00e3o relacional, pelo menos aparente, dos dados parece recomendar uma solu\u00e7\u00e3o NoSQL baseada em chave-valor.\n<h2>Pontos que ainda necessitam reflex\u00e3o<\/h2>\n<p><strong>O processo de elabora\u00e7\u00e3o da arquitetura deve ser incremental.<\/strong> T\u00e3o importante quanto relacionar decis\u00f5es realizadas \u00e9 indicar claramente o que ainda precisa ser ponderado.<\/p>\nCom rela\u00e7\u00e3o ao design de um encurtador de URLs \u00e9 importante, ainda, considerar:\n<hr \/>\n<ul>\n<li><em>Rate Limiting<\/em>, visando mitigar o risco potencial de usu\u00e1rios mal-intencionados enviarem um n\u00famero esmagadoramente grande de solicita\u00e7\u00f5es de encurtamento de URL.<\/li>\n<li>Escalabilidade para banco de dados e aplica\u00e7\u00e3o, afinal, at\u00e9 aqui, consideramos apenas o caminho mais f\u00e1cil que seria utilizando FaaS.<\/li>\n<\/ul>\n<h2>Proposta inicial de solu\u00e7\u00e3o<\/h2>\n<p>Com base nas informa\u00e7\u00f5es elementares do Haiku e das ADRs, uma boa proposi\u00e7\u00e3o de <em>design<\/em> para implementa\u00e7\u00e3o, suficiente para iniciar as discuss\u00f5es, seria a indicada no diagrama abaixo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4159\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/url_shortener.jpeg\" alt=\"\" width=\"1280\" height=\"602\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/url_shortener.jpeg 1280w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/url_shortener-300x141.jpeg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/url_shortener-1024x482.jpeg 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/url_shortener-768x361.jpeg 768w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/p>\nUm aspecto interessante \u00e9 a utiliza\u00e7\u00e3o, ou n\u00e3o, do DAX (uma esp\u00e9cie de <strong>cache\u00a0<\/strong>para o DynamoDB). Os limites de escala indicados acima seriam suportados pelo banco. Simples incremento de custo?\n<p>No diagrama abaixo, uma proposta de solu\u00e7\u00e3o usando Azure.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4206 size-full\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/azure_.jpeg\" alt=\"\" width=\"1280\" height=\"643\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/azure_.jpeg 1280w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/azure_-300x151.jpeg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/azure_-1024x514.jpeg 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/azure_-768x386.jpeg 768w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/p>\n<h2>Takeaways<\/h2>\n<p>A elabora\u00e7\u00e3o desse &#8220;in\u00edcio de trabalho arquitetural&#8221; para um &#8220;encurtador de URLs&#8221; permite algumas li\u00e7\u00f5es importantes:<\/p>\n<ol>\n<li>Mesmo solu\u00e7\u00f5es muito simples se tornam desafiadoras quando envolvem suporte a escala.<\/li>\n<li>Pensar a arquitetura fica muito mais simples quando par\u00e2metros abstratos, como desempenho e escala, s\u00e3o explicitados em n\u00fameros (mesmo que &#8220;de papel de p\u00e3o&#8221;).<\/li>\n<li>Sempre h\u00e1 mais de uma alternativa para resolver um problema arquitetural e, consequentemente, <em>trade-offs<\/em>.<\/li>\n<li>Conhecer boas estruturas\/estrat\u00e9gias de dados (como Bloom Filters e HiLo) podem ajudar a viabilizar algumas propostas de design.<\/li>\n<li>Em tempos de &#8220;nuvem&#8221;, uma primeira boa &#8220;arquitetura de solu\u00e7\u00e3o&#8221; serve como ponto de partida para discuss\u00f5es mais profundas.<\/li>\n<\/ol>\n<hr \/>\n<p>D\u00favidas ou sugest\u00f5es? Deixe suas contribui\u00e7\u00f5es nos coment\u00e1rios.<\/p>\n","protected":false},"featured_media":4236,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[62],"apendices":[],"capitulos":[50],"class_list":["post-4375","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-secao-4","capitulos-capitulo-4-1"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cap 4.1 Iniciando o design arquitetural de um &quot;encurtador de URLs&quot; - Manual do Arquiteto de Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cap 4.1 Iniciando o design arquitetural de um &quot;encurtador de URLs&quot; - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Conhecimento, ganha-se estudando. Entendimento, ganha-se refletindo sobre algo estudado. Sabedoria, ganha-se com a pr\u00e1tica. Nesse cap\u00edtulo, usaremos alguns dos conceitos discutidos nesse livro para iniciar a elabora\u00e7\u00e3o do design arquitetural de um encurtador de URLs. Iremos tratar, obviamente de um cen\u00e1rio fict\u00edcio. O que \u00e9 um &#8220;Encurtador de URLs&#8221; URLs longas s\u00e3o mais dif\u00edceis de [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-28T13:46:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"338\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/\",\"name\":\"Cap 4.1 Iniciando o design arquitetural de um \\\"encurtador de URLs\\\" - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg\",\"datePublished\":\"2022-05-24T18:16:23+00:00\",\"dateModified\":\"2025-04-28T13:46:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg\",\"width\":600,\"height\":338},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cap 4.1 Iniciando o design arquitetural de um &#8220;encurtador de URLs&#8221;\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cap 4.1 Iniciando o design arquitetural de um \"encurtador de URLs\" - Manual do Arquiteto de Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/","og_locale":"pt_BR","og_type":"article","og_title":"Cap 4.1 Iniciando o design arquitetural de um \"encurtador de URLs\" - Manual do Arquiteto de Software","og_description":"Conhecimento, ganha-se estudando. Entendimento, ganha-se refletindo sobre algo estudado. Sabedoria, ganha-se com a pr\u00e1tica. Nesse cap\u00edtulo, usaremos alguns dos conceitos discutidos nesse livro para iniciar a elabora\u00e7\u00e3o do design arquitetural de um encurtador de URLs. Iremos tratar, obviamente de um cen\u00e1rio fict\u00edcio. O que \u00e9 um &#8220;Encurtador de URLs&#8221; URLs longas s\u00e3o mais dif\u00edceis de [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2025-04-28T13:46:35+00:00","og_image":[{"width":600,"height":338,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/","name":"Cap 4.1 Iniciando o design arquitetural de um \"encurtador de URLs\" - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg","datePublished":"2022-05-24T18:16:23+00:00","dateModified":"2025-04-28T13:46:35+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg","width":600,"height":338},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"Cap 4.1 Iniciando o design arquitetural de um &#8220;encurtador de URLs&#8221;"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/4375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=4375"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/4236"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=4375"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4375"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4375"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4375"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}