{"id":4314,"date":"2022-05-22T15:57:15","date_gmt":"2022-05-22T18:57:15","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4314"},"modified":"2024-01-12T18:21:09","modified_gmt":"2024-01-12T21:21:09","slug":"iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/","title":{"rendered":"Cap 4.3 Iniciando o design arquitetural de um &#8220;servi\u00e7o para compartilhar atualiza\u00e7\u00f5es&#8221; (como o Twitter)"},"content":{"rendered":"<p><strong>Quase todas as plataformas sociais tem como funcionalidade principal o compartilhamento de atualiza\u00e7\u00f5es entre &#8220;amigos&#8221; ou &#8220;seguidos e seguidores&#8221;.<\/strong> Sejam com fotos, no Instagram, micro postagens, no Twitter, ou novidades do cotidiano, no Facebook, quase todas as redes sociais funcionam no entorno de uma\u00a0<em>timeline.<\/em><\/p>\n<p><strong>Nesse cap\u00edtulo, vamos utilizar alguns dos conceitos discutidos nesse livro para &#8220;pensar a arquitetura&#8221; de um sistema para compartilhamento de atualiza\u00e7\u00f5es.<\/strong> Nosso objetivo n\u00e3o vai ser fazer uma proposta completa, tampouco definitiva, mas &#8220;aquecer os motores&#8221;. Obviamente, iremos trabalhar um um cen\u00e1rio fict\u00edcio (afinal, precisamos de algumas delimita\u00e7\u00f5es para nossa solu\u00e7\u00e3o).<\/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<p><strong>Em nosso cen\u00e1rio fict\u00edcio, nosso desafio \u00e9 gerar um sistema para compartilhamento de atualiza\u00e7\u00f5es, como o Twitter. <\/strong>Esse servi\u00e7o dever\u00e1 ser consumido tanto por aplica\u00e7\u00f5es <em>web <\/em>quanto <em>mobile.<\/em><\/p>\n<p>Em alto n\u00edvel, o sistema deve permitir aos seus usu\u00e1rios compartilhar atualiza\u00e7\u00f5es que dever\u00e3o ficar vis\u00edveis para seus &#8220;seguidores&#8221;. Tamb\u00e9m deve permitir aos usu\u00e1rios &#8220;seguir&#8221; outros usu\u00e1rios. N\u00e3o \u00e9 necess\u00e1rio haver reciprocidade (a rela\u00e7\u00e3o \u00e9 de seguido\/seguidores e n\u00e3o de amizades).<\/p>\n<p>Cada usu\u00e1rio dever\u00e1 ter acesso a um\u00a0<em>timeline\u00a0<\/em>de suas pr\u00f3prias atualiza\u00e7\u00f5es. Al\u00e9m disso, dever\u00e1 ter acesso a uma\u00a0<em>timeline\u00a0<\/em>combinando as atualiza\u00e7\u00f5es de seus &#8220;seguidos&#8221; e as pr\u00f3prias. Todas as\u00a0<em>timelines\u00a0<\/em>devem apresentar as atualiza\u00e7\u00f5es em ordem cronol\u00f3gica inversa.<\/p>\n<p>N\u00e3o h\u00e1 limites para o n\u00famero de seguidores para um determinado usu\u00e1rio. Tampouco h\u00e1 restri\u00e7\u00f5es para a quantidade de usu\u00e1rios cada membro da plataforma poder\u00e1 seguir.<\/p>\n<p>As atualiza\u00e7\u00f5es dever\u00e3o ser apenas texto (restrito a 500 caracteres) e <em>links<\/em>.<\/p>\n<p><strong>Estima-se 5 milh\u00f5es DAU (<em>daily active users<\/em>). Estimam-se 2 milh\u00f5es de atualiza\u00e7\u00f5es, com 150 caracteres em m\u00e9dia, todos os dias<\/strong>. A taxa entre leituras (recupera\u00e7\u00e3o de atualiza\u00e7\u00f5es) e grava\u00e7\u00f5es (inser\u00e7\u00e3o de novas atualiza\u00e7\u00f5es) \u00e9 de 600 para 1.<\/p>\n<p>Os atributos de qualidade associados a este servi\u00e7o s\u00e3o, em ordem de import\u00e2ncia: disponibilidade, escalabilidade e desempenho. Consist\u00eancia, embora desej\u00e1vel, poder\u00e1 ser eventual.<\/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;\">Twitter em n\u00fameros<\/p>\r\n<\/p>\n<p>Estima-se, hoje, que o Twitter possui:<\/p>\n<ul>\n<li>217 milh\u00f5es DAU.<\/li>\n<li>500 milh\u00f5es de tu\u00edtes por dia.<\/li>\n<li>391 milh\u00f5es de usu\u00e1rios n\u00e3o tem seguidores<\/li>\n<li>30% dos usu\u00e1rios do twitter afirmam acessar acessar a plataforma mais do que uma vez diariamente<\/li>\n<li>44% de todos os usu\u00e1rios do Twitter nunca compartilharam um tu\u00edte.<\/li>\n<\/ul>\n<hr \/>\n<p>Fonte: <a href=\"https:\/\/www.omnicoreagency.com\/twitter-statistics\/\">omnicoreagency.com\/twitter-statistics\/<\/a><\/p>\n<p><\/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 fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-4322 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-1.png\" alt=\"\" width=\"741\" height=\"271\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-1.png 1192w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-1-300x110.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-1-1024x375.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/papel_de_pao-1-768x281.png 768w\" sizes=\"(max-width: 741px) 100vw, 741px\" \/><\/p>\n<p>Os n\u00fameros levantados aqui mostram que estamos lidando com grandes volumes de dados e com uma desproporcionalidade relevante entre os n\u00fameros de leituras e grava\u00e7\u00f5es.<\/p>\n<h2>Explicitando as principais <em>features<\/em><\/h2>\n<p>O arquiteto de software deve ser, essencialmente, um orquestrador. Como tal, sua principal atribui\u00e7\u00e3o \u00e9 promover alinhamento de prop\u00f3sitos de maneira a gerar autonomia de atua\u00e7\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 loading=\"lazy\" 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 sistemas grandes e potencialmente complexos, \u00e9 importante explicitar quais s\u00e3o as principais funcionalidades e garantir que todos estejam alinhados quanto a isso.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>No nosso cen\u00e1rio fict\u00edcio, as principais funcionalidades s\u00e3o:<\/p>\n<ol>\n<li>Permitir que usu\u00e1rios compartilhem atualiza\u00e7\u00f5es;<\/li>\n<li>Fornecer <em>timelines <\/em>com as atualiza\u00e7\u00f5es de cada usu\u00e1rio, individualmente;<\/li>\n<li>Permitir que usu\u00e1rios <em>sigam<\/em> outros outros usu\u00e1rios;<\/li>\n<li>Fornecer timelines para cada usu\u00e1rio (<em>follower<\/em>) combinando as atualiza\u00e7\u00f5es compartilhadas pelos usu\u00e1rios que eles seguem.<\/li>\n<\/ol>\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4316 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/twitter.png\" alt=\"\" width=\"633\" height=\"213\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/twitter.png 1266w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/twitter-300x101.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/twitter-1024x345.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/twitter-768x258.png 768w\" sizes=\"(max-width: 633px) 100vw, 633px\" \/><\/p>\n<p>H\u00e1 importantes omiss\u00f5es nessa lista! N\u00e3o h\u00e1 men\u00e7\u00e3o para dete\u00e7\u00e3o de <em>trends\u00a0<\/em>ou composi\u00e7\u00e3o de <em>timelines\u00a0<\/em>para <em>hashtags<\/em>.<\/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 loading=\"lazy\" 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\" \/> Eventualmente, podem ocorrer discord\u00e2ncias sobre &#8220;o que \u00e9 mas importante&#8221;. Produzir consenso evita desgastes futuros, durante a execu\u00e7\u00e3o (onde geralmente tempo e or\u00e7amento se tornam escassos).<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Proposta ing\u00eanua de\u00a0<em>design\u00a0<\/em>arquitetural<\/h2>\n<p>Inicialmente, a solu\u00e7\u00e3o para todas as principais <em>features\u00a0<\/em>do sistema parece ser trivial. O modelo de dados para acomodar as informa\u00e7\u00f5es \u00e9 simples e a elabora\u00e7\u00e3o das consultas necess\u00e1rias parece demandar apenas conhecimentos b\u00e1sicos de SQL.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4318 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_simple.png\" alt=\"\" width=\"832\" height=\"129\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_simple.png 1456w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_simple-300x47.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_simple-1024x159.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_simple-768x119.png 768w\" sizes=\"(max-width: 832px) 100vw, 832px\" \/><\/p>\n<p>Entretanto, \u00e9 importante reconhecer que os volumes de dados e &#8220;potenciais&#8221; <em>scans\u00a0<\/em>na tabela <code>Updates<\/code> s\u00e3o restri\u00e7\u00f5es evidentes.<\/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 loading=\"lazy\" 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 escala &#8220;quebra&#8221; tudo! Invariavelmente, qualquer solu\u00e7\u00e3o de <em>design\u00a0<\/em>arquitetural precisar\u00e1 ser revista, em algum momento, devido a mudan\u00e7as de escala.<\/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\/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 do &#8220;<em>design<\/em> de alto n\u00edvel&#8221;, j\u00e1 \u00e9 poss\u00edvel indicar algumas ADRs com status de &#8220;aberta para discuss\u00e3o&#8221;. Essas ADRs indicariam a &#8220;inclina\u00e7\u00e3o arquitetural&#8221; para diversos aspectos importantes, possibilitando debates entre especialistas.<\/p>\n<h4>Demanda por <em>sharding<\/em><\/h4>\n<p>Os volumes de dados associados as atualiza\u00e7\u00f5es torna evidente a ado\u00e7\u00e3o de alguma estrat\u00e9gia para particionamento horizontal das bases de dados.<\/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: Sharding<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><\/p>\n<p>Um <em>shard<\/em> \u00e9 uma parti\u00e7\u00e3o horizontal de dados em um banco de dados ou mecanismo de pesquisa. Cada <em>shard<\/em> \u00e9 mantido em uma inst\u00e2ncia de servidor de banco de dados separada, visando distribuir a carga de trabalho.<\/p>\n<p><\/p>\r\n<\/div>\n<p>Tal demanda implica no planejamento de alguma t\u00e9cnica para <em>consistent hashing.<\/em><\/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: Consistent Hashing<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><\/p>\n<p><em>Consistent Hashing\u00a0<\/em>\u00e9 uma t\u00e9cnica especial que permite o redimensionamento da infraestrutura de armazenamento (por exemplo, tamanho de uma <em>hash\u00a0<\/em><em>table<\/em> ou cluster de banco de dados) com um m\u00ednimo de remapeamentos (deslocamento entre\u00a0<em>slots<\/em>).<\/p>\n<p><\/p>\r\n<\/div>\n<h4>Demanda por <em>caching<\/em><\/h4>\n<p>A propor\u00e7\u00e3o entre leituras e grava\u00e7\u00f5es (600:1) n\u00e3o deixa d\u00favidas de que o servi\u00e7o \u00e9 <em>read-intensive<\/em>, logo, ideal para uso de\u00a0<em>caching.<\/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;\">Considera\u00e7\u00f5es fundamentais sobre caching<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Imposs\u00edvel falar sobre escalabilidade sem ponderar sobre a ado\u00e7\u00e3o intensiva de <em>caching<\/em>. Em d\u00favidas sobre o conceito? Leia novamente o t\u00f3pico onde discutimos o assunto.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-2-2-v-3-0\/#Consideracoes_fundamentais_sobre_caching\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Sistemas de bases de dados podem ser utilizadas para criar uma &#8220;mem\u00f3ria&#8221; de longo prazo para o registro das intera\u00e7\u00f5es. Entretanto, o segredo para a disponibilidade estar\u00e1 na &#8220;pr\u00e9-computa\u00e7\u00e3o&#8221;.<\/p>\n<div class=\"nota-youtube\">\r\n<table class=\"tabelayoutube\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-youtube-coluna-1\" valign=\"top\"><img loading=\"lazy\" decoding=\"async\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/><\/td>\r\n<td class=\"nota-youtube-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/>\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Scaling Redis at Twitter<\/p>\r\nO Twitter utiliza <a href=\"https:\/\/redis.io\/\">Redis<\/a> como principal mecanismo de <em>caching<\/em> para a constru\u00e7\u00e3o de suas <em>timelines<\/em>.<\/p>\n<hr \/>\n<p>Nesse v\u00eddeo, <a href=\"https:\/\/www.linkedin.com\/in\/yaoyue-%E5%B2%B3%E5%B3%A3\/\">Yao Yu<\/a> compartilha algumas das li\u00e7\u00f5es aprendidas usando Redis, em escala, no Twitter, desde 2010.\r\n<p><a class=\"botao-youtube\" href=\"https:\/\/www.youtube.com\/watch?v=rP9EKvWt0zo\" target=\"_blank\" rel=\"noopener\" style=\"margin-top: 20px;\">Acessar v\u00eddeo<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Dados dos usu\u00e1rios podem ser mantidos e recuperados em uma estrutura de\u00a0<em>caching\u00a0chave\/valor<\/em> onde a chave \u00e9 o <code>id<\/code> (ex: <code>usr_&lt;id&gt;<\/code>) do usu\u00e1rio. O mesmo pode ser ser dito com rela\u00e7\u00e3o a cada atualiza\u00e7\u00e3o individualmente (ex: <code>upd_&lt;id&gt;<\/code>) .<\/p>\n<p>As listas de &#8220;usu\u00e1rios seguidos&#8221; por cada usu\u00e1rio da plataforma tamb\u00e9m podem ser mantidas no cache, devidamente identificadas (ex: <code>flby_&lt;user_id&gt;<\/code>) .<\/p>\n<p>Tanto as <em>timelines\u00a0<\/em>com atualiza\u00e7\u00f5es por usu\u00e1rio (ex: <code>tl_usr_&lt;user_id&gt;<\/code>), quanto aquelas com a combina\u00e7\u00e3o das atualiza\u00e7\u00f5es de usu\u00e1rios seguidos para cada usu\u00e1rio (ex: <code>tl_home_&lt;user_id&gt;<\/code>), podem ser mantidas como listas de <code>id<\/code>s apontando para atualiza\u00e7\u00f5es &#8220;cacheadas&#8221;.<\/p>\n<p>Para manuten\u00e7\u00e3o de todos os <em>caches\u00a0<\/em>segue &#8220;fluxo de trabalho&#8221; para quando ocorrer o compartilhamento de uma informa\u00e7\u00e3o.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4337 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/what_happens_when_user_shares_an_update.png\" alt=\"\" width=\"181\" height=\"606\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/what_happens_when_user_shares_an_update.png 181w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/what_happens_when_user_shares_an_update-90x300.png 90w\" sizes=\"(max-width: 181px) 100vw, 181px\" \/><\/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 loading=\"lazy\" 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\" \/> Explicite processos relacionados com as principais <em>features <\/em>usando fluxogramas &#8220;f\u00e1ceis de entender&#8221; (n\u00e3o se detenha em detalhes).<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h4>Ado\u00e7\u00e3o de bases NoSQL de grafos para dados de usu\u00e1rios (incluindo seguidores)<\/h4>\n<p>Pesquisas do tipo &#8220;usu\u00e1rios que seguem X e Y, geralmente tamb\u00e9m seguem Y&#8221;, comuns para constru\u00e7\u00e3o de mecanismos de recomenda\u00e7\u00f5es, s\u00e3o incrivelmente desafiadoras em bases de dados relacionais, mas triviais em bases de dados baseadas em grafos.<\/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;\">Cypher<\/p>\r\n<\/p>\n<p><em>Cypher<\/em> \u00e9 a linguagem de consulta de grafos idealizada para o Neo4j.. \u00c9 como o SQL para grafos, e foi inspirado pelo SQL, sendo, tamb\u00e9m, declarativa.<\/p>\n<p>A consulta abaixo, por exemplo, permite encontrar o &#8220;tamanho do menor caminho&#8221; entre os atores Kevin Bacon e Tom Cruise, baseado em pessoas que atuaram com eles em filmes (obviamente, considerando a exist\u00eancia de uma base de dados em grafo com registro dos filmes)<\/p>\n<p><code><br \/>\nMATCH path = shortestPath(<br \/>\n(Bacon:Person {name:\"Kevin Bacon\"})-[*]-(Keanu:Person {name:\"Keanu Reeves\"})<br \/>\n)<br \/>\nRETURN length(path);<br \/>\n<\/code><\/p>\n<p><\/div>\n<p>Considera-se utilizar base de dados como <a href=\"https:\/\/neo4j.com\/\">Neo4J<\/a> como base para dados dos usu\u00e1rios e rela\u00e7\u00f5es sociais (<em>following\/followers<\/em>).<\/p>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-livro-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"https:\/\/images-na.ssl-images-amazon.com\/images\/I\/51YOyRb2EbL._SX379_BO1,204,203,200_.jpg\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-livro-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"https:\/\/images-na.ssl-images-amazon.com\/images\/I\/51YOyRb2EbL._SX379_BO1,204,203,200_.jpg\" alt=\"\" width=\"150\" \/>\r\n<p style=\"font-size: 20px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Graph Algorithms: Practical Examples in Apache Spark and Neo4j<\/p>\r\n&#8220;Entender o mundo&#8221; sob a perspectiva de grafos ajuda a encontrar respostas simples para problemas complexos. Nesse livro, encontra-se uma s\u00e9rie de dicas e <em>insights <\/em>que podem acelerar o entendimento do conceito para a constru\u00e7\u00e3o de solu\u00e7\u00f5es poderosas.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/www.amazon.com.br\/Graph-Algorithms-Mark-Needham\/dp\/1492047686\" target=\"_blank\" rel=\"noopener\">Acessar livro<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h4>Ado\u00e7\u00e3o de <em>fanout\u00a0<\/em>para atualiza\u00e7\u00e3o das <em>timelines<\/em> dos seguidores<\/h4>\n<p>A decis\u00e3o de utilizar <em>caching\u00a0<\/em>de maneira intensiva, inclusive com a pr\u00e9-computa\u00e7\u00e3o das <em>timelines,\u00a0<\/em>introduz desafio para a atualiza\u00e7\u00e3o dessas estruturas.<\/p>\n<p>Toda vez que um usu\u00e1rio resolver compartilhar uma atualiza\u00e7\u00e3o, \u00e9 necess\u00e1rio recuperar sua lista de seguidores para, ent\u00e3o, visitar cada\u00a0<em>timeline\u00a0<\/em>armazenada em\u00a0<em>caching\u00a0<\/em>introduzindo refer\u00eancia para tal atualiza\u00e7\u00e3o.<\/p>\n<h4>Tratamento especial para celebridades<\/h4>\n<p>A decis\u00e3o de realizar\u00a0<em>fanout\u00a0<\/em>para atualizar\u00a0<em>timelines\u00a0<\/em>de seguidores pode ser consideravelmente dispendiosa para usu\u00e1rios com milhares seguidores (por exemplo, 100 mil). Felizmente, usu\u00e1rios &#8220;celebridades&#8221; costumam ser exce\u00e7\u00e3o.<\/p>\n<p>Pode ser prefer\u00edvel n\u00e3o realizar qualquer atualiza\u00e7\u00e3o durante a inclus\u00e3o de uma\u00a0 nova atualiza\u00e7\u00e3o por parte de uma &#8220;celebridade&#8221; fazendo com que dados sejam &#8220;mesclados&#8221; na <em>timeline\u00a0<\/em>de seguidores, sob demanda.<\/p>\n<h4>Tratando usu\u00e1rios inativos<\/h4>\n<p>Uma quantidade consider\u00e1vel dos usu\u00e1rios da plataforma pode se manter inativa por muito tempo. Logo, manter dados relacionados a usu\u00e1rios em mem\u00f3ria pode ser algo &#8220;desnecess\u00e1rio&#8221; e um peso para processos de\u00a0<em>fanout<\/em>.<\/p>\n<p>Deve-se considerar &#8220;descartar&#8221; <em>caching <\/em>de usu\u00e1rios inativos por, por exemplo, mais de 30 dias.<\/p>\n<h2><span id=\"Pontos_que_ainda_necessitam_reflexao\">Pontos que ainda necessitam reflex\u00e3o<\/span><\/h2>\n<p><strong>O processo de elabora\u00e7\u00e3o da arquitetura deve ser incremental.<\/strong>\u00a0T\u00e3o importante quanto relacionar decis\u00f5es realizadas \u00e9 indicar claramente o que ainda precisa ser ponderado.<\/p>\n<p>Com rela\u00e7\u00e3o ao sistema que estamos projetando \u00e9 importante, ainda, considerar:<\/p>\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 atualiza\u00e7\u00f5es.<\/li>\n<li>Processamento de <em>streaming <\/em>das atualiza\u00e7\u00f5es, afim de avaliar tend\u00eancias por <em>hashtags<\/em>.<\/li>\n<\/ul>\n<h2><span id=\"Takeaways\">Takeaways<\/span><\/h2>\n<p>A elabora\u00e7\u00e3o desse \u201cin\u00edcio de trabalho arquitetural\u201d para um \u201cservi\u00e7os de compartilhamento de atualiza\u00e7\u00f5es\u201d permite alguns aprendizados importantes:<\/p>\n<ol>\n<li>Em sistemas complexos, pode ser interessante explicitar a rela\u00e7\u00e3o das principais <em>features <\/em>associadas.<\/li>\n<li>Solu\u00e7\u00f5es triviais para pequenos volumes de dados raramente funcionam em grandes escalas.<\/li>\n<li><em>Caching<\/em> agressivo costuma ser a solu\u00e7\u00e3o para sistemas <em>reading-intensive<\/em>.<\/li>\n<li>Fluxogramas s\u00e3o excelentes ferramentas de comunica\u00e7\u00e3o para\u00a0<em>features\u00a0<\/em>mais complexas.<\/li>\n<li>H\u00e1 diversos &#8220;sabores&#8221; de NoSQL. Invista algum tempo conhecendo-os!<\/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":4363,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[62],"apendices":[],"capitulos":[71],"class_list":["post-4314","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-secao-4","capitulos-capitulo-4-3"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cap 4.3 Iniciando o design arquitetural de um &quot;servi\u00e7o para compartilhar atualiza\u00e7\u00f5es&quot; (como o Twitter) - 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-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cap 4.3 Iniciando o design arquitetural de um &quot;servi\u00e7o para compartilhar atualiza\u00e7\u00f5es&quot; (como o Twitter) - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Quase todas as plataformas sociais tem como funcionalidade principal o compartilhamento de atualiza\u00e7\u00f5es entre &#8220;amigos&#8221; ou &#8220;seguidos e seguidores&#8221;. Sejam com fotos, no Instagram, micro postagens, no Twitter, ou novidades do cotidiano, no Facebook, quase todas as redes sociais funcionam no entorno de uma\u00a0timeline. Nesse cap\u00edtulo, vamos utilizar alguns dos conceitos discutidos nesse livro para [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/\" \/>\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-12T21:21:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.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-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/\",\"name\":\"Cap 4.3 Iniciando o design arquitetural de um \\\"servi\u00e7o para compartilhar atualiza\u00e7\u00f5es\\\" (como o Twitter) - 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-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.jpg\",\"datePublished\":\"2022-05-22T18:57:15+00:00\",\"dateModified\":\"2024-01-12T21:21:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.jpg\",\"width\":600,\"height\":338},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#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.3 Iniciando o design arquitetural de um &#8220;servi\u00e7o para compartilhar atualiza\u00e7\u00f5es&#8221; (como o Twitter)\"}]},{\"@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.3 Iniciando o design arquitetural de um \"servi\u00e7o para compartilhar atualiza\u00e7\u00f5es\" (como o Twitter) - 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-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/","og_locale":"pt_BR","og_type":"article","og_title":"Cap 4.3 Iniciando o design arquitetural de um \"servi\u00e7o para compartilhar atualiza\u00e7\u00f5es\" (como o Twitter) - Manual do Arquiteto de Software","og_description":"Quase todas as plataformas sociais tem como funcionalidade principal o compartilhamento de atualiza\u00e7\u00f5es entre &#8220;amigos&#8221; ou &#8220;seguidos e seguidores&#8221;. Sejam com fotos, no Instagram, micro postagens, no Twitter, ou novidades do cotidiano, no Facebook, quase todas as redes sociais funcionam no entorno de uma\u00a0timeline. Nesse cap\u00edtulo, vamos utilizar alguns dos conceitos discutidos nesse livro para [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-12T21:21:09+00:00","og_image":[{"width":600,"height":338,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.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-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/","name":"Cap 4.3 Iniciando o design arquitetural de um \"servi\u00e7o para compartilhar atualiza\u00e7\u00f5es\" (como o Twitter) - 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-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.jpg","datePublished":"2022-05-22T18:57:15+00:00","dateModified":"2024-01-12T21:21:09+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-3.jpg","width":600,"height":338},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-para-servicos-de-compartilhamento-de-atualizacoes-como-o-twitter\/#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.3 Iniciando o design arquitetural de um &#8220;servi\u00e7o para compartilhar atualiza\u00e7\u00f5es&#8221; (como o Twitter)"}]},{"@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\/4314","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=4314"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/4363"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=4314"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4314"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4314"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4314"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}