{"id":79153,"date":"2020-04-24T19:42:43","date_gmt":"2020-04-24T17:42:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom"},"modified":"2020-04-24T19:42:43","modified_gmt":"2020-04-24T17:42:43","slug":"istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","title":{"rendered":"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d1cad1dfa3513b5794c7be916a9dbb4b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Com o aumento da experi\u00eancia no setor de TI, voc\u00ea come\u00e7a a perceber que os sistemas t\u00eam seu pr\u00f3prio car\u00e1ter. Eles podem ser obedientes, silenciosos, temperamentais ou severos. Podem atrair ou repelir. De uma forma ou de outra, voc\u00ea precisa 'negociar' com eles, manobrando entre os 'perigos ocultos' e construindo cadeias de intera\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>E chegou a nossa vez de construir uma plataforma em nuvem, e para isso foi necess\u00e1rio 'persuadir' algumas subsistemas a trabalharem conosco. Felizmente, temos nossa 'linguagem API', m\u00e3os habilidosas e uma grande dose de entusiasmo. <\/p>\n<p><\/p>\n<p>Neste artigo n\u00e3o haver\u00e1 hardcore t\u00e9cnico, mas sim uma descri\u00e7\u00e3o dos problemas que enfrentamos ao construir a nuvem. Decidi descrever nosso caminho como uma leve fic\u00e7\u00e3o t\u00e9cnica sobre como buscamos um idioma comum com os sistemas e o que resultou disso. <\/p>\n<p><\/p>\n<p>Bem-vindo ao conte\u00fado.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"nachalo-puti\">In\u00edcio da jornada<\/h3>\n<p><\/p>\n<p>H\u00e1 algum tempo, nossa equipe recebeu a tarefa de lan\u00e7ar uma plataforma em nuvem para nossos clientes. T\u00ednhamos o apoio da dire\u00e7\u00e3o, recursos, uma pilha de hardware e liberdade na escolha das tecnologias para implementar a parte de software do servi\u00e7o.<\/p>\n<p><\/p>\n<p>Havia tamb\u00e9m uma s\u00e9rie de requisitos:<\/p>\n<p><\/p>\n<ul>\n<li>o servi\u00e7o precisava de um painel de controle amig\u00e1vel;<\/li>\n<li>a plataforma deve ser integrada ao sistema de faturamento existente;<\/li>\n<li>a parte software-hardware: OpenStack + Tungsten Fabric (Open Contrail), que nossos engenheiros aprenderam a 'preparar' bastante bem.<\/li>\n<\/ul>\n<p><\/p>\n<p>Falaremos sobre como a equipe foi formada, como a interface do painel foi desenvolvida e como as decis\u00f5es de design foram tomadas em outra ocasi\u00e3o, se a comunidade do Habr tiver interesse.<br \/>\nAs ferramentas que decidimos usar:<\/p>\n<p><\/p>\n<ul>\n<li>Python + Flask + Swagger + SQLAlchemy \u2014 uma combina\u00e7\u00e3o padr\u00e3o de Python;<\/li>\n<li>Vue.js para o frontend;<\/li>\n<li>decidimos realizar a intera\u00e7\u00e3o entre componentes e servi\u00e7os usando Celery sobre AMQP.<\/li>\n<\/ul>\n<p><\/p>\n<p>Antecipando perguntas sobre a escolha do Python, explicarei. A linguagem encontrou seu espa\u00e7o em nossa empresa e ao seu redor se formou uma pequena, mas significativa cultura. Portanto, decidimos come\u00e7ar a construir o servi\u00e7o exatamente com ela. Especialmente porque a velocidade de desenvolvimento em tais tarefas normalmente \u00e9 um fator decisivo. <\/p>\n<p><\/p>\n<p>Ent\u00e3o, vamos come\u00e7ar nosso conhecimento.<\/p>\n<p><\/p>\n<h3 id=\"molchalivyy-bill--billing\">Bill Silencioso \u2014 faturamento<\/h3>\n<p><\/p>\n<p><em>N\u00f3s conhec\u00edamos esse cara h\u00e1 muito tempo. Ele sempre sentava ao nosso lado e contava algo em sil\u00eancio. \u00c0s vezes, ele nos encaminhava solicita\u00e7\u00f5es de usu\u00e1rios, gerava faturas para clientes, gerenciava servi\u00e7os. Um cara trabalhador comum. No entanto, havia algumas dificuldades. Ele era silencioso, \u00e0s vezes pensativo e frequentemente \u2014 introspectivo.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/262bb5c9d6234041d264f8e041e647fe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O billing foi o primeiro sistema que tentamos integrar. E a primeira dificuldade apareceu ao processar servi\u00e7os.<\/p>\n<p><\/p>\n<p>Por exemplo, ao criar ou deletar, a tarefa vai para a fila interna do billing. Assim, foi implementado um sistema de trabalho ass\u00edncrono com servi\u00e7os. Para processar nossos tipos de servi\u00e7os, precis\u00e1vamos 'enfileirar' nossas tarefas nessa fila. E aqui nos deparamos com o problema: a falta de documenta\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/4d96251df014e315308c94f848bc6cd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De acordo com a descri\u00e7\u00e3o da API, essa tarefa poderia ser resolvida, mas n\u00e3o t\u00ednhamos tempo para engenharia reversa, ent\u00e3o levamos a l\u00f3gica para fora e organizamos uma fila de tarefas sobre o RabbitMQ. A opera\u00e7\u00e3o sobre o servi\u00e7o \u00e9 iniciada pelo cliente no painel de controle, envolta em uma 'tarefa' Celery no backend e executada do lado do billing e OpenStack. O Celery permite gerenciar tarefas de forma bastante conveniente, organizando repeti\u00e7\u00f5es e monitorando o estado. Para mais informa\u00e7\u00f5es sobre o 'celery', voc\u00ea pode ler, por exemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/433476\/\">aqui<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, o billing n\u00e3o interrompeu o projeto quando o dinheiro acabou. Conversando com os desenvolvedores, descobrimos que ao calcular estat\u00edsticas (e precisamos implementar essa l\u00f3gica), h\u00e1 uma complexa interconex\u00e3o de regras de interrup\u00e7\u00e3o. Mas esses modelos n\u00e3o se ajustam bem \u00e0 nossa realidade. Tamb\u00e9m realizamos isso atrav\u00e9s de tarefas no Celery, transferindo a l\u00f3gica de gerenciamento de servi\u00e7os para o backend. <\/p>\n<p><\/p>\n<p>Ambos os problemas mencionados levaram a um c\u00f3digo um pouco inflado e no futuro teremos que nos dedicar a refatorar para extrair a l\u00f3gica de trabalho com tarefas para um servi\u00e7o separado. Tamb\u00e9m precisamos armazenar parte das informa\u00e7\u00f5es dos usu\u00e1rios e seus servi\u00e7os em nossas tabelas para manter essa l\u00f3gica.<\/p>\n<p><\/p>\n<p>Mais um problema \u2014 a falta de comunica\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Para algumas solicita\u00e7\u00f5es \u00e0 API, o Billy responde silenciosamente com 'Ok'. Por exemplo, isso aconteceu quando fizemos lan\u00e7amentos de pagamentos prometidos durante o teste (sobre o qual falaremos mais tarde). As solicita\u00e7\u00f5es foram executadas corretamente e n\u00e3o vimos erros. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d03f2c381fd39dbf33f2a0c3eeb1294d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Foi necess\u00e1rio estudar os logs ao trabalhar com o sistema atrav\u00e9s da interface. Descobriu-se que o billing realiza essas solicita\u00e7\u00f5es, alterando o escopo para um usu\u00e1rio espec\u00edfico, por exemplo, admin, passando-o no par\u00e2metro su.<\/p>\n<p><\/p>\n<p>No geral, apesar das lacunas na documenta\u00e7\u00e3o e algumas falhas na API, tudo correu bastante bem. Os logs podem ser lidos mesmo sob alta carga, se entender como est\u00e3o estruturados e o que se deve buscar. A estrutura do banco de dados \u00e9 complexa, mas bastante l\u00f3gica e at\u00e9 atraente em certos aspectos.<\/p>\n<p><\/p>\n<p>Assim, resumindo, os principais problemas que enfrentamos na fase de intera\u00e7\u00e3o est\u00e3o relacionados \u00e0s particularidades de implementa\u00e7\u00e3o do sistema espec\u00edfico: <\/p>\n<p><\/p>\n<ul>\n<li>funcionalidades n\u00e3o documentadas que nos afetaram de alguma forma;<\/li>\n<li>c\u00f3digo-fonte fechado (o billing foi escrito em C++), o que significa que n\u00e3o foi poss\u00edvel resolver o problema 1 de nenhuma maneira al\u00e9m do \"m\u00e9todo de tentativa e erro\".<\/li>\n<\/ul>\n<p><\/p>\n<p>Felizmente, o produto possui uma API bastante robusta e integramos as seguintes subsistemas em nosso painel de controle:<\/p>\n<p><\/p>\n<ul>\n<li>m\u00f3dulo de suporte t\u00e9cnico \u2014 solicita\u00e7\u00f5es do painel de controle s\u00e3o \"proxies\" para o billing de forma transparente para os clientes do servi\u00e7o;<\/li>\n<li>m\u00f3dulo financeiro \u2014 permite a emiss\u00e3o de faturas para clientes atuais, realizar cobran\u00e7as e gerar documentos de pagamento;<\/li>\n<li>m\u00f3dulo de gerenciamento de servi\u00e7os \u2014 para isso, tivemos que implementar nosso pr\u00f3prio manipulador. A expansibilidade do sistema nos favoreceu e \"ensinamos\" o Billing a um novo tipo de servi\u00e7o.<br \/>\nDeu trabalho, mas, de qualquer forma, acho que conseguiremos nos entender com o Billing.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"progulki-po-volframovym-polyam--tungsten-fabric\">Caminhadas pelos campos de tungst\u00eanio \u2014 Tungsten Fabric<\/h3>\n<p><\/p>\n<p><em>Campos de tungst\u00eanio, repletos de centenas de fios, que transmitem milhares de bits de informa\u00e7\u00e3o. A informa\u00e7\u00e3o \u00e9 coletada em \"pacotes\", analisada e complexas rotas s\u00e3o tra\u00e7adas, como que por m\u00e1gica.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/9b6dd46d9f15e0e3393a8c1222abbf2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este \u00e9 o dom\u00ednio do segundo sistema com o qual tivemos que nos familiarizar \u2014 Tungsten Fabric (TF), anteriormente conhecido como OpenContrail. Sua tarefa \u00e9 gerenciar os equipamentos de rede, fornecendo uma abstra\u00e7\u00e3o de software para n\u00f3s, como usu\u00e1rios. TF \u00e9 uma SDN que encapsula a l\u00f3gica complexa de opera\u00e7\u00e3o com os equipamentos de rede. H\u00e1 um bom artigo sobre a tecnologia em si, por exemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/muk\/blog\/251959\/\">aqui<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>O sistema est\u00e1 integrado ao OpenStack (de que falaremos a seguir) atrav\u00e9s do plugin Neutron. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/5abe3992efaab3e016a0c51dc0070a94.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Intera\u00e7\u00e3o dos servi\u00e7os OpenStack.<\/em><\/p>\n<p><\/p>\n<p>Essa sistema foi apresentado a n\u00f3s pela equipe de opera\u00e7\u00f5es. Utilizamos a API do sistema para gerenciar a pilha de rede de nossos servi\u00e7os. At\u00e9 agora, n\u00e3o tivemos problemas s\u00e9rios ou inconvenientes (n\u00e3o posso falar pelos colegas de opera\u00e7\u00f5es), mas houve algumas situa\u00e7\u00f5es curiosas na intera\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>A primeira parecia assim: comandos que exigiam a sa\u00edda de grandes quantidades de dados no console da inst\u00e2ncia ao conectar via SSH simplesmente \"congelavam\" a conex\u00e3o, enquanto pelo VNC tudo funcionava corretamente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/02bc97d63a1299e1dda08fce0f10fb97.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para quem n\u00e3o est\u00e1 familiarizado com o problema, isso pode parecer engra\u00e7ado: ls \/root funciona corretamente, enquanto, por exemplo, top \"congela\" completamente. Felizmente, j\u00e1 enfrentamos problemas semelhantes. Isso foi resolvido ajustando o MTU no caminho das n\u00f3s de computa\u00e7\u00e3o at\u00e9 os roteadores. A prop\u00f3sito, isso n\u00e3o \u00e9 um problema do TF.<\/p>\n<p><\/p>\n<p>O pr\u00f3ximo problema estava logo \u00e0 frente. Em um \"belo\" momento, a m\u00e1gica do roteamento desapareceu, assim, de repente. O TF parou de gerenciar o roteamento no hardware.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/db2a75ffdf2940b2ca90f73835f7a321.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trabalhamos com OpenStack a partir do n\u00edvel de admin e, em seguida, mudamos para o n\u00edvel do usu\u00e1rio necess\u00e1rio. O SDN parece \"interceptar\" o escopo do usu\u00e1rio sob o qual as a\u00e7\u00f5es s\u00e3o executadas. O problema \u00e9 que essa mesma conta de administrador \u00e9 usada para a conex\u00e3o entre o TF e o OpenStack. No momento da mudan\u00e7a para o usu\u00e1rio, a \"m\u00e1gica\" desaparecia. A solu\u00e7\u00e3o foi criar uma conta separada para trabalhar com o sistema. Isso permitiu operar sem quebrar a funcionalidade da integra\u00e7\u00e3o.<\/p>\n<p><\/p>\n<h3 id=\"silikonovye-formy-zhizni--openstack\">Formas de vida de silicone \u2014 OpenStack<\/h3>\n<p><\/p>\n<p><em>Uma criatura de silicone de forma peculiar habita perto dos campos de tungst\u00eanio. Ela mais se parece com uma crian\u00e7a gigante, que com um \u00fanico golpe pode nos esmagar, mas n\u00e3o exibe agressividade percept\u00edvel. N\u00e3o causa medo, mas seu tamanho inspira preocupa\u00e7\u00e3o. Assim como a complexidade do que acontece ao seu redor.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/8622d43e0cb963bc9ef2a2ce59a32499.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenStack \u00e9 o n\u00facleo de nossa plataforma.<\/p>\n<p><\/p>\n<p>OpenStack possui v\u00e1rias subsistemas, entre os quais utilizamos ativamente Nova, Glance e Cinder. Cada um deles tem sua pr\u00f3pria API. Nova \u00e9 respons\u00e1vel pelos recursos de computa\u00e7\u00e3o e cria\u00e7\u00e3o de inst\u00e2ncias, Cinder \u2014 gerenciamento de volumes e suas c\u00f3pias de seguran\u00e7a, Glance \u2014 servi\u00e7o de imagens, que gerencia os templates do sistema operacional e suas metainforma\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>Cada servi\u00e7o \u00e9 executado em um cont\u00eainer, e o corretor de mensagens \u00e9 o \"coelho branco\" \u2014 RabbitMQ.<\/p>\n<p><\/p>\n<p>Esse sistema nos trouxe mais problemas inesperados.<\/p>\n<p><\/p>\n<p>O primeiro problema n\u00e3o tardou a aparecer quando tentamos conectar um volume adicional ao servidor. A API do Cinder se recusava categoricamente a executar essa tarefa. Para ser mais preciso, se acreditarmos no pr\u00f3prio OpenStack, a conex\u00e3o \u00e9 estabelecida, mas dentro do servidor virtual, o dispositivo de disco est\u00e1 ausente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/b4755d893f3f8ad7d7aeab3af69f35cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Decidimos \"contornar\" a situa\u00e7\u00e3o e solicitamos a mesma a\u00e7\u00e3o \u00e0 API do Nova. O resultado \u2014 o dispositivo \u00e9 corretamente conectado e est\u00e1 dispon\u00edvel dentro do servidor. Parece que o problema surge quando o armazenamento em bloco n\u00e3o responde ao Cinder.<\/p>\n<p><\/p>\n<p>Uma nova dificuldade nos aguardava ao trabalhar com discos. N\u00e3o conseguimos desconectar o volume do sistema do servidor.<\/p>\n<p><\/p>\n<p>Novamente, o pr\u00f3prio OpenStack \"garante\" que a conex\u00e3o foi encerrada e que agora \u00e9 poss\u00edvel trabalhar corretamente com o volume separadamente. Mas a API se recusava categoricamente a realizar opera\u00e7\u00f5es sobre o disco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/952fd7cd11181605c52a7df71cd4f69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui decidimos n\u00e3o entrar em conflito e mudar a perspectiva sobre a l\u00f3gica de funcionamento do servi\u00e7o. J\u00e1 que existe uma inst\u00e2ncia, deve haver tamb\u00e9m um volume de sistema. Portanto, o usu\u00e1rio n\u00e3o pode, por enquanto, excluir ou desconectar o \"disco\" do sistema sem remover o \"servidor\".<\/p>\n<p><\/p>\n<p>O OpenStack \u00e9 um complexo sistema bastante complicado com sua l\u00f3gica de intera\u00e7\u00e3o e uma API intrincada. A documenta\u00e7\u00e3o bastante detalhada e, claro, o m\u00e9todo de tentativas e erros (como poderia ser diferente) nos socorrem.<\/p>\n<p><\/p>\n<h3 id=\"testovyy-zapusk\">Teste inicial<\/h3>\n<p><\/p>\n<p>Realizamos o teste inicial em dezembro do ano passado. O objetivo principal era verificar o funcionamento do nosso projeto em modo real, tanto do lado t\u00e9cnico quanto do lado UX. A audi\u00eancia foi convidada de forma seletiva e o teste foi fechado. No entanto, tamb\u00e9m deixamos a possibilidade de solicitar acesso ao teste em nosso site.<\/p>\n<p><\/p>\n<p>O pr\u00f3prio teste, claro, n\u00e3o aconteceu sem momentos c\u00f4micos, pois nossas aventuras est\u00e3o apenas come\u00e7ando. <\/p>\n<p><\/p>\n<p>Primeiro, subestimamos o interesse no projeto e tivemos que adicionar n\u00f3s de computa\u00e7\u00e3o rapidamente durante o teste. Um caso comum para um cluster, mas aqui tamb\u00e9m havia nuances. Na documenta\u00e7\u00e3o para a vers\u00e3o espec\u00edfica do TF, est\u00e1 indicada uma vers\u00e3o espec\u00edfica do n\u00facleo, na qual o funcionamento com o vRouter foi testado. Decidimos iniciar n\u00f3s com n\u00facleos mais recentes. Como resultado, o TF n\u00e3o recebeu rotas dos n\u00f3s. Tive que reverter os n\u00facleos de emerg\u00eancia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/377208246d5e396317fb934a35ed1227.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Outro detalhe curioso est\u00e1 relacionado \u00e0 funcionalidade do bot\u00e3o \"mudar senha\" na \u00e1rea do usu\u00e1rio. <\/p>\n<p><\/p>\n<p>Decidimos usar JWT para gerenciar o acesso ao painel pessoal, para evitar trabalhar com sess\u00f5es. Como os sistemas s\u00e3o diversificados e amplamente dispersos, gerenciamos nosso pr\u00f3prio token, no qual 'embutimos' as sess\u00f5es da bilhetagem e o token do OpenStack. Ao alterar a senha, o token, obviamente, 'expira', uma vez que os dados do usu\u00e1rio j\u00e1 se tornam inv\u00e1lidos e \u00e9 necess\u00e1rio reemitir. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/daa27256d0b888b2c59d4bc6129f600d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perdemos este ponto de vista e n\u00e3o t\u00ednhamos recursos para rapidamente completar essa parte. Tivemos que cortar a funcionalidade logo antes do lan\u00e7amento do teste.<br \/>\nAtualmente, fazemos logout do usu\u00e1rio se a senha for alterada.<\/p>\n<p><\/p>\n<p>Apesar desses detalhes, os testes correram bem. Em algumas semanas, cerca de 300 pessoas nos visitaram. Conseguimos ver o produto pelos olhos dos usu\u00e1rios, test\u00e1-lo em a\u00e7\u00e3o e coletar feedback de qualidade. <\/p>\n<p><\/p>\n<h3 id=\"prodolzhenie-sleduet\">Continua<\/h3>\n<p><\/p>\n<p>Para muitos de n\u00f3s, este \u00e9 o primeiro projeto de tal escala. Aprendemos v\u00e1rias li\u00e7\u00f5es valiosas sobre como trabalhar em equipe, tomar decis\u00f5es arquitet\u00f4nicas e de design. Como integrar sistemas complexos com recursos limitados e lev\u00e1-los para produ\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>\u00c9 claro que h\u00e1 muito a se aprimorar tanto no c\u00f3digo quanto nas interfaces de integra\u00e7\u00e3o dos sistemas. O projeto \u00e9 bastante jovem, mas estamos cheios de ambi\u00e7\u00f5es para transform\u00e1-lo em um servi\u00e7o confi\u00e1vel e conveniente.<\/p>\n<p><\/p>\n<p>J\u00e1 conseguimos convencer os sistemas. Bill, obedientemente, est\u00e1 cuidando da contagem, faturas e solicita\u00e7\u00f5es de usu\u00e1rios em seu cantinho. A \"m\u00e1gica\" dos campos de tungst\u00eanio nos garante uma conex\u00e3o est\u00e1vel. E o OpenStack, de vez em quando, faz birra, gritando algo como \"'WSREP ainda n\u00e3o preparou o n\u00f3 para uso do aplicativo\". Mas isso \u00e9 uma hist\u00f3ria completamente diferente\u2026<\/p>\n<p><\/p>\n<p>Recentemente, lan\u00e7amos o servi\u00e7o.<br \/>\nVoc\u00ea pode descobrir todos os detalhes em nosso <noindex><a rel=\"nofollow\" href=\"https:\/\/clo.ru?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=product&amp;utm_term=first_clo\">site<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o de nuvem, temperada com cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/32550980b529a5d7b395b3962218e53e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Equipe de desenvolvimento CLO<\/em><\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Links \u00dateis<\/b><\/p>\n<p><strong>OpenStack<\/strong><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/nova\/latest\/\">https:\/\/docs.openstack.org\/nova\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/keystone\/latest\/\">https:\/\/docs.openstack.org\/keystone\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/cinder\/latest\/\">https:\/\/docs.openstack.org\/cinder\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/glance\/latest\/\">https:\/\/docs.openstack.org\/glance\/latest\/<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Tungsten Fabric<\/strong><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/docs.tungsten.io\/en\/latest\/user\/getting-started\/index.html\">http:\/\/docs.tungsten.io\/en\/latest\/user\/getting-started\/index.html<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.juniper.net\/documentation\/en_US\/contrail-cloud10.0\/topics\/concept\/contrail-cloud-openstack-integration-overview.html\">https:\/\/www.juniper.net\/documentation\/en_US\/contrail-cloud10.0\/topics\/concept\/contrail-cloud-openstack-integration-overview.html<\/a><\/noindex><\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/first\/blog\/493606\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u043b\u0430\u0434\u0438\u0441\u0442\u044b\u043c\u0438, \u043c\u043e\u043b\u0447\u0430\u043b\u0438\u0432\u044b\u043c\u0438, \u0432\u0437\u0431\u0430\u043b\u043c\u043e\u0448\u043d\u044b\u043c\u0438, \u0441\u0443\u0440\u043e\u0432\u044b\u043c\u0438. \u041c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043a \u0441\u0435\u0431\u0435 \u0438\u043b\u0438 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u00ab\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f\u00bb \u0441 \u043d\u0438\u043c\u0438, \u043b\u0430\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u00ab\u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438\u00bb \u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412\u043e\u0442 \u0438 \u043d\u0430\u043c \u0432\u044b\u043f\u0430\u043b\u0430 \u0447\u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u00ab\u0443\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u00bb [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79154,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a\u043e\u043c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-24T17:42:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-24T17:42:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47A hist\u00f3ria da cria\u00e7\u00e3o do servi\u00e7o em nuvem, temperada com cyberpunk | ProHoster","description":"Com o crescimento da experi\u00eancia.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a\u043e\u043c | ProHoster","og:description":"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-24T17:42:43+00:00","article:modified_time":"2020-04-24T17:42:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79153","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:43:24","updated":"2022-10-02 03:25:48","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/79153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=79153"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/79153\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/79154"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=79153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=79153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=79153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}