{"id":4687,"date":"2022-06-07T16:18:31","date_gmt":"2022-06-07T19:18:31","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4687"},"modified":"2024-01-12T11:38:06","modified_gmt":"2024-01-12T14:38:06","slug":"iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/","title":{"rendered":"Cap 4.4 Iniciando o design arquitetural de um &#8220;servi\u00e7o para armazenar e compartilhar arquivos&#8221; (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0"},"content":{"rendered":"<p><strong>No passado era comum que usu\u00e1rios &#8220;perdessem&#8221; arquivos importantes ao trocar de equipamento ou &#8220;formatar o HD&#8221;.<\/strong> Seja por desorganiza\u00e7\u00e3o ou por incapacidade t\u00e9cnica, o fato \u00e9 que algum arquivo importante sempre acabava &#8220;esquecido&#8221; &#8211; sem c\u00f3pias de seguran\u00e7a &#8211; e definitivamente perdido.<\/p>\n<p><strong>Compartilhar arquivos tamb\u00e9m j\u00e1 foi um grande desafio<\/strong> &#8211; disquetes, <em>pendrives\u00a0<\/em>e outras m\u00eddias ex\u00f3ticas, frequentemente corrompidas, contendo m\u00faltiplas vers\u00f5es de conte\u00fado importante.<\/p>\n<p><strong>Garantir a manuten\u00e7\u00e3o e compartilhamento de arquivos ficou muito mais f\u00e1cil com o advento da nuvem e o surgimento de servi\u00e7os como o Dropbox. <\/strong>Um servi\u00e7o na nuvem que permite a sincroniza\u00e7\u00e3o de arquivos em m\u00faltiplos dispositivos,\u00a0<em>upload\/download\u00a0<\/em>e compartilhamento facilitado.<\/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;\">Hist\u00f3ria do Dropbox<\/p>\r\n<\/p>\n<p>A ideia do Dropbox surgiu quando por acaso um dos seus futuros criadores (Drew Houston) esqueceu seu pendrive quando viajava em um \u00f4nibus e precisava dele para uma consultoria que daria em uma empresa. Frustrado com a perda, Drew come\u00e7ou a escrever um c\u00f3digo sem nenhuma pretens\u00e3o, e que futuramente viria se chamar Dropbox.<\/p>\n<p>Drew tamb\u00e9m cita em entrevistas que j\u00e1 estava saturado de ter que ficar abrindo seu e-mail a todo instante para anexar arquivos e poder acess\u00e1-los remotamente mais tarde. Seu trabalho inicial era apenas para resolver seu problema pessoal, s\u00f3 depois, Houston viu que sua ideia tinha um bom potencial de mercado.<\/p>\n<p>Formado no\u00a0<a title=\"Instituto de Tecnologia de Massachusetts\" href=\"https:\/\/pt.wikipedia.org\/wiki\/Instituto_de_Tecnologia_de_Massachusetts\">MIT<\/a>\u00a0em ci\u00eancia da computa\u00e7\u00e3o, Drew deu inicio a seus trabalhos no projeto, e convidou seu colega Arash Ferdowsi a participar do mesmo. Arash na \u00e9poca ainda n\u00e3o tinha se formado no MIT e interrompeu seu curso para ajudar no projeto. Eles conseguiram um contrato com a empresa de acelera\u00e7\u00e3o de crescimento <a href=\"https:\/\/www.ycombinator.com\/\">Y Combinator<\/a> em 2007, se mudaram para o\u00a0<a title=\"Vale do Sil\u00edcio\" href=\"https:\/\/pt.wikipedia.org\/wiki\/Vale_do_Sil%C3%ADcio\">Vale do Sil\u00edcio<\/a>, para sediar a empresa, e colocaram o produto no ar em 2008.<\/p>\n<p>Fonte: <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Dropbox\">Wikipedia<\/a>.<\/p>\n<p><\/div>\n<p><strong>Nesse cap\u00edtulo vamos iniciar a arquitetura de um servi\u00e7o para armazenamento e compartilhamento de arquivos&#8221; (como o Dropbox). <span style=\"text-decoration: underline;\">A ideia n\u00e3o \u00e9 completar a arquitetura, at\u00e9 porque a arquitetura de um sistema s\u00f3 est\u00e1 completa quando o sistema est\u00e1 completo. Nosso desejo \u00e9 dar os &#8220;primeiros passos&#8221;<\/span><\/strong><\/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>Em nosso cen\u00e1rio fict\u00edcio, desejamos criar um servi\u00e7o de armazenamento de arquivos, similar ao <a href=\"https:\/\/www.dropbox.com\/\">DropBox<\/a>, <a href=\"http:\/\/drive.google.com\">Google Drive<\/a> e <a href=\"http:\/\/onedrive.live.com\">Onedrive<\/a>.<\/p>\n<p>As principais <em>features<\/em> desse servi\u00e7o s\u00e3o: <em>upload<\/em> e <em>download<\/em> de arquivos, sincroniza\u00e7\u00e3o dos arquivos armazenados com uma pasta local especificada (<em>sync folder<\/em>) e, finalmente, manter um &#8220;hist\u00f3rico de vers\u00f5es&#8221; para cada arquivo.<\/p>\n<p>Estima-se 5 milh\u00f5es de usu\u00e1rios ativos di\u00e1rios (<em>DAU<\/em>), com 50 milh\u00f5es de requisi\u00e7\u00f5es di\u00e1rias. Estima-se que os arquivos armazenados no servi\u00e7o tenham, em m\u00e9dia, 3 MB. H\u00e1 um limite de de 10GB por usu\u00e1rio ativo.<\/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\" \/> Lembre-se, Gigabyte (GB) \u00e9 diferente de Gigabit (Gb)<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong><span style=\"text-decoration: underline;\">N\u00c3O<\/span><\/strong> h\u00e1 demanda por criptografar conte\u00fado armazenado.<\/p>\n<p>Os atributos de qualidade mais importantes s\u00e3o disponibilidade e desempenho.<\/p>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/arquiteturadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">Atributos de qualidade<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\">Disponibilidade e desempenho s\u00e3o dois atributos de qualidade. Quer relembrar o conceito? Consulte agora o t\u00f3pico onde o explicamos.<\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/definindo-arquitetura-de-software-e-o-papel-do-arquiteto-capitulo-0-v3-03a\/#A_estrategia_na_arquitetura_de_software\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Algumas estimativas de &#8220;papel de p\u00e3o&#8221;<\/h2>\n<p>Com base nas informa\u00e7\u00f5es levantadas com o neg\u00f3cio, em nosso cen\u00e1rio fict\u00edcio, \u00e9 poss\u00edvel elaborar algumas estimativas, grosseiras, mas j\u00e1 suficientes para orientar algumas decis\u00f5es de <em>design.<\/em><\/p>\n<p>A ideia n\u00e3o \u00e9, necessariamente, chegar a precis\u00e3o decimal, mas &#8220;compartilhar a vis\u00e3o&#8221; de n\u00fameros mais tang\u00edveis e come\u00e7ar a estabelecer restri\u00e7\u00f5es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4691 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/boe.png\" alt=\"\" width=\"727\" height=\"292\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/boe.png 1190w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/boe-300x121.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/boe-1024x411.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/boe-768x308.png 768w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/><\/p>\n<h2>Explicitando as principais features<\/h2>\n<p>Como indicado no Haiku, as principais <em>features\u00a0<\/em>s\u00e3o:<\/p>\n<ol>\n<li><em>upload<\/em> e <em>download<\/em> de arquivos;<\/li>\n<li>sincroniza\u00e7\u00e3o dos arquivos armazenados com uma pasta local especificada (<em>sync folder<\/em>)<\/li>\n<li>manter um &#8220;hist\u00f3rico de vers\u00f5es&#8221; para cada arquivo.<\/li>\n<\/ol>\n<hr \/>\n<p>Essas tr\u00eas funcionalidades principais est\u00e3o consolidadas na vis\u00e3o do modelo abaixo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4695 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/main_features.png\" alt=\"\" width=\"428\" height=\"195\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/main_features.png 856w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/main_features-300x137.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/main_features-768x350.png 768w\" sizes=\"(max-width: 428px) 100vw, 428px\" \/><\/p>\n<h2>Proposta ing\u00eanua<\/h2>\n<p><strong>Ingenuamente, podemos assumir que manter um sistema de armazenamento de arquivos consiste apenas na implementa\u00e7\u00e3o <em>upload<\/em> e <em>download<\/em>, com alguma estrutura simples de dados para indicar versionamento<\/strong> (ou seja, para um determinado arquivo, modificado algumas vezes, ordenar as &#8220;vers\u00f5es&#8221; cronologicamente).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4713 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/hld.png\" alt=\"\" width=\"503\" height=\"194\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/hld.png 1006w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/hld-300x116.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/hld-768x296.png 768w\" sizes=\"(max-width: 503px) 100vw, 503px\" \/><\/p>\n<p><em>Upload<\/em> e <em>download<\/em> de arquivos inteiros s\u00e3o opera\u00e7\u00f5es triviais e f\u00e1ceis de implementar. Entretanto, como desejamos manter hist\u00f3ricos de arquivos, \u00e9 importante considerar que, quando estivermos lidando com arquivos maiores, teremos muitas duplica\u00e7\u00f5es, onerando o armazenamento, e tr\u00e1fego de dados, onerando largura de banda. Dessa forma, impactando negativamente o desempenho e o custo.<\/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\" \/> Para cada arquitetura, tente determinar quais s\u00e3o as vari\u00e1veis que exercem maior influ\u00eancia no custo e no risco.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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;\">How we've scaled Dropbox<\/p>\r\nExcelente palestra, Kevin Modzelewski explica um pouco da hist\u00f3ria do Dropbox e a arquitetura da plataforma em 2012.\r\n<p><a class=\"botao-youtube\" href=\"https:\/\/www.youtube.com\/watch?v=PE4gwstWhmc\" 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<h2>Organizando informa\u00e7\u00f5es para 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 da &#8220;solu\u00e7\u00e3o ing\u00eanua&#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>Utilizar S3 (Simple Storage Service) ou Azure Blob<\/h4>\n<p><strong>Manter arquivos, garantindo disponibilidade, n\u00e3o \u00e9 tarefa simples. \u00c9 importante desenvolver estrat\u00e9gias de replica\u00e7\u00e3o e consist\u00eancia que n\u00e3o s\u00e3o nada f\u00e1ceis de obter, principalmente considerando a escala.<\/strong><\/p>\n<p>Felizmente, embora este seja um problema complexo, as solu\u00e7\u00f5es dispon\u00edveis hoje em dia, no mercado, s\u00e3o quase <em>commodities<\/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: Commodity<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\">Produtos ou servi\u00e7os que n\u00e3o se diferem independente de quem os produziu ou origem,<sup id=\"cite_ref-:4_5-1\" class=\"reference\"><\/sup> sendo seu pre\u00e7o uniformemente determinado pela oferta e procura.<\/p>\r\n<\/div>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Concentre-se no desenvolvimento do que agrega valor para o neg\u00f3cio. Adote solu\u00e7\u00f5es de mercado para problemas comuns.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h4>Fracionar arquivos em &#8220;blocos&#8221;<\/h4>\n<p>Uma alternativa candidata para minimizar o volume de dados armazenados e o tr\u00e1fego na rede, seria fracionar arquivos da pasta sincronizada em blocos, com um tamanho m\u00e1ximo pr\u00e9-determinado. Um arquivo de 10 MB, por exemplo, poderia ser fracionado em 10 blocos com 1 MB cada.<\/p>\n<p>Toda vez que um arquivo for modificado, realiza-se apenas o <em>upload<\/em> do(s) bloco(s) afetado(s) para o servi\u00e7o. Da mesma forma, apenas blocos modificados poderiam ser &#8220;baixados&#8221; para clientes para realizar atualiza\u00e7\u00e3o<em>.<\/em><\/p>\n<p>No servidor, cada arquivo haveria uma lista de &#8220;vers\u00f5es&#8221;, onde cada vers\u00e3o, por sua vez, relacionaria uma lista ordenada de blocos correspondentes.<\/p>\n<p>Um mesmo &#8220;bloco&#8221; de um arquivo, poderia estar dispon\u00edvel em mais de uma vers\u00e3o.<\/p>\n<p>Para fins de compara\u00e7\u00e3o, cada bloco pode ser identificado por um <em>hash<\/em>.<\/p>\n<h4>Adotar sincroniza\u00e7\u00e3o diferencial<\/h4>\n<p>Al\u00e9m da estrat\u00e9gia de fracionamento de arquivos, visando reduzir armazenamento e tr\u00e1fego de dados na rede, \u00e9 importante, tamb\u00e9m, considerar alguma abordagem de sincroniza\u00e7\u00e3o diferencial. Dentre as mais famosas, h\u00e1 o algoritmo <em>rsync.<\/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-contribuicao-2\">\r\n<p style=\"font-size: 22px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">O algoritmo rsync<\/p>\r\nUma boa descri\u00e7\u00e3o do algoritmo rsync pode ser encontrada na wikipedia. Trata-se da base do utilit\u00e1rio com mesmo nome, dispon\u00edvel para Linux desde a d\u00e9cada de 1990.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rsync#Algorithm\" target=\"_blank\" rel=\"noopener\">Acessar<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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;\">Sincroniza\u00e7\u00e3o diferencial (Google TechTalks)<\/p>\r\nPalestra sobre sincroniza\u00e7\u00e3o diferencial, ministrada por especialistas da Google. \u00d3tima refer\u00eancia, inclusive explicando a l\u00f3gica de funcionamento do Google Docs.\r\n<p><a class=\"botao-youtube\" href=\"https:\/\/www.youtube.com\/watch?v=S2Hp_1jqpY8\" 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<h4>Implementar de um &#8220;cliente inteligente&#8221; para o <em>Sync<\/em><\/h4>\n<p>Para a funcionalidade sincroniza\u00e7\u00e3o de arquivos, t\u00e3o importante quanto o servi\u00e7o na nuvem \u00e9 uma aplica\u00e7\u00e3o inteligente instalada em cada dispositivo.<\/p>\n<p>Essa aplica\u00e7\u00e3o inteligente deve ser capaz de fracionar os arquivos da pasta sincronizada em blocos, computar <em>hashs<\/em> desses blocos, de forma a compar\u00e1-los como a vers\u00e3o remota, otimizando <em>downloads<\/em> e <em>uploads<\/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-contribuicao-2\">\r\n<p style=\"font-size: 22px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Autonomous Computing<\/p>\r\nPat Helland criou, h\u00e1 d\u00e9cadas, o conceito de computa\u00e7\u00e3o aut\u00f4noma. Ele utiliza analogias, como feudos e emiss\u00e1rios, para explicar pap\u00e9is dos diversos artefatos em sistemas distribu\u00eddos. Leitura mais do que recomendada!\r\n<p><a class=\"botao-livro\" href=\"https:\/\/pathelland.substack.com\/p\/autonomous-computing-short-version?s=r\" target=\"_blank\" rel=\"noopener\">Acessar<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>A aplica\u00e7\u00e3o cliente precisa ter pelo menos quatro capacidades.<\/p>\n<ol>\n<li><em><strong>Watcher<\/strong><\/em> &#8211; identificando mudan\u00e7as na pasta sincronizada, tais como adi\u00e7\u00f5es, modifica\u00e7\u00f5es ou remo\u00e7\u00f5es de arquivos; modifica\u00e7\u00f5es na estrutura de subpastas, movimenta\u00e7\u00f5es de arquivos nas subpastas.<\/li>\n<li><em><strong>Chuncker<\/strong><\/em> &#8211; particionando arquivos em blocos e orquestrando <em>downloads<\/em> e <em>uploads<\/em> destes blocos para um servi\u00e7o de armazenamento mais simples.<\/li>\n<li><em><strong>Indexer<\/strong><\/em> &#8211; que gerencia informa\u00e7\u00f5es relacionadas aos arquivos tratados, como <span style=\"text-decoration: underline;\">conflitos<\/span> e os endere\u00e7os remotos para os blocos processados pelo <em>chunker<\/em>. O <em>indexer<\/em>, tamb\u00e9m deve ser o respons\u00e1vel por &#8220;notificar&#8221; o <em>synchronizer<\/em> remoto quanto as modifica\u00e7\u00f5es que ocorrerem e, finalmente, ser notificado por ele quando modifica\u00e7\u00f5es acontecerem em outros devices, aplicando-as localmente.<\/li>\n<li><em><strong>Synchronizer<\/strong><\/em> &#8211; mantem uma fila local com todas as modifica\u00e7\u00f5es notificadas pelo indexar, enviando-as para o servi\u00e7o remoto quando uma conex\u00e3o estiver dispon\u00edvel e, tamb\u00e9m, obtendo atualiza\u00e7\u00f5es.<\/li>\n<\/ol>\n<hr \/>\n<p>A vis\u00e3o do modelo abaixo condensa a estrutura indicada acima.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4702 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/client.png\" alt=\"\" width=\"572\" height=\"255\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/client.png 1144w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/client-300x134.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/client-1024x457.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/client-768x342.png 768w\" sizes=\"(max-width: 572px) 100vw, 572px\" \/><\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> O design arquitetural sempre trata da modulariza\u00e7\u00e3o &#8211; distribui\u00e7\u00e3o das responsabilidades em componentes &#8211; de um sistema ou da forma como as &#8220;conex\u00f5es&#8221; entre os diversos artefatos modulares se comunicam.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h4><em>Request<\/em> &amp; <em>Response<\/em> <em>queues<\/em><\/h4>\n<p>A natureza da comunica\u00e7\u00e3o entre o servi\u00e7o de armazenamento e compartilhamento e os agentes para sincroniza\u00e7\u00e3o \u00e9 naturalmente ass\u00edncrona.<\/p>\n<p>Agentes locais de sincroniza\u00e7\u00e3o podem, a todo momento, estar ou n\u00e3o conectados a internet. Por isso, \u00e9 necess\u00e1ria a constru\u00e7\u00e3o de duas filas:<\/p>\n<ol>\n<li><em>Request queues<\/em> &#8211; local, gerenciada por cada agente de sincroniza\u00e7\u00e3o, contendo o hist\u00f3rico de modifica\u00e7\u00f5es endere\u00e7adas pelo\u00a0<em>indexer<\/em>.<\/li>\n<li><em>Response queues &#8211;\u00a0<\/em>centralizada, mantida no servidor, contendo t\u00f3picos dedicados para cada agente local de sincroniza\u00e7\u00e3o.<\/li>\n<\/ol>\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>Seguran\u00e7a dos dados no lado do servidor, considerando alternativas para criptografia<\/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 para armazenamento e compartilhamento de arquivos\u201d permite alguns aprendizados importantes:<\/p>\n<ol>\n<li>Em sistemas massivamente distribu\u00eddos, \u00e9 importante sinalizar &#8220;feudos e emiss\u00e1rios&#8221;;<\/li>\n<li>Solu\u00e7\u00f5es triviais para pequenos volumes de dados raramente funcionam em grandes escalas;<\/li>\n<li>Em cada arquitetura, determine o mais cedo poss\u00edvel as vari\u00e1veis que mais influenciam em custo e risco;<\/li>\n<li>Arquitetura \u00e9, em grande parte, a arte de &#8220;dividir responsabilidades em m\u00f3dulos&#8221;;<\/li>\n<li>Utilize <em>commodities <\/em>no lugar de &#8220;reinventar a roda&#8221;.<\/li>\n<\/ol>\n<hr \/>\n<p>D\u00favidas ou sugest\u00f5es? Deixe suas contribui\u00e7\u00f5es nos coment\u00e1rios.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"featured_media":4718,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[62],"apendices":[],"capitulos":[74],"class_list":["post-4687","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-secao-4","capitulos-capitulo-4-4"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cap 4.4 Iniciando o design arquitetural de um &quot;servi\u00e7o para armazenar e compartilhar arquivos&quot; (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0 - 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-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cap 4.4 Iniciando o design arquitetural de um &quot;servi\u00e7o para armazenar e compartilhar arquivos&quot; (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"No passado era comum que usu\u00e1rios &#8220;perdessem&#8221; arquivos importantes ao trocar de equipamento ou &#8220;formatar o HD&#8221;. Seja por desorganiza\u00e7\u00e3o ou por incapacidade t\u00e9cnica, o fato \u00e9 que algum arquivo importante sempre acabava &#8220;esquecido&#8221; &#8211; sem c\u00f3pias de seguran\u00e7a &#8211; e definitivamente perdido. Compartilhar arquivos tamb\u00e9m j\u00e1 foi um grande desafio &#8211; disquetes, pendrives\u00a0e outras [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/\" \/>\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-12T14:38:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1254\" \/>\n\t<meta property=\"og:image:height\" content=\"836\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/\",\"name\":\"Cap 4.4 Iniciando o design arquitetural de um \\\"servi\u00e7o para armazenar e compartilhar arquivos\\\" (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0 - 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-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg\",\"datePublished\":\"2022-06-07T19:18:31+00:00\",\"dateModified\":\"2024-01-12T14:38:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg\",\"width\":1254,\"height\":836},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#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.4 Iniciando o design arquitetural de um &#8220;servi\u00e7o para armazenar e compartilhar arquivos&#8221; (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0\"}]},{\"@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.4 Iniciando o design arquitetural de um \"servi\u00e7o para armazenar e compartilhar arquivos\" (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0 - 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-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/","og_locale":"pt_BR","og_type":"article","og_title":"Cap 4.4 Iniciando o design arquitetural de um \"servi\u00e7o para armazenar e compartilhar arquivos\" (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0 - Manual do Arquiteto de Software","og_description":"No passado era comum que usu\u00e1rios &#8220;perdessem&#8221; arquivos importantes ao trocar de equipamento ou &#8220;formatar o HD&#8221;. Seja por desorganiza\u00e7\u00e3o ou por incapacidade t\u00e9cnica, o fato \u00e9 que algum arquivo importante sempre acabava &#8220;esquecido&#8221; &#8211; sem c\u00f3pias de seguran\u00e7a &#8211; e definitivamente perdido. Compartilhar arquivos tamb\u00e9m j\u00e1 foi um grande desafio &#8211; disquetes, pendrives\u00a0e outras [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-12T14:38:06+00:00","og_image":[{"width":1254,"height":836,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/","name":"Cap 4.4 Iniciando o design arquitetural de um \"servi\u00e7o para armazenar e compartilhar arquivos\" (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0 - 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-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg","datePublished":"2022-06-07T19:18:31+00:00","dateModified":"2024-01-12T14:38:06+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/06\/web_drive_.jpg","width":1254,"height":836},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/iniciando-o-design-arquitetural-de-um-servico-para-armazenar-e-compartilhar-arquivos-como-o-dropbox\/#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.4 Iniciando o design arquitetural de um &#8220;servi\u00e7o para armazenar e compartilhar arquivos&#8221; (como o Dropbox) \/ Cap\u00edtulo 4.4 v 1.0"}]},{"@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\/4687","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=4687"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/4718"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=4687"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4687"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4687"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4687"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}