{"id":4130,"date":"2022-05-09T19:37:13","date_gmt":"2022-05-09T22:37:13","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4130"},"modified":"2024-01-11T18:04:39","modified_gmt":"2024-01-11T21:04:39","slug":"iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/","title":{"rendered":"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\/documentacao-arquitetural-na-medida-certa-capitulo-1-3-v3-01\/#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\/definindo-arquitetura-de-software-e-o-papel-do-arquiteto-capitulo-0-v3-03a\/#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\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-01\/#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>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\/documentacao-arquitetural-na-medida-certa-capitulo-1-3-v3-01\/#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>POST 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":[],"sessoes":[62],"apendices":[],"capitulos":[50],"class_list":["post-4130","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","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>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-v-1-1\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"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-v-1-1\/\" \/>\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=\"2024-01-11T21:04:39+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=\"10 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-v-1-1\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/\",\"name\":\"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-v-1-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg\",\"datePublished\":\"2022-05-09T22:37:13+00:00\",\"dateModified\":\"2024-01-11T21:04:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/#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-v-1-1\/#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\":\"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":"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-v-1-1\/","og_locale":"pt_BR","og_type":"article","og_title":"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-v-1-1\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T21:04:39+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":"10 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-v-1-1\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/","name":"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-v-1-1\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-capitulo-4-1-1.jpg","datePublished":"2022-05-09T22:37:13+00:00","dateModified":"2024-01-11T21:04:39+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-encurtador-de-urls-v-1-1\/#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-v-1-1\/#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":"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\/4130","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=4130"}],"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=4130"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4130"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4130"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4130"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}