{"id":4245,"date":"2022-05-16T21:42:24","date_gmt":"2022-05-17T00:42:24","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4245"},"modified":"2024-01-12T18:20:35","modified_gmt":"2024-01-12T21:20:35","slug":"iniciando-o-design-arquitetural-de-um-chat-online","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/","title":{"rendered":"Cap 4.2 Iniciando o design arquitetural de um &#8220;chat online&#8221;"},"content":{"rendered":"<strong>H\u00e1 diversas solu\u00e7\u00f5es de <em>chat online\u00a0<\/em>dispon\u00edveis no mercado, com funcionalidades para todos os interesses e pre\u00e7os para todos os bolsos.<\/strong> Mas, se voc\u00ea for &#8220;desafiado&#8221; a criar uma solu\u00e7\u00e3o autoral, \u00e9 bom estar preparado.\n<hr \/>\n<p><strong>Nesse cap\u00edtulo, vamos utilizar alguns dos conceitos discutidos nesse livro para &#8220;pensar a arquitetura&#8221; de um sistema de <em>chat online<\/em>.<\/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>O que \u00e9 um &#8220;<em>chat online<\/em>&#8220;<\/h2>\n<p><strong>Todo mundo gosta de um bom bate-papo, n\u00e3o \u00e9 mesmo?\u00a0<em>Chat online\u00a0<\/em>trata exatamente disso &#8211; conversa, utilizando alguma ferramenta espec\u00edfica para esse prop\u00f3sito.<\/strong><\/p>\n<p>H\u00e1 quem converse por texto, trocar fotos, mensagens de \u00e1udio ou v\u00eddeo. H\u00e1 tamb\u00e9m quem goste de enviar e receber documentos. As conversas online podem ser entre duas pessoas (assumindo que uma parte leia a e responda) ou entre um grupo de pessoas.<\/p>\n<p>Em quase todas as ferramentas para trocas de mensagens voc\u00ea poder\u00e1 manter uma rede de contatos (amigos) e saber quem est\u00e1 <em>online\u00a0<\/em>ou\u00a0<em>offline.<\/em><\/p>\n<p>O ICQ foi uma das ofertas pioneiras desse tipo de aplica\u00e7\u00e3o para <em>chat online<\/em>. Hoje em dia, alguns servi\u00e7os populares s\u00e3o <em>Whatsapp<\/em> e <em>Facebook Messenger.<\/em><\/p>\n<p>Muitas empresas oferecem interfaces de atendimento atrav\u00e9s de servi\u00e7os de mensagens instant\u00e2neas.<\/p>\n<h2>Um instrumento para a transforma\u00e7\u00e3o digital<\/h2>\n<p><strong>Um dos pilares da transforma\u00e7\u00e3o digital \u00e9 estreitar as rela\u00e7\u00f5es das organiza\u00e7\u00f5es com seus clientes, fornecedores e parceiros.<\/strong> Nesse contexto, aplica\u00e7\u00f5es de\u00a0<em>chat\u00a0<\/em>est\u00e3o se tornado cada vez mais populares.<\/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:\/\/transformacao-digital-e-agil.online\/wp-content\/uploads\/2021\/11\/livro-transformacao-digital.png\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-livro-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"https:\/\/transformacao-digital-e-agil.online\/wp-content\/uploads\/2021\/11\/livro-transformacao-digital.png\" alt=\"\" width=\"150\" \/>\r\n<p style=\"font-size: 24px; font-weight: bold; color: #4c4c4c; line-height: 1.0; font-family: Lufga; margin-bottom: 10px;\">Explicando e justificando a transforma\u00e7\u00e3o digital e \u00e1gil<\/p>\r\n<p style=\"font-size: 20px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Lufga; margin-bottom: 10px;\">Transforma\u00e7\u00e3o Digital e \u00c1gil<\/p>\r\nEm d\u00favidas do que \u00e9, de fato, transforma\u00e7\u00e3o digital e \u00e1gil? Nesse cap\u00edtulo, apresento alguns conceitos fundamentais para te ajudar no entendimento desse importante movimento.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/transformacao-digital-e-agil.online\/explicando-e-justificando-a-transformacao-digital-e-agil-introducao-v1-1\/\" target=\"_blank\" rel=\"noopener\">Ler cap\u00edtulo<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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>As funcionalidades em servi\u00e7os de <em>chat online <\/em>variam bastante. Todos os dias, funcionalidades s\u00e3o incorporadas nas solu\u00e7\u00f5es l\u00edderes de mercado visando tornar a comunica\u00e7\u00e3o mais flu\u00edda &#8211; conversas em grupo, rea\u00e7\u00f5es, respostas espec\u00edficas, etc.<\/strong> Em nosso cen\u00e1rio fict\u00edcio, o objetivo \u00e9 fornecer um servi\u00e7o leve de comunica\u00e7\u00e3o 1-para-1 (n\u00e3o haver\u00e1 suporte para grupos, por enquanto), apenas em texto.<\/p>\n<p>Queremos desenvolver uma solu\u00e7\u00e3o autoral, ou seja, sem depender de componentes prontos.<\/p>\n<p>Usu\u00e1rios poder\u00e3o utilizar o servi\u00e7o tanto com clientes <em>web<\/em> ou em aplica\u00e7\u00f5es <em>mobile<\/em>. S\u00e3o esperados 2 milh\u00f5es DAU (<em>daily active users<\/em>). O tamanho m\u00e1ximo de uma mensagem \u00e9 de 100 KB, mas, estima-se que elas tenham um tamanho m\u00e9dio de 100 caracteres. <strong>Todas as mensagens devem ser armazenadas, para sempre, em servidores da organiza\u00e7\u00e3o.<\/strong><\/p>\n<p><strong>Cada usu\u00e1rio poder\u00e1 possuir uma lista de &#8220;amigos&#8221;.<\/strong> O servi\u00e7o dever\u00e1 indicar quais &#8220;amigos&#8221; est\u00e3o <em>online<\/em> em um determinado momento. Caso uma mensagem seja enviada para um &#8220;amigo&#8221;\u00a0<em>offline,\u00a0<\/em>ela dever\u00e1 ser &#8220;guardada&#8221; at\u00e9 que ele possa receber.<\/p>\n<p>Um mesmo usu\u00e1rio poder\u00e1 estar conectado em mais do que um <em>device\u00a0<\/em>simultaneamente.<\/p>\n<p>N\u00e3o h\u00e1 demanda por criptografia (que perigo!).<\/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;\">Confidencialidade, integridade e disponibilidade<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Seguran\u00e7a \u00e9 um tema amplo! Um sistema seguro garante a confidencialidade dos dados dos usu\u00e1rios. Deseja entender mais sobre isso?<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/fundamentos-para-a-arquitetura-de-sistemas-seguros-capitulo-10-v-3-0\/#Desdobrando_seguranca_em_mais_atributos_de_qualidade\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Espera-se que o servi\u00e7o seja escal\u00e1vel e dispon\u00edvel.<\/p>\n<p><strong>O time de &#8220;neg\u00f3cios&#8221; deseja que seja desenvolvido um padr\u00e3o propriet\u00e1rio para implementa\u00e7\u00e3o que ser\u00e1 incorporado como ativo da organiza\u00e7\u00e3o.<\/strong><\/p>\n<h2>Conhecendo arquiteturas semelhantes<\/h2>\n<p><strong>Antes de qualquer tentativa de produzir algum <em>design<\/em> arquitetural \u00e9 importante buscar conhecer implementa\u00e7\u00f5es anteriores para problemas semelhantes.<\/strong><\/p>\n<p>Sabe-se, por exemplo, que o Whatsapp adota uma varia\u00e7\u00e3o, n\u00e3o documentada, de <a href=\"https:\/\/xmpp.org\/\">XMPP<\/a> &#8211; um protocolo extens\u00edvel de presen\u00e7a e troca de mensagens &#8211; em sua solu\u00e7\u00e3o.<\/p>\n<p>Facebook Messenger j\u00e1 adotou XMPP, mas, atualmente, utiliza solu\u00e7\u00e3o propriet\u00e1ria, baseada em <a href=\"https:\/\/mqtt.org\/\">MQTT<\/a> (um protocolo leve para trocas de mensagens, bastante popular em IoT).<\/p>\n<p>O Telegram utiliza um protocolo tamb\u00e9m propriet\u00e1rio, por\u00e9m documentado, chamado MTPro.<\/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\" \/> Conhecer arquiteturas de sistemas semelhantes ao que est\u00e1 projetando pode, al\u00e9m de inspirar e antecipar dificuldades, dar argumentos para discuss\u00f5es com o neg\u00f3cio.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>O que aprendemos observando esses sistemas? <strong>Troca de mensagens (chat) e defini\u00e7\u00e3o de presen\u00e7a s\u00e3o os componentes chaves nesse tipo de solu\u00e7\u00e3o.<\/strong><\/p>\n<h2>Design de alto n\u00edvel para a troca de mensagens<\/h2>\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\" \/> Para sistemas mais complexos, produza vis\u00f5es de modelo, de alto n\u00edvel, para facilitar discuss\u00f5es com o time.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>A vis\u00e3o do modelo abaixo indica que aplica\u00e7\u00f5es &#8220;cliente&#8221; n\u00e3o se comunicam diretamente. Em lugar disso, conectam-se a um &#8220;servidor&#8221; que realiza a media\u00e7\u00e3o das trocas de mensagens.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4259\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/1__.png\" alt=\"\" width=\"721\" height=\"315\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/1__.png 1442w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/1__-300x131.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/1__-1024x447.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/1__-768x336.png 768w\" sizes=\"(max-width: 721px) 100vw, 721px\" \/><\/p>\n<p>As principais atribui\u00e7\u00f5es desse servi\u00e7o s\u00e3o:<\/p>\n<ol>\n<li>Aceitar mensagens enviadas por um usu\u00e1rio;<\/li>\n<li>Armazenar mensagens enviadas em um &#8220;registro de conversa&#8221; entre dois usu\u00e1rios;<\/li>\n<li>Garantir que mensagens enviadas sejam &#8220;entregues&#8221; imediatamente para &#8220;destinat\u00e1rios&#8221; que estejam conectados no servi\u00e7o;<\/li>\n<li>Fornecer um &#8220;hist\u00f3rico recente&#8221; de conversas (mensagens trocadas).<\/li>\n<\/ol>\n<hr \/>\n<p>O fluxo b\u00e1sico de opera\u00e7\u00f5es pode ser melhor entendido a partir da representa\u00e7\u00e3o abaixo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4312\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5.png\" alt=\"\" width=\"2500\" height=\"2363\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5.png 2500w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5-300x284.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5-1024x968.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5-768x726.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5-1536x1452.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/eximia-img5-2048x1936.png 2048w\" sizes=\"(max-width: 2500px) 100vw, 2500px\" \/><\/p>\n<p>Tudo come\u00e7a com uma mensagem sendo enviada a partir de uma aplica\u00e7\u00e3o cliente; &#8220;enriquecida&#8221; com o um <em>id\u00a0<\/em>no lado servidor; encaminhada para uma fila para processamento; armazenada em um banco de dados; caso o destinat\u00e1rio estiver <em>online<\/em>, enviar para o usu\u00e1rio destinat\u00e1rio; caso o destinat\u00e1rio estiver <em>offline.<\/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;\">Modelo e vis\u00f5es de modelo<\/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 s\u00e3o vis\u00f5es do modelo? Consulte agora esse t\u00f3pico no cap\u00edtulo onde discutimos esse e outros conceitos importantes para a documenta\u00e7\u00e3o.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/modelo-visoes-do-modelo-e-alem-capitulo-1-4-v1-0\/#Modelo_visoes_do_modelo_modelagem_e_repositorio_da_arquitetura\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>O &#8220;servidor&#8221; garante a &#8220;mem\u00f3ria&#8221; de todas as mensagens. Al\u00e9m disso, possui duas interfaces prim\u00e1rias de comunica\u00e7\u00e3o para as &#8220;aplica\u00e7\u00f5es&#8221; cliente. Toda vez que um usu\u00e1rio, usando um &#8220;cliente&#8221;, deseja enviar ou receber mensagens, conecta-se ao &#8220;servidor&#8221; atrav\u00e9s de suas interfaces.<\/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\" \/> Ao produzir uma vis\u00e3o de modelo, certifique-se de ponderar sobre modulariza\u00e7\u00e3o &#8211; distribui\u00e7\u00e3o de responsabilidades &#8211; e a rela\u00e7\u00e3o de componentes &amp; conectores.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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;\">Mem\u00f3ria de mensagens no Whatsapp<\/p>\r\n<\/p>\n<p>O Whatsapp \u00e9, provavelmente, o sistema de <em>chat\u00a0<\/em><em>online\u00a0<\/em>mais popular nos dias de hoje. Ele implementa uma vers\u00e3o consideravelmente modificada do <a href=\"https:\/\/xmpp.org\/\">XMPP<\/a> &#8211; um padr\u00e3o aberto para troca de mensagens e presen\u00e7a, baseado em XML.<\/p>\n<p>Pelo seu <em>design <\/em>o Whatsapp n\u00e3o precisa manter um registro centralizado de todas as mensagens deixando o armazenamento do hist\u00f3rico das conversas em bases de dados locais (SQLite), usando servidores em nuvem, eventualmente, como <em>backup<\/em>.<\/p>\n<p><\/div>\n<h2>Design de alto n\u00edvel para o controle de presen\u00e7a<\/h2>\n<p>O servi\u00e7o de presen\u00e7a, em nosso <em>chat online\u00a0<\/em>\u00e9 respons\u00e1vel por determinar se um usu\u00e1rio est\u00e1\u00a0<em>online\u00a0<\/em>e preparado para se comunicar com outros usu\u00e1rios.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4269\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_service_1.png\" alt=\"\" width=\"475\" height=\"189\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_service_1.png 950w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_service_1-300x119.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_service_1-768x306.png 768w\" sizes=\"(max-width: 475px) 100vw, 475px\" \/><\/p>\n<p>Ele disponibiliza tr\u00eas interfaces principais:<\/p>\n<ol>\n<li><strong>atualiza\u00e7\u00e3o externa de status<\/strong>, que dever\u00e1 ser consumida primariamente pelo servi\u00e7o de autentica\u00e7\u00e3o, mudando <em>status<\/em> para\u00a0<em>online\u00a0<\/em>quando acontecer <em>login<\/em> e\u00a0<em>offline<\/em> quando acontecer um <em>logoff;<\/em><\/li>\n<li><strong>monitoramento de pulsa\u00e7\u00e3o de aplicativos clientes<\/strong>, visando detectar problemas de conex\u00e3o;<\/li>\n<li><strong>fornecimento de listas de status de usu\u00e1rios<\/strong><\/li>\n<\/ol>\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\" \/> Projetar as interfaces (e seus respectivos contratos) de um servi\u00e7o\/aplica\u00e7\u00e3o consiste uma excelente <\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Cada uma dessas interfaces apresenta desafios particulares.<\/strong><\/p>\n<p>A atualiza\u00e7\u00e3o externa pode ser modelada para evoca\u00e7\u00e3o direta, acionamento via <em>webhooks\u00a0<\/em>ou subscri\u00e7\u00e3o de eventos. A ideia inicial \u00e9 habilitar intera\u00e7\u00e3o entre o servi\u00e7o de login (autentica\u00e7\u00e3o) e o servi\u00e7o de presen\u00e7a.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4273\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_login.png\" alt=\"\" width=\"297\" height=\"501\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_login.png 594w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/presence_login-178x300.png 178w\" sizes=\"(max-width: 297px) 100vw, 297px\" \/><\/p>\n<p>O monitoramento de pulsa\u00e7\u00e3o pode conectar diretamente com aplica\u00e7\u00f5es clientes ou atrav\u00e9s de &#8220;mensagens especiais&#8221; para o servi\u00e7o de chat.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4275 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/heartbeat.png\" alt=\"\" width=\"525\" height=\"531\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/heartbeat.png 1050w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/heartbeat-297x300.png 297w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/heartbeat-1012x1024.png 1012w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/heartbeat-768x777.png 768w\" sizes=\"(max-width: 525px) 100vw, 525px\" \/><\/p>\n<p>A atualiza\u00e7\u00e3o de status de amigos pode acontecer fornecendo listas completas atualizadas ou com atualiza\u00e7\u00f5es parciais (f<em>anout<\/em>)<\/p>\n<h2>Considera\u00e7\u00f5es para outros servi\u00e7os<\/h2>\n<p><strong>Presen\u00e7a e\u00a0<em>chat\u00a0<\/em>s\u00e3o os dois servi\u00e7os cruciais e espec\u00edficos para a constru\u00e7\u00e3o de um\u00a0<\/strong><em><strong>chat online.<\/strong>\u00a0<\/em>Mas, al\u00e9m deles, h\u00e1 alguns outros.<\/p>\n<p>Para come\u00e7ar, \u00e9 necess\u00e1rio ter um servi\u00e7o para gerenciar\u00a0<em>login\/logoff<\/em> e assinatura de novos usu\u00e1rios. Tamb\u00e9m \u00e9 necess\u00e1rio manter um servi\u00e7o para registro de dados dos usu\u00e1rios (como fotos de perfil e dados de apresenta\u00e7\u00e3o).<\/p>\n<p>Tais servi\u00e7os operam no padr\u00e3o <em>request\/response\u00a0<\/em>e podem ser &#8220;feitos em casa&#8221; ou adquiridos no mercado.<\/p>\n<p>O servi\u00e7o para\u00a0<em>push notifications\u00a0<\/em>\u00e9 um <em>commodity\u00a0<\/em>necess\u00e1rio. Trata-se da maneira de informar usu\u00e1rios <em>offline <\/em>de que h\u00e1 novas mensagens recebidas, mesmo quando a aplica\u00e7\u00e3o, em um celular, n\u00e3o estiver em execu\u00e7\u00e3o.<\/p>\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>Descartando XMPP<\/h4>\n<p>XMPP \u00e9 um padr\u00e3o constitu\u00eddo para troca de mensagens e presen\u00e7a. \u00c9 a base tecnol\u00f3gica do Whatsapp, j\u00e1 foi o padr\u00e3o adotado pelo Google Hangouts e o Facebook Messenger. Entretanto, n\u00e3o possui implementa\u00e7\u00f5es ativas nas tecnologias familiares para os times, em nosso cen\u00e1rio fict\u00edcio e, essa \u00e9 uma das raz\u00f5es para estar sendo sendo deixado de lado. A outra \u00e9 o fato do &#8220;neg\u00f3cio&#8221; desejar uma solu\u00e7\u00e3o propriet\u00e1ria.<\/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\" \/> Nunca ignore a &#8220;qualifica\u00e7\u00e3o t\u00e9cnica&#8221; do time para ado\u00e7\u00e3o de solu\u00e7\u00f5es tecnol\u00f3gicas. Eventualmente, a curva de aprendizagem pode inviabilizar a sustenta\u00e7\u00e3o.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\nEm projetos reais, n\u00e3o seria prudente descartar um protocolo maduro e respeitado como o XMPP. H\u00e1 implementa\u00e7\u00f5es <em>opensource<\/em> para o protocolo que deveriam, pelo menos, serem submetidas a provas de conceito.\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\" \/> Realize provas de conceito para conhecer e validar alternativas arquiteturais.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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;\">Arquitetura assertiva<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">A assertividade arquitetural demanda que decis\u00f5es sejam tomadas, justificadas e comunicadas. Quer saber mais sobre isso? Leia agora o t\u00f3pico do livro onde tratamos desse tema.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/em-busca-da-assertividade-na-pratica-arquitetural-capitulo-15-v-1-02\/#O_que_entender_por_assertividade\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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;\">Facebook Messenger e MQTT<\/p>\r\n<\/p>\n<p>Modernamente, o Facebook Messenger adota MQTT como base para comunica\u00e7\u00e3o.<\/p>\n<p>Do <a href=\"https:\/\/engineering.fb.com\/2011\/08\/12\/android\/building-facebook-messenger\/\">blog da Meta<\/a>:<\/p>\n<p><em>&#8220;The method we were using to send was reliable but slow, and there were limitations on how much we could improve it. With just a few weeks until launch, we ended up building a new mechanism that maintains a persistent connection to our servers. To do this without killing battery life, we used a protocol called MQTT that we had experimented with in Beluga. MQTT is specifically designed for applications like sending telemetry data to and from space probes, so it is designed to use bandwidth and batteries sparingly. By maintaining an MQTT connection and routing messages through our chat pipeline, we were able to often achieve phone-to-phone delivery in the hundreds of milliseconds, rather than multiple seconds.&#8221;<\/em><\/p>\n<p><\/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\" \/> Adquira o h\u00e1bito de acompanhar os blogs dos times de engenharia das <em>big techs<\/em>. H\u00e1 sempre excelentes insights sobre motiva\u00e7\u00f5es e crit\u00e9rios de decis\u00e3o.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h4>A &#8220;insufici\u00eancia&#8221; do HTTP para o <em>chat service<\/em><\/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\" \/> O design arquitetural de uma aplica\u00e7\u00e3o contempla seus componentes, as responsabilidades de cada componente e a <strong>forma como eles se relacionam. <\/strong>Escolhas infelizes de protocolos podem representar s\u00e9rias dificuldades para a constru\u00e7\u00e3o de aplica\u00e7\u00f5es com bom <em>evolvability<\/em>.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Na maior parte dos sistemas com arquitetura cliente\/servidor, a comunica\u00e7\u00e3o geralmente \u00e9 iniciada pelo lado &#8220;cliente&#8221;. Isso tamb\u00e9m \u00e9 v\u00e1lido para o envio de mensagens em um <em>chat online.<\/em> Isso\u00a0 torna HTTP uma op\u00e7\u00e3o vi\u00e1vel de protocolo para <em>sending messages interface<\/em>, principalmente considerando a alternativa de usar a op\u00e7\u00e3o <a href=\"https:\/\/tools.ietf.org\/id\/draft-thomson-hybi-http-timeout-01.html#rfc.section.2\"><em>keep-alive<\/em><\/a>\u00a0 para reduzir a quantidade de TCP<em> handshakes<\/em>.<\/p>\n<p>Para a <em>relaying messages interface<\/em>, entretanto, HTTP n\u00e3o parece ser uma op\u00e7\u00e3o muito boa, j\u00e1 que, nessa interface seria mais natural se a comunica\u00e7\u00e3o come\u00e7asse pelo lado &#8220;servidor&#8221;.<\/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;\">Polling e Long Polling<\/p>\r\n<\/p>\n<p>Ao longo dos anos, algumas t\u00e9cnicas foram desenvolvidas para &#8220;disfar\u00e7ar&#8221; as limita\u00e7\u00f5es de HTTP para comunica\u00e7\u00f5es iniciadas no &#8220;servidor&#8221; para os &#8220;clientes&#8221;.<\/p>\n<p>Uma delas, <strong><em>polling<\/em><\/strong>, consiste no &#8220;cliente&#8221; questionando &#8220;o que h\u00e1 de novo?&#8221; para o &#8220;servidor&#8221;, repetidamente, em intervalos regulares (por exemplo, a cada 5 segundos). Dessa forma, sempre que houver uma novidade no servidor, ela \u00e9 comunicada . Obviamente, tal abordagem pode ser custosa, consumindo recursos do servidor (escassos) para, na maior parte das vezes, informar que n\u00e3o h\u00e1 nada a comunicar.<\/p>\n<p>Outra t\u00e9cnica, variante da primeira, \u00e9 o <em><strong>long polling<\/strong>.\u00a0<\/em>Sua diferen\u00e7a \u00e9 que o&#8221;cliente&#8221; e &#8220;servidor&#8221; mant\u00e9m a conex\u00e3o aberta at\u00e9 houver algo a comunicar ou aconte\u00e7a um <em>timeout <\/em>(<em>default<\/em> 100s).<\/p>\n<p><\/div>\n<h4><em>Websockets<\/em> como alternativa vi\u00e1vel<\/h4>\n<p>As limita\u00e7\u00f5es de HTTP na comunica\u00e7\u00e3o do &#8220;servidor&#8221; para o &#8220;cliente&#8221;, necess\u00e1ria para a\u00a0<em>relaying messages interface<\/em>,\u00a0s\u00e3o superadas rapidamente com a ado\u00e7\u00e3o de <em>websockets.\u00a0<\/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;\">Websockets<\/p>\r\n<\/p>\n<p><em>WebSocket<\/em> \u00e9 uma tecnologia &#8211; padronizada pelo W3C e pelo IETF &#8211; que permite a comunica\u00e7\u00e3o bidirecional por canais full-duplex sobre um \u00fanico soquete TCP.\u00a0\u00a0<sup id=\"cite_ref-4\" class=\"reference\"><\/sup><\/p>\n<p>Uma conex\u00e3o\u00a0<em>websocket\u00a0<\/em>\u00e9 iniciada no lado &#8220;cliente&#8221; com uma requisi\u00e7\u00e3o HTTP normal, atualizada emum <em>handshake<\/em>. Ela funciona nas portas 80 e 443.<\/p>\n<p><\/div>\n<p>Embora HTTP seja &#8220;<em>good enough&#8221;<\/em> para\u00a0<em>sending message interface,\u00a0<\/em>n\u00e3o h\u00e1 raz\u00f5es para n\u00e3o adotar <em>websockets<\/em> ali tamb\u00e9m.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4260 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/2__.png\" alt=\"\" width=\"560\" height=\"88\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/2__.png 952w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/2__-300x47.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/2__-768x121.png 768w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/p>\n<p>A manuten\u00e7\u00e3o de conex\u00f5es ativas persistentes entre clientes e o servi\u00e7o de <em>chat\u00a0<\/em>classifica esse servi\u00e7o como\u00a0<em>stateful.<\/em><\/p>\n<h4>Suportando a escala (em servidores <em>stateful<\/em>)<\/h4>\n<p>A decis\u00e3o de usar <em>Websockets\u00a0<\/em>com conex\u00f5es ativas persistentes implica na impossibilidade de adotar estrat\u00e9gias de balanceamento simplificadas entre clientes e servidores.<\/p>\n<p>Fazendo c\u00e1lculos no &#8220;papel de p\u00e3o&#8221;, assumindo 2 milh\u00f5es de usu\u00e1rios ativos simultaneamente (respeitando o caso extremo apontado pelo &#8220;neg\u00f3cio&#8221;), ponderando-se 10KB para cada &#8220;conex\u00e3o ativa&#8221; sendo mantida pela aplica\u00e7\u00e3o, temos uma aloca\u00e7\u00e3o total de 20GB. Ou seja, <span style=\"text-decoration: underline;\">um volume suport\u00e1vel para um \u00fanico servidor<\/span>.<\/p>\n<p>Obviamente, a distribui\u00e7\u00e3o na horizontal \u00e9 uma demanda importante para garantir a disponibilidade, que \u00e9 fundamental para a escalabilidade.<\/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;\">Rela\u00e7\u00e3o entre escalabilidade e disponibilidade<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Confuso sobre a rela\u00e7\u00e3o entre escalabilidade e disponibilidade? Ent\u00e3o, visite o t\u00f3pico onde explico esta rela\u00e7\u00e3o.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-2-2-v-3-0\/#Antes_de_falar_sobre_escalabilidade_disponibilidade\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Uma primeira alternativa para gerenciar os\u00a0<em>handlers\u00a0<\/em>de conex\u00f5es por cliente \u00e9 utilizar alguma estrat\u00e9gia de <em>service discovery\u00a0<\/em>como a oferecida pelo <a href=\"https:\/\/zookeeper.apache.org\/\">Apache Zookeeper<\/a>\u00a0&#8211; Ele registra todos os servidores ativos e direciona conex\u00f5es conforme crit\u00e9rios pr\u00e9-especificados.<\/p>\n<p>Outra alternativa, mais radical, \u00e9 adotar o modelo de programa\u00e7\u00e3o com atores &#8211; a base de tecnologias como ERLANG, Akka e Orleans.<\/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;\">Actors Model<\/p>\r\n<\/p>\n<p>O modelo de atores \u00e9 um modelo de programa\u00e7\u00e3o para computa\u00e7\u00e3o concorrente. Nele, um &#8220;ator&#8221; \u00e9 a principal primitiva. Atores interagem trocando mensagens.<\/p>\n<p>Em resposta a uma mensagem recebida, um ator pode: 1) atuar localmente; 2) criar novos atores; 3) enviar novas mensagens ou 4) responder a mensagem recebida.<\/p>\n<p>Um ator tem poder apenas para modificar seu estado local, mas somente pode afetar o estado global indiretamente atrav\u00e9s do envio de mensagens.<\/p>\n<p><em>Frameworks<\/em> que implementam o modelo de atores destacam-se por sua capacidade para escalar e distribuir processamento, com alta toler\u00e2ncia a falhas e baixa lat\u00eancia.<\/p>\n<p><\/div>\n<p>Por agora, nossa op\u00e7\u00e3o de <em>design<\/em> \u00e9 utilizando abordagens padr\u00f5es de\u00a0<em>service discovery.<\/em><\/p>\n<h4>Suportando a escala (em servidores <em>stateless<\/em>)<\/h4>\n<p>Escalar servi\u00e7os de autentica\u00e7\u00e3o,\u00a0<em>service discovery\u00a0<\/em>e perfil pode adotar abordagens tradicionais de replica\u00e7\u00e3o. Ou seja, replica\u00e7\u00e3o horizontal com carga distribu\u00edda atrav\u00e9s de um\u00a0<em>load balancer.<\/em><\/p>\n<h4>Armazenamento das mensagens<\/h4>\n<p>O armazenamento das mensagens trocadas pelo servi\u00e7o \u00e9 relativamente simples, contendo poucos campos.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4278 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_structure.png\" alt=\"\" width=\"299\" height=\"166\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_structure.png 472w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/data_structure-300x167.png 300w\" sizes=\"(max-width: 299px) 100vw, 299px\" \/><\/p>\n<p>O campo <code>id<\/code> precisa suportar ordena\u00e7\u00e3o temporal inteligente e, por isso, sugere-se a ado\u00e7\u00e3o de um servidor de <em>tickets<\/em> ou uma estrat\u00e9gia como o<em> Twitter Snowflake<\/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;\">Twitter Snowflake<\/p>\r\n<\/p>\n<p><strong>Twitter Snowflake \u00e9 uma estrat\u00e9gia para gera\u00e7\u00e3o de IDs \u00fanicos, com 64 <em>bits<\/em>, de maneira distribu\u00edda, que possibilita ordena\u00e7\u00e3o temporal.<\/strong><\/p>\n<p>Na proposta da estrat\u00e9gia:<\/p>\n<ul>\n<li>O primeiro bit \u00e9 reservado e sempre &#8220;zero&#8221;<\/li>\n<li>41 bits s\u00e3o destinados ao armazenamento de um timestamp regular (suficiente para at\u00e9 69 anos).<\/li>\n<li>5 bits s\u00e3o utilizados para identificar o <em>datacenter, <\/em>determinado durante o <em>setup<\/em>,\u00a0onde se encontra a m\u00e1quina onde o id est\u00e1 sendo gerado (at\u00e9 32 <em>datacenters<\/em>)<\/li>\n<li>5 bits s\u00e3o utilizados para identificar a m\u00e1quina do <em>datacenter<\/em>, determinado durante o <em>setup<\/em>,\u00a0onde o ID est\u00e1 sendo gerado (at\u00e9 32 m\u00e1quinas por <em>datacenter<\/em>)<\/li>\n<li>12 bits s\u00e3o um sequencial reinicializado a cada milissegundo.<\/li>\n<\/ul>\n<hr \/>\n<p>\u00c9 fundamental que o <em>clock<\/em> das diversas m\u00e1quinas esteja sincronizado.<\/p>\n<p><\/div>\n<p>Importante lembrar que o volume de mensagens pode ser realmente gigante. Conforme o neg\u00f3cio, entretanto, nada comparado com os volumes de aplica\u00e7\u00f5es suportados por empresas como\u00a0 Whatsapp e Facebook Messenger.<\/p>\n<p>Mensagens geralmente s\u00e3o acessadas, no servidor, conforme &#8220;idade&#8221;. Mensagens recentes s\u00e3o acessadas todo o tempo. Outro ponto importante, o volume de &#8220;leituras&#8221; e &#8220;grava\u00e7\u00f5es&#8221; se aproxima da propor\u00e7\u00e3o 1:1 (uma leitura para cada escrita).<\/p>\n<p>Bancos de dados chave-valor parecem ser apropriados. Por refer\u00eancia, Facebook Messenger utiliza HBase e Discord utiliza Cassandra.<\/p>\n<h4>Armazenamento de &#8220;dados gen\u00e9ricos&#8221;<\/h4>\n<p>Dados gen\u00e9ricos, como dados de perfil, configura\u00e7\u00f5es e lista de amigos s\u00e3o f\u00e1ceis de modelar e suportar com bases de dados relacionais tradicionais.<\/p>\n<p>Eventualmente, para suportar escala, pode-se adotar t\u00e9cnicas como replica\u00e7\u00e3o e <em>sharding<\/em>.<\/p>\n<h4>Consolida\u00e7\u00e3o b\u00e1sica de componentes (servidores)<\/h4>\n<p>H\u00e1, dentro da solu\u00e7\u00e3o de <em>chat online\u00a0<\/em>at\u00e9 aqui, as seguintes naturezas de servidores:<\/p>\n<ol>\n<li><em>load balancers<\/em><\/li>\n<li>mecanismos de fila<\/li>\n<li>servi\u00e7os <em>stateless<\/em>\n<ol>\n<li>autentica\u00e7\u00e3o<\/li>\n<li>dados b\u00e1sicos de perfil<\/li>\n<li>servi\u00e7o de descoberta<\/li>\n<\/ol>\n<\/li>\n<li>servi\u00e7os <em>statefull<\/em>\n<ol>\n<li>chat<\/li>\n<li>presen\u00e7a<\/li>\n<\/ol>\n<\/li>\n<li>bancos de dados\n<ol>\n<li>NoSQL chave-valor<\/li>\n<\/ol>\n<\/li>\n<li>servidores de <em>push notifications<\/em><\/li>\n<\/ol>\n<h4>Fluxo b\u00e1sico para conex\u00e3o de um cliente ao servi\u00e7o<\/h4>\n<p>A conex\u00e3o de um cliente a plataforma segue um processo gen\u00e9rico de apenas 3 etapas.<\/p>\n<ol>\n<li>Uma vez que um usu\u00e1rio possua acesso ao <em>website\u00a0<\/em>ou ao aplicativo da plataforma, poder\u00e1 iniciar conex\u00e3o, mediante servi\u00e7o de autentica\u00e7\u00e3o.<\/li>\n<li>Com cliente devidamente autorizado, conex\u00e3o com servi\u00e7o de <em>chat<\/em> deve ser iniciada com orquestra\u00e7\u00e3o do servi\u00e7o de descoberta. Uma vez, determinado o servidor, conex\u00e3o\u00a0<em>websocket\u00a0<\/em>deve ser estabelecida.<\/li>\n<li>Aplica\u00e7\u00e3o cliente, ent\u00e3o, deve solicitar lista de usu\u00e1rios presentes e atualiza\u00e7\u00e3o de mensagens.<\/li>\n<\/ol>\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\" \/> Registre em ADRs fluxos elementares, em alto n\u00edvel, para os sistemas que estiver modelando<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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.<br \/>\nCom rela\u00e7\u00e3o ao design de um <em>chat online<\/em> \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 mensagens.<\/li>\n<li>A op\u00e7\u00e3o por n\u00e3o utilizar um protocolo consolidado, como XMPP, reduz possibilidades de interoperabilidade.<\/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 \u201cchat online\u201d permite algumas li\u00e7\u00f5es importantes:<\/p>\n<ol>\n<li>Problemas comuns tem solu\u00e7\u00f5es bem estudadas que n\u00e3o devem ser ignoradas;<\/li>\n<li>A produ\u00e7\u00e3o de modelos visuais ajuda a tangibilizar a arquitetura<\/li>\n<li>Mesmo padr\u00f5es consolidados tem problemas para &#8220;suportar&#8221; o peso da escala<\/li>\n<li>Mesmo em escalas que podem ser atendidas por inst\u00e2ncias \u00fanicas, sempre considere replicas para garantir disponibilidade.<\/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":4362,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[62],"apendices":[],"capitulos":[70],"class_list":["post-4245","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-secao-4","capitulos-capitulo-4-2"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cap 4.2 Iniciando o design arquitetural de um &quot;chat online&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-chat-online\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cap 4.2 Iniciando o design arquitetural de um &quot;chat online&quot; - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Nesse cap\u00edtulo, vamos utilizar alguns dos conceitos discutidos nesse livro para &#8220;pensar a arquitetura&#8221; de um sistema de chat online. 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). O que \u00e9 um &#8220;chat [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/\" \/>\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:20:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.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=\"17 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-chat-online\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/\",\"name\":\"Cap 4.2 Iniciando o design arquitetural de um \\\"chat online\\\" - 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-chat-online\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg\",\"datePublished\":\"2022-05-17T00:42:24+00:00\",\"dateModified\":\"2024-01-12T21:20:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg\",\"width\":600,\"height\":338},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#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.2 Iniciando o design arquitetural de um &#8220;chat online&#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.2 Iniciando o design arquitetural de um \"chat online\" - 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-chat-online\/","og_locale":"pt_BR","og_type":"article","og_title":"Cap 4.2 Iniciando o design arquitetural de um \"chat online\" - Manual do Arquiteto de Software","og_description":"Nesse cap\u00edtulo, vamos utilizar alguns dos conceitos discutidos nesse livro para &#8220;pensar a arquitetura&#8221; de um sistema de chat online. 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). O que \u00e9 um &#8220;chat [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-12T21:20:35+00:00","og_image":[{"width":600,"height":338,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/","name":"Cap 4.2 Iniciando o design arquitetural de um \"chat online\" - 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-chat-online\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg","datePublished":"2022-05-17T00:42:24+00:00","dateModified":"2024-01-12T21:20:35+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/img-cap-4-2.jpg","width":600,"height":338},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-chat-online\/#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.2 Iniciando o design arquitetural de um &#8220;chat online&#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\/4245","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=4245"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/4362"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=4245"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4245"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4245"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4245"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}