<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Guilherme Marcial</title>
    <description>The latest articles on Forem by Guilherme Marcial (@gmarcial).</description>
    <link>https://forem.com/gmarcial</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F395332%2Fc000308f-5cf5-43f2-8b3f-546b7a9680fd.jpeg</url>
      <title>Forem: Guilherme Marcial</title>
      <link>https://forem.com/gmarcial</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gmarcial"/>
    <language>en</language>
    <item>
      <title>Construindo um serviço de log distribuido: Write-Ahead log</title>
      <dc:creator>Guilherme Marcial</dc:creator>
      <pubDate>Mon, 12 Jun 2023 06:21:26 +0000</pubDate>
      <link>https://forem.com/gmarcial/implementacao-do-write-ahead-log-58je</link>
      <guid>https://forem.com/gmarcial/implementacao-do-write-ahead-log-58je</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Sistemas distribuídos é um dos temas do qual tenho muito interesse, para começar uma trilha de estudos sobre, resolvi começar com uma abordagem prática, construindo algo real que proporcione uma visão geral e seja próximo da minha atual realidade, optei pelo livro &lt;a href="https://www.amazon.com/Distributed-Services-Go-Reliable-Maintainable/dp/1680507605"&gt;Distributed Services with Go: Your Guide to Reliable, Scalable, and Maintainable Systems&lt;/a&gt; do &lt;a href="https://www.linkedin.com/in/travisjeffery"&gt;Travis Jeffery&lt;/a&gt;, onde a proposta do livro é entender sistemas distribuídos ao construir um&lt;/p&gt;

&lt;p&gt;Essa série faz parte do estudo prático sobre a jornada de construção do serviço de log distribuído proposto no livro, onde consiste em armazenar, compartilhar e processar dados ordenadamente, operações atômicas usando log.&lt;/p&gt;

&lt;p&gt;Seguindo um caminho parecido do qual &lt;a href="https://www.linkedin.com/in/travisjeffery"&gt;Travis Jeffery&lt;/a&gt; fez ao construir o &lt;a href="https://github.com/travisjeffery/jocko"&gt;jocko&lt;/a&gt;, uma implementação do Kafka em Go.&lt;/p&gt;

&lt;p&gt;Repositório do projeto: &lt;a href="https://github.com/gmarcial/gproglog"&gt;gmarcial/gproglog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Logs
&lt;/h2&gt;

&lt;p&gt;A ideia da construção do serviço é entender os conceitos essenciais por trás do sistemas distribuídos, como os logs.&lt;/p&gt;

&lt;p&gt;Começaremos pelo core do serviço, o write-ahead log, solução utilizada em sistemas distribuídos para atomicidade e durabilidade, replicação/distribuição dos dados, backup, recuperação de falha, consenso e mais.&lt;/p&gt;

&lt;p&gt;Alguns exemplos de sistemas que usam: Bancos de dados, filas, algoritmos de consenso como paxos e raft, storage engine, change data capture (cdc) e data-stream.&lt;/p&gt;

&lt;p&gt;O Write-Ahead Log é uma abstração de armazenamento append-only de registros em sequência, ordenada pela ordem da ocorrência dos registros e cada registro recebe um identificador único e sequencial, indexando o registro a partir do deslocamento no momento que o registro ocorreu.&lt;/p&gt;

&lt;p&gt;Novos registros são adicionados ao final e a leitura ocorre no início do log, seguindo a sequência e ordem que os registros aconteceram, do mais antigo para o mais novo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--URxIDs9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/11ldkj8vqah81u1kjbj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--URxIDs9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/11ldkj8vqah81u1kjbj3.png" alt="Representação visual do log." width="396" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para uma explicação profunda e detalhada sobre o conceito, sugiro a leitura do artigo &lt;a href="https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying"&gt;The Log: What every software engineer should know about real-time data's unifying abstraction&lt;/a&gt; do &lt;a href="https://www.linkedin.com/in/jaykreps"&gt;Jay Kreps&lt;/a&gt;, um dos criadores do Kafka, precursor de muito do que temos hoje de event-stream, stream processing e real-time a partir das experiências da &lt;a href="https://engineering.linkedin.com/"&gt;engenharia do Linkedin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No artigo ele aborda não somente o conceito, mas que os logs são o coração dos sistemas distribuídos, uso, integração, real-time stream processing, surgimento do kafka e como esse conceito está presente no nosso dia a dia, sendo o kafka um log como serviço utilizado amplamente.&lt;/p&gt;

&lt;p&gt;Outro artigo que recomendo, muito interessante e que é correlacionado, é o &lt;a href="https://martin.kleppmann.com/2015/01/29/stream-processing-event-sourcing-reactive-cep.html"&gt;Stream processing, Event sourcing, Reactive, CEP… and making sense of it all&lt;/a&gt; do &lt;a href="https://www.linkedin.com/in/martinkleppmann"&gt;Martin Kleppmann&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solução
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nQtL_cQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vozldhth23lrxzb7944o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nQtL_cQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vozldhth23lrxzb7944o.png" alt="Componentes" width="681" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O serviço será cliente do Log para gerenciamento dos registros.&lt;/p&gt;

&lt;p&gt;A solução consiste em uma API para operar o log, essencialmente a escrita e leitura dos registros que são estruturados em segmentos.&lt;/p&gt;

&lt;p&gt;Para a escrita de um novo registro o &lt;code&gt;Log&lt;/code&gt; irá delegar para o &lt;code&gt;Segment&lt;/code&gt; ativo, onde o processo envolve armazenar o registro através da &lt;code&gt;Store&lt;/code&gt; e o indexar através do &lt;code&gt;Index&lt;/code&gt; para posterior leitura.&lt;/p&gt;

&lt;p&gt;Da mesma forma, para a leitura de um registro o &lt;code&gt;Log&lt;/code&gt; irá delegar para o &lt;code&gt;Segment&lt;/code&gt; ativo, onde o processo envolve encontrar o registro no &lt;code&gt;Index&lt;/code&gt; e caso ele exista o recuperar na &lt;code&gt;Store&lt;/code&gt; através do seu deslocamento.&lt;/p&gt;

&lt;p&gt;Conforme o limite do &lt;code&gt;Segment&lt;/code&gt; atual é atingido, um novo é criado e indicado como ativo.&lt;/p&gt;

&lt;p&gt;Visão de como o log é estruturado, sendo representado de verde o &lt;code&gt;Segment&lt;/code&gt; ativo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mTT6xI71--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kywa5plo2w162e0r6c28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mTT6xI71--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kywa5plo2w162e0r6c28.png" alt="estrutura" width="561" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referência da implementação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/gmarcial/gproglog/blob/main/internal/log/store.go"&gt;Store&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/gmarcial/gproglog/blob/main/internal/log/index.go"&gt;Index&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/gmarcial/gproglog/blob/main/internal/log/segment.go"&gt;Segment&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/gmarcial/gproglog/blob/main/internal/log/log.go"&gt;Log&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Próximos passos
&lt;/h2&gt;

&lt;p&gt;Com a implementação do log os próximos passos na construção do serviço é prover e expor essas funcionalidades a na rede, para que possa operar.&lt;/p&gt;

&lt;p&gt;Isso envolve vários passos até a distribuição e deploy propriamente dito no decorrer da série de estudos do livro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extras
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Livro I Heart Logs: Event Data, Stream Processing, and Data Integration
&lt;/h3&gt;

&lt;p&gt;Livro do &lt;a href="https://www.linkedin.com/in/jaykreps"&gt;Jay Kreps&lt;/a&gt; sobre logs, aparente evolução e continuação do seu post sobre logs, ainda não li, mas parece interessante.&lt;/p&gt;

&lt;p&gt;Até o momento em que escrevo, é possível obter o livro gratuitamente através da Confluent nesse &lt;a href="https://www.confluent.io/ebook/i-heart-logs-event-data-stream-processing-and-data-integration/?utm_medium=sem&amp;amp;utm_source=google&amp;amp;utm_campaign=ch.sem_br.nonbrand_tp.prs_tgt.content-search_mt.xct_rgn.latam_lng.eng_dv.all_con.ihl&amp;amp;utm_term=i%20love%20logs&amp;amp;creative=&amp;amp;device=c&amp;amp;placement=&amp;amp;gad=1&amp;amp;gclid=CjwKCAjw4ZWkBhA4EiwAVJXwqQYjKEoFRAZiaVBGUp6mwn6U8Vharcf7X_6bLSXl2o7d86Qpm7mYyxoCWMoQAvD_BwE"&gt;link&lt;/a&gt;, a alternativa é &lt;a href="https://www.amazon.com/Heart-Logs-Stream-Processing-Integration/dp/1491909382?language=pt_BR&amp;amp;currency=BRL"&gt;comprar&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Valencia: A Log-Structured On-Disk Hash
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/jkreps/valencia"&gt;Valencia&lt;/a&gt;, implementação de um Log do &lt;a href="https://www.linkedin.com/in/jaykreps"&gt;Jay Kreps&lt;/a&gt;, muito parecida com a versão do &lt;a href="https://www.linkedin.com/in/travisjeffery"&gt;Travis Jeffery&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Patterns of Distributed Systems por Unmesh Joshi
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/unmeshjoshi"&gt;Unmesh Joshi&lt;/a&gt; tem um post no blog &lt;a href="https://martinfowler.com/"&gt;martinfowler&lt;/a&gt; sobre &lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/"&gt;padrões de sistemas distribuídos&lt;/a&gt;, neles contém vários relacionados a log, onde vários são aplicados na solução do serviço do livro como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/wal.html#examples"&gt;Write-Ahead Log&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/log-segmentation.html"&gt;Segmented Log&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/low-watermark.html"&gt;Low-Water Mark&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/replicated-log.html"&gt;Replicated Log&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/singular-update-queue.html"&gt;Singular Update Queue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Distributed-Services-Go-Reliable-Maintainable/dp/1680507605"&gt;Distributed Services with Go: Your Guide to Reliable, Scalable, and Maintainable Systems.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying"&gt;The Log: What every software engineer should know about real-time data's unifying abstraction.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martin.kleppmann.com/2015/01/29/stream-processing-event-sourcing-reactive-cep.html"&gt;Stream processing, Event sourcing, Reactive, CEP… and making sense of it all.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/articles/patterns-of-distributed-systems/"&gt;Patterns of Distributed Systems&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>architecture</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Core Pay: System Design</title>
      <dc:creator>Guilherme Marcial</dc:creator>
      <pubDate>Mon, 16 Aug 2021 21:59:29 +0000</pubDate>
      <link>https://forem.com/gmarcial/core-pay-solucao-5af5</link>
      <guid>https://forem.com/gmarcial/core-pay-solucao-5af5</guid>
      <description>&lt;h1&gt;
  
  
  Index
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;O Problema&lt;/li&gt;
&lt;li&gt;
A Solução

&lt;ul&gt;
&lt;li&gt;Expectativa de uso&lt;/li&gt;
&lt;li&gt;Atributos de qualidade&lt;/li&gt;
&lt;li&gt;Features&lt;/li&gt;
&lt;li&gt;Resumo&lt;/li&gt;
&lt;li&gt;Arquitetura e explicação detalhada&lt;/li&gt;
&lt;li&gt;Observabilidade&lt;/li&gt;
&lt;li&gt;Pontos de falha&lt;/li&gt;
&lt;li&gt;Evolutiva&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Este artigo é a abertura e explicação da solução inicial do projeto &lt;a href="https://github.com/corelab1/corepay"&gt;Core Pay 💰&lt;/a&gt;, uma iniciativa pessoal &lt;a href="https://github.com/corelab1"&gt;CoreLab 📦&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Um sistema central(core) para soluções financeiras(vulgo fintechs) comuns ou disruptivas, servindo como a interface principal para operações financeiras base 💰.&lt;/p&gt;




&lt;h1&gt;
  
  
  O Problema
&lt;/h1&gt;

&lt;p&gt;Com o boom das fintechs, sempre tenho visto uma nova que não conhecia, indo des de negócios comuns e de contextos genéricos como contas digitais, e-wallets, pagamentos, plataformas de moeda eletrónica, crédito até disruptivos, aplicados em contextos e setores específicos como imobiliário, automobilístico, logística, beneficios, autopeças e por assim vai, mas no final todos têm em comum operações financeiras para realizar e dar vida a suas soluções.&lt;/p&gt;

&lt;p&gt;Para cada uma dessas soluções é necessário o desenvolvimento dessa base, ao invés de apenas focar no desenvolvimento da solução principal, utilizando um sistema pronto para essa responsabilidade.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Solução
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Expectativa de uso
&lt;/h2&gt;

&lt;p&gt;A ideia é que novas soluções financeiras genéricas ou disruptivas possam ter como alternativa utilizar um sistema open-source central para realizar as operações financeiras base, podendo assim focar no desenvolvimento das soluções específicas do negócio.&lt;/p&gt;

&lt;p&gt;Pensado para que seja implantado internamente como a principal interface para operações financeiras, onde os demais sistemas integrariam com flexibilidade e configurabilidade ao mesmo para compor a solução como um todo.&lt;/p&gt;

&lt;p&gt;Atuando principalmente como domínio financeiro das soluções.&lt;/p&gt;




&lt;h2&gt;
  
  
  Atributos de qualidade
&lt;/h2&gt;

&lt;p&gt;Representam as capacidades necessárias identificadas que a arquitetura precisa ter para poder suportar e atender o produto concebido, tornando uma solução que atende ao negócio. &lt;/p&gt;

&lt;p&gt;Para que isso aconteça, essas capacidades serviram de guia da concepção e evolução da arquitetura no seu alto a baixo nível, refletindo diretamente nas implementações e o que se espera das funcionalidades, para que esteja alinhada e continue alinhada como uma solução para o negócio. &lt;/p&gt;

&lt;p&gt;O objetivo é deixar expresso e registrado as capacidades identificadas, resumidamente expressar o conceito e uma breve justificativa, que estará aprofundada, expressa detalhadamente no ciclo de desenvolvimento e medidas continuamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base
&lt;/h2&gt;

&lt;p&gt;Capacidades base para contribuir para a vida útil da aplicação, possibilitando ser continuamente funcional, mantida e evoluída, sem estar presa aos criadores, possibilitando também por novos contribuidores e mantenedores.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Readability&lt;/li&gt;
&lt;li&gt;Testability&lt;/li&gt;
&lt;li&gt;Evolvability

&lt;ul&gt;
&lt;li&gt;Modifiability &lt;/li&gt;
&lt;li&gt;Modularity&lt;/li&gt;
&lt;li&gt;Simplicity &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Negócio
&lt;/h2&gt;

&lt;p&gt;Capacidades requisitadas para que o negócio possa ser suportado além do produto ser funcional, é preciso que além da entrega da funcionalidade, a aplicação opere essa funcionalidade conforme a demanda e dentro do contexto do negócio.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auditability&lt;/li&gt;
&lt;li&gt;Atomicity&lt;/li&gt;
&lt;li&gt;Isolability&lt;/li&gt;
&lt;li&gt;Consistency&lt;/li&gt;
&lt;li&gt;Durability&lt;/li&gt;
&lt;li&gt;Integrity &lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Availability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Infraestrutura
&lt;/h2&gt;

&lt;p&gt;Capacidades requisitadas para que a aplicação possa ser suportada, para conforme as necessidades a aplicação operar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observabiltity&lt;/li&gt;
&lt;li&gt;Configurability&lt;/li&gt;
&lt;li&gt;Fault Tolerance&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Mais detalhes na documentação do projeto.
&lt;/h5&gt;




&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Algumas das features relacionas ao core business:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Transaction account
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Check balance&lt;/li&gt;
&lt;li&gt;Deposit&lt;/li&gt;
&lt;li&gt;Withdraw&lt;/li&gt;
&lt;li&gt;Pay&lt;/li&gt;
&lt;li&gt;Transfer&lt;/li&gt;
&lt;li&gt;Account statement and receipt&lt;/li&gt;
&lt;li&gt;Open&lt;/li&gt;
&lt;li&gt;Close&lt;/li&gt;
&lt;li&gt;Block&lt;/li&gt;
&lt;li&gt;Unlock&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Lending/Loan
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Overdraft&lt;/li&gt;
&lt;li&gt;Active&lt;/li&gt;
&lt;li&gt;Desactive&lt;/li&gt;
&lt;li&gt;Adjust limit&lt;/li&gt;
&lt;li&gt;Pay back&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Credit
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Active&lt;/li&gt;
&lt;li&gt;Desactive&lt;/li&gt;
&lt;li&gt;Check limit&lt;/li&gt;
&lt;li&gt;Adjust limit&lt;/li&gt;
&lt;li&gt;Adjust use limit&lt;/li&gt;
&lt;li&gt;Pay&lt;/li&gt;
&lt;li&gt;Instalment pay&lt;/li&gt;
&lt;li&gt;Credit statement and receipt&lt;/li&gt;
&lt;li&gt;Invoice&lt;/li&gt;
&lt;li&gt;Pay Invoice&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Ledger
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Algumas das features relacionas a plataforma/infraestrutura:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Autenticação e autorização segregada para o provedor OIDC, atraves de uma interface configurável.&lt;/li&gt;
&lt;li&gt;Aspectos arquiteturais de event-driven, onde os comportamentos do sistema produzem eventos, permitindo interfaces flexíveis para implementar e aplicar diferentes comportamentos necessários.&lt;/li&gt;
&lt;li&gt;Possibilidade de integração com a API, optando entre interfaces REST, GRPC ou ambas.&lt;/li&gt;
&lt;li&gt;Agnóstico aos sistemas integrados que compõem a arquitetura, acionados por portas e adaptadores, definindo interfaces que expressam bem o que se espera de possíveis implementações, permitindo a utilização de outras soluções ao invés do padrão.&lt;/li&gt;
&lt;li&gt;Auditoria de todos os comportamentos do sistema.&lt;/li&gt;
&lt;li&gt;Observabilidade em diferentes níveis e formas, configurável e flexível sobre interfaces bem definidas, possibilitando substituir as implementações padrão.

&lt;ul&gt;
&lt;li&gt;Structured logging&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Tracing&lt;/li&gt;
&lt;li&gt;Metrics&lt;/li&gt;
&lt;li&gt;APM&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Escolher entre comunicação insegura ou segura autenticando apenas o servidor ou mútua, incluindo o cliente.&lt;/li&gt;
&lt;li&gt;Flexível para compor e se encaixar em sua arquitetura como uma interface interna central de operações financeiras downstream, suportando suas soluções / produtos que possuem regras de negócios específicas, como e-wallets, bank, etc.&lt;/li&gt;
&lt;li&gt;Uso da estratégia de "in-memory database" para operações financeiras.&lt;/li&gt;
&lt;li&gt;Uso inicial de sharing como padrão para escalar horizontalmente o in-memory data, de forma configuravel.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Ciclo do pedido da realização de uma operação financeira, foreground a nível do request:
&lt;/h4&gt;

&lt;p&gt;1- Core Pay através de uma das interfaces da api, recebe uma requisição referente a um pedido de operação financeira, junto ao serviço de autorização, utiliza o access token para verificar se quem solicitou tem permissão para realizar essa operação.&lt;br&gt;
2- Caso o solicitante seja autorizado, a partir desse pedido, é feito as validações que forem necessárias, aceitando o pedido caso esteja válido para ser processado, publicando em uma fila de pedidos a serem processados de forma assíncrona.&lt;br&gt;
3- Responde que o pedido foi aceito.&lt;/p&gt;




&lt;h4&gt;
  
  
  Ciclo do processamento do pedido da realização de uma operação financeira,  background:
&lt;/h4&gt;

&lt;p&gt;4- É consumido da fila o pedido de operação financeira.&lt;br&gt;
5- É feita novas validações se necessário.&lt;br&gt;
6- Obtém as contas envolvidas na operação direto do serviço de cache e realiza a operação.&lt;br&gt;
7- Com a operação realizada, persiste as informações no banco, atualiza o estado das contas no serviço de cache e publica no serviço de mensageria os eventos ocorridos dessa operação, necessários para que outros sistemas interessados possam consumir e trabalhar.&lt;/p&gt;

&lt;p&gt;Resumidamente sem detalhes técnicos profundos, ainda fica muito obscuro e por parte da engenharia, está aberto muitas dúvidas, mas os design das implementações estarão abertas, documentadas e detalhadas junto ao projeto conforme o ciclo de desenvolvimento vai ocorrendo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Arquitetura e explicação detalhada
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w82wKZQH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9nz41rp8dgpw26lljn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w82wKZQH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9nz41rp8dgpw26lljn4.png" alt="Alt Text" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;a href="https://drive.google.com/file/d/1LIxKERYNy9_4zjhXT2N86OebStWp3Hmr/view"&gt;Clique aqui e amplie a imagem para melhor visualização&lt;/a&gt;
&lt;/h5&gt;




&lt;p&gt;1- Representação de outros sistemas que compõem a solução como um todo, podendo os mesmos terem contextos e responsabilidades diferentes dentro da solução, mas que são downstream ao Core Pay, pois precisam realizar operações financeiras e elas afetam diretamente a conta que o usuário final possui, que esta no dominio, responsabilidade e especialidade do Core Pay.&lt;/p&gt;

&lt;p&gt;Por exemplo, realizar ou receber uma transferência interna ou externa, debito automatico, alguma espécie de cobrança, depósito, saldo, extrato e tudo que envolva diretamente o valores financeiros do usuário final, pode ser que passem diversos outros sistemas, como integrações com órgãos reguladores, mas no final acabaram no Core Pay para aplicação na conta alvo.&lt;/p&gt;




&lt;p&gt;2- Representação de onde o sistema Core Pay se propõe se encaixar nas possíveis soluções, sendo um sistema core interno, servindo como a principal interface para operações financeiras, que afetam as contas que estão sob seu domínio.&lt;/p&gt;

&lt;p&gt;A comunicação poderá ser feita tanto através da interface REST quanto a GRPC, pois ambas interfaces irão expor as mesmas funcionalidades, possibilitando a flexibilidade de optar por uma ou ambas.&lt;/p&gt;

&lt;p&gt;Por se tratar de um sistema crítico, seria ideal estar em uma infraestrutura segura, mas sendo totalmente opcional o como e onde o implementar, como por exemplo utilizar VPN ou VPC e etc.&lt;/p&gt;

&lt;p&gt;2.1- Não é uma restrição do projeto obrigar a implementação do Core Pay com outros sistemas  com diferentes objetivos agindo na borda como dns, load balancers, proxy reverse, api gateway, WAF e etc, mas sim a premissa da flexibilidade de poder implantar o Core Pay como melhor entender e necessitar, podendo fazer suas próprias escolhas baseado em seu contexto, optando por ter essas soluções na borda ou não.&lt;/p&gt;

&lt;p&gt;2.2- Não é uma restrição do projeto ditar a forma como implementar o Core Pay, ficando a critério se haverá apenas uma instância, um cluster, em containers, usando kubernetes e etc, dependendo apenas da solução que deseja alcançar com o contexto que estiver inserido.&lt;/p&gt;

&lt;p&gt;Mas é necessário prover a infraestrutura de serviços upstream da qual o Core Pay se integra e são essenciais para sua operação.&lt;/p&gt;




&lt;p&gt;3- Representam os serviços upstream necessários que uma infraestrutura provisionada para servir o Core Pay precisa ter, sendo a ideia ilustrar esses serviços como interfaces, representando a premissa do projeto de ter a flexibilidade de ser possível implementar o contrato dessas interfaces e utilizar diferentes diferentes serviços quando possível.&lt;/p&gt;

&lt;p&gt;Por exemplo, o comportamento necessário para ser alcançado com o serviço de cache estará definido, por padrão o provider padrão será do redis, mas caso o memcached ou outro sistema de cache também possa atender, novos providers podem ser implementados e utilizados, sendo assim para todos os outros serviços.&lt;/p&gt;

&lt;p&gt;Além da possibilidade de utilizar diferentes providers/adapters para cada serviço, o Core Pay é burro em relação a infraestrutura provisionada e não impõe nenhuma restrição, apenas precisa utilizar dela para funcionar, mas como é configurada, quais suas características e comportamentos, depende da sua necessidade e o que deseja alcançar, para que assim possa atender os diversos contextos e problemas.&lt;/p&gt;

&lt;p&gt;Por exemplo, você pode disponibilizar uma simples instância até algo altamente disponível.&lt;/p&gt;

&lt;p&gt;3.1- Representa a interface referente ao serviço da camada de identidade da plataforma/solução como um todo, idealmente responsável por autenticar e autorizar os usuários e clientes da plataforma, não somente do Core Pay.&lt;/p&gt;

&lt;p&gt;O Core Pay não tem conhecimento sobre quem são os usuários, clientes, identidade e o que cada um está autorizado a fazer, apenas tem domínio das permissões definidas para realização de suas operações, sempre utilizando o serviço responsável por autenticar e autorizar para validar a autenticidade da identidade e se tem autorização/permissão para fazer a operação solicitada.&lt;/p&gt;

&lt;p&gt;Inicialmente o provider padrão será baseado em OIDC/OAUTH2 providers.&lt;/p&gt;

&lt;p&gt;3.2- Representa a interface referente ao serviço de cache, sendo um dos mais importantes e críticos, base para a estratégia de “in-memory database”, que tem o objetivo de alta performance com baixa latência e alto throughput nas operações financeiras.&lt;/p&gt;

&lt;p&gt;O design idealizado lida com problemas de concorrência, consistência e uso otimizado e correto da memória.&lt;/p&gt;

&lt;p&gt;No caso do serviço de cache, como uma característica da arquitetura do Core Pay, escalar e alcançar alta disponibilidade será utilizado shards, distribuídos entre diferentes instâncias do serviço, sendo assim necessário provisionar um cluster com as características necessárias para alcançar a escala desejada. &lt;/p&gt;

&lt;p&gt;Inicialmente o provider padrão será baseado no Redis.&lt;/p&gt;

&lt;p&gt;3.3- Representa a interface referente ao serviço de mensageria, utilizado para processamento e comunicação assíncrona, interface dos eventos ocorridos do Core Pay, sendo um componente muito importante para o processamento sincronizado das operações financeiras.&lt;/p&gt;

&lt;p&gt;O Core Pay, na proposta inicial da arquitetura, é tanto o produtor quanto um dos consumidores de suas próprias mensagens, sejam comportamentos primários como operações financeiras ou após, estimulados por eventos próprios de comportamentos que ocorreram, como notificar que uma transação financeira ocorreu com sucesso.&lt;/p&gt;

&lt;p&gt;Inicialmente o provider padrão será baseado no RabbitMQ.&lt;/p&gt;

&lt;p&gt;3.4- Representa a interface referente ao serviço de armazenamento/persistência, a base de dados do Core Pay, por exemplo, onde é efetivado o resultado das operações financeiras após serem processadas com sucesso.&lt;/p&gt;

&lt;p&gt;Inicialmente o provider padrão será baseado no Postgresql.&lt;/p&gt;




&lt;p&gt;4- Outros sistemas internos downstream que são consumidores dos eventos publicados pelo Core Pay e precisam fazer alguma operação específica quando eles ocorrem, tendo o serviço de mensageria como base na comunicação de forma flexível.&lt;/p&gt;

&lt;p&gt;Por exemplo, uma transação que ocorrera de forma interna para externa, quando ela ocorrer, uma mensagem será publicada como evento para notificar que o montante a ser transferido internamente para outra instituição/banco externo, internamente foi subtraído, agora falta esse valor chegar até a conta beneficiária, sendo usando esse evento como estímulo em um outro sistema que irá consumir e finalizar a transação.&lt;/p&gt;




&lt;h2&gt;
  
  
  Observabilidade
&lt;/h2&gt;

&lt;p&gt;A observabilidade do sistema e da plataforma é algo crucial, não explícito e ilustrado na big picture da solução, mas é uma característica por design, onde se encaixaria na infraestrutura para suportar o Core Pay como parte do conjunto de serviços necessários, porém é uma parte complexa de alcançar uma flexibilidade da qual possa utilizar diferentes providers como os demais serviços, por existir diversas soluções que funcionam de forma específicas e muitas delas proprietárias.&lt;/p&gt;

&lt;p&gt;Com essa situação, o objetivo ainda é alcançar características de observabilidade de forma que seja possível ter uma maior flexibilidade na escolha das soluções de forma que seja vendor-agnostic, para isso a premissa será se apoiar na OpenTelemetry, começando por estudar os componentes que seguem e implementam a especificação e caso ainda não estejam maduros o suficiente, buscar implementar nós mesmos a especificação, contemplando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured logging&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Tracing&lt;/li&gt;
&lt;li&gt;Metrics&lt;/li&gt;
&lt;li&gt;APM&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pontos de falha
&lt;/h2&gt;

&lt;p&gt;Tratasse de uma sistema muito crítico, onde o contexto para qual está sendo projetado como solução tem metas altíssimas de SLOs e SLAs, sendo assim muito importante entender dos pontos fracos da solução, quais são os comportamentos e características esperadas por parte do sistema em situações de falhas de si ou de uma integração, para avaliar a viabilidade do uso do sistema como uma solução, estar ciente do que o sistema se propõe, estar preparado e tomar as devidas medidas, principalmente para provisionar uma infraestrutura robusta, pensando na disponibilidade, situações de falhas, em estratégias de fallbacks, failover, evitar single point of failure e outros.&lt;/p&gt;




&lt;h3&gt;
  
  
  Core Pay
&lt;/h3&gt;

&lt;p&gt;O sistema tem como base dependências muito críticas que são essenciais para suas funcionalidades, mas pela dinamicidade do contexto a única garantia é que possivelmente em algum momento poderá haver alguma falha por parte do Core Pay ou na infraestrutura de serviços, seja pela a ocorrência de uma degradação, eventual indisponibilidade parcial ou completa , mudança na topologia, algum problema referente a rede e outros.&lt;/p&gt;

&lt;p&gt;Tendo isso em mente, fora situações onde o próprio Core Pay é o ponto de falha, o mesmo terá a premissa de por design ser resiliente e tolerar falhas, podendo se manter disponível ou parcialmente, mas de alguma forma degradado, pois em situações onde o ponto de falha é algum dos serviços que é uma forte dependência, possivelmente parte das funcionalidades não poderão ser operadas.&lt;/p&gt;




&lt;h3&gt;
  
  
  Authentication and Authorization server
&lt;/h3&gt;

&lt;p&gt;Sendo o serviço responsável por identificar os solicitantes e permitir que possa ser feita a operação desejada, todo throughput do sistema passará por ele antes de qualquer operação.&lt;/p&gt;

&lt;p&gt;Caso o Core Pay não consiga a garantia sobre a identidade e o que a mesma tem permissão para fazer, seu comportamento padrão será tolerar a falha com o serviço, não operando nenhuma funcionalidade, aceitando novas solicitações, respondendo que não pode processá-las naquele momento, ficando parcialmente disponível, mas mantendo a segurança, confiabilidade e integridade, até que não tenha mais falha e consiga garantir o processo novamente.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cache service
&lt;/h3&gt;

&lt;p&gt;Sendo o serviço responsável por dar vida a característica de “in-memory database”, que tem o objetivo de alta performance com baixa latência e alto throughput nas operações financeiras, é parte do backbone das funcionalidades referente às operações financeiras e outras.&lt;/p&gt;

&lt;p&gt;Caso o Core Pay não consiga utilizar a estratégia de “in-memory database” por padrão, irá tolerar a falha com o serviço de cache, aceitando novas solicitações, respondendo que não pode processá-las naquele momento nas seguintes situações:&lt;/p&gt;

&lt;p&gt;Solicitações de operações financeiras que envolvam escrita.&lt;br&gt;
Que por design exija exclusivamente o uso do serviço de cache.&lt;/p&gt;

&lt;p&gt;Onde demais operações como operações financeiras que envolvam apenas leitura e outras que por design não exija exclusivamente o uso do serviço de cache, será feito a tentativa de fallback para o banco temporariamente até a resolução do ponto de falha, mas apenas será sucesso caso a latência seja aceitável e o banco disponível, não onerando completamente a disponibilidade, onde do contrário, sem serviço de cache e banco, o sistema ficará praticamente indisponível.&lt;/p&gt;

&lt;p&gt;A decisão é em prol de garantir a disponibilidade e performance do sistema.&lt;/p&gt;




&lt;h3&gt;
  
  
  Queue service
&lt;/h3&gt;

&lt;p&gt;Sendo o serviço responsável pela comunicação e processamento assíncrono do sistema, que tem como um dos usos principais nas operações financeiras de escrita, outras operações processadas assincronamente e a comunicação/notificação de outros sistemas, a outra parte do backbone das operações financeiras, mas o sistema quase todo.&lt;/p&gt;

&lt;p&gt;Caso o Corey Pay não consiga utilizar o serviço de mensageria, irá tolerar a falha com o serviço, não operando nenhuma funcionalidade que o envolve, aceitando novas solicitações, respondendo que não pode processá-las naquele momento, ficando parcialmente disponível, mas mantendo a consistência, durabilidade, integridade e confiabilidade.&lt;/p&gt;




&lt;h3&gt;
  
  
  Database
&lt;/h3&gt;

&lt;p&gt;Sendo o serviço responsável pela persistência, logo a escrita e leitura base do sistema, onde todas suas informações estão armazenadas.&lt;/p&gt;

&lt;p&gt;Caso o Corey Pay não consiga utilizar o banco de dados, irá tolerar a falha com o mesmo, não operando nenhuma funcionalidade que exija a comunicação direta com o banco, apenas possíveis leituras que ainda estejam retinas temporariamente e ainda confiáveis no serviço de cache caso o mesmo esteja disponível.&lt;/p&gt;

&lt;p&gt;Parcialmente disponível nessa situação, mas mantendo a consistência, durabilidade, integridade, confiabilidade e atomicidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evolutiva
&lt;/h2&gt;

&lt;p&gt;Essa é a solução inicial, que tem como objetivo estar preparada para evoluir com facilidade conforme necessário, logo provavelmente não será exatamente a mesma conforme for ser desenvolvida.&lt;/p&gt;

&lt;p&gt;Um dos pontos interessantes é que inicialmente será um monolito modular, mas com possíveis intenções da quebra em diferentes serviços menores dependendo do resultado da primeira versão na fase experimental do projeto, caso seja validada positivamente e venha a amadurecer, em sua versão seguinte isso pode vir a acontecer.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Com a base da solução em mente, o direcionamento agora é para iniciar o desenvolvimento, onde a ideia é que para cada entrega seja feito um novo artigo da engenharia por trás, mas todo ciclo ocorrerá no aberto no github, ferramenta a ser escolhida para colaboração e documentação e demais outras, tendo mais informações no próprio repositório do projeto.&lt;/p&gt;

&lt;p&gt;Agradeço por sua atenção, fique a vontade para comentar, inteirar e acompanhar mais sobre o projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meu &lt;a href="https://github.com/gmarcial"&gt;github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/corelab1/corepay"&gt;Repositório do projeto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://app.gitbook.com/s/-MhGsTlOL1ALRxT5ptTz/"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>[ARCHIVDED] Projeto e-Money: Arquitetura</title>
      <dc:creator>Guilherme Marcial</dc:creator>
      <pubDate>Mon, 03 Aug 2020 15:20:53 +0000</pubDate>
      <link>https://forem.com/gmarcial/project-e-money-design-2c2c</link>
      <guid>https://forem.com/gmarcial/project-e-money-design-2c2c</guid>
      <description>&lt;h1&gt;
  
  
  Esse projeto foi reformulado, agora é o: &lt;a href="https://dev.to/gmarcial/core-pay-solucao-5af5"&gt;https://dev.to/gmarcial/core-pay-solucao-5af5&lt;/a&gt;
&lt;/h1&gt;




&lt;h1&gt;
  
  
  Avisos:
&lt;/h1&gt;

&lt;p&gt;[0] O assunto principal do artigo será a arquitetura do projeto e-Money, onde apenas conterá um resumo sobre o projeto em sí, sendo imprescindível acessar ao repositório do projeto: &lt;a href="https://github.com/gmarcial/e-money"&gt;https://github.com/gmarcial/e-money&lt;/a&gt; para conhecer a fundo sobre e não se perder durante a leitura.&lt;/p&gt;

&lt;p&gt;[1] Por hora o projeto apenas irá contar com o desenvolvimento e entrega do backend, ficando aberto a possibilidade das demais partes como clientes mobile e web, como contribuição de outros desenvolvedores que venham a ter interesse.&lt;/p&gt;




&lt;h1&gt;
  
  
  Projeto:
&lt;/h1&gt;

&lt;p&gt;O e-Money é uma solução para um problema fictício, com o objetivo de além a conclusão do meu curso,  ser um laboratório de estudos para evolução profissional e portfólio do meu trabalho.&lt;/p&gt;

&lt;p&gt;Tem como premissa ser open-source, aberto desde o início, podendo a sua evolução ser acompanhada e ter um aprofundamento sobre  em seu repositório no github.&lt;/p&gt;

&lt;p&gt;O nome do projeto vem do seu próprio valor monetário, que são créditos eletrônicos com a finalidade servir de moeda dentro da plataforma, onde é transacionada e utilizado para realização de pagamentos.&lt;/p&gt;

&lt;p&gt;O e-Money em sua base é um sistema de pagamentos em comum de serviços de entidades que pertencem e participam da plataforma, tendo os usuários como consumidores, que pagam os serviços utilizando a moeda e-Money. &lt;/p&gt;

&lt;p&gt;Para um serviço estar disponível para pagamento na plataforma, é preciso se integrar ao hub.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ex:
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Um serviço como o de transporte circular, caso seja participante da plataforma, poderá ser pago com a moeda e-Money.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  O desafio
&lt;/h1&gt;

&lt;p&gt;Mesmo este sendo meu primeiro artigo, tenho como objetivo o desafio de registrar o ciclo de desenvolvimento deste projeto, compartilhando não somente as soluções e resultados, mas buscando demonstrar todas as decisões tomadas durante o processo, resultando em um histórico da evolução e portfólio, pois estará aberto a feedback, discussões, compartilhamentos, contribuições e tudo aquilo que venha agregar.&lt;/p&gt;

&lt;p&gt;O ciclo é composto pelas seguintes etapas:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Design, develop, test and deploy&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Começando pelo design da solução como um todo, que é a proposta deste artigo, ficando os demais registros para respectivas entregas das features, onde ficarei de decidir sua granularidade, podendo vir com um ou mais temas ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Esse artigo tem como objetivo apresentar e explicar a arquitetura inicial projetada, onde provavelmente irá evoluir durante o caminho.&lt;/p&gt;

&lt;p&gt;Vamos analisar a arquitetura como um todo e depois passando parte por parte até que percorremos por completo.&lt;/p&gt;




&lt;h1&gt;
  
  
  Atributos de qualidade
&lt;/h1&gt;

&lt;p&gt;Representam as capacidades necessárias identificadas que a arquitetura precisa ter para poder suportar e atender o produto concebido, tornando uma solução que atende ao negócio. &lt;/p&gt;

&lt;p&gt;Para que isso aconteça, essas capacidades serviram de guia da concepção e evolução da arquitetura no seu alto a baixo nível, refletindo diretamente nas implementações e o que se espera das funcionalidades, para que esteja alinhada e continue alinhada como uma solução para o negócio. &lt;/p&gt;

&lt;p&gt;O objetivo é deixar expresso e registrado as capacidades identificadas, resumidamente expressar o conceito e uma breve justificativa, que estará aprofundada, expressa detalhadamente no ciclo de desenvolvimento e medidas continuamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base
&lt;/h2&gt;

&lt;p&gt;Capacidades base para contribuir para a vida útil da aplicação, possibilitando ser continuamente funcional, mantida e evoluída, sem estar presa aos criadores, possibilitando também por novos contribuidores e mantenedores.&lt;/p&gt;

&lt;h4&gt;
  
  
  Readability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;O projeto deve ter código de fácil entendimento, podendo ser lido com facilidade por outros engenheiros que venham a contribuir.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;É desejável que o projeto possa seguir em frente, onde outros desenvolvedores possam contribuir.&lt;/p&gt;

&lt;p&gt;Com a legibilidade, quem tiver interesse em colaborar de alguma forma, terá uma maior facilidade de entendimento, gastando menos tempo na leitura do código.&lt;/p&gt;




&lt;h4&gt;
  
  
  Testability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Os diversos níveis da aplicação devem ser possível aplicar diferentes técnicas de teste, conforme o contexto, assegurando os comportamentos esperados e alcançando uma cobertura de segurança através do testes que são os primeiros clientes de nossas implementações.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;É desejável testar a aplicação em diferentes níveis para que possa garantir os comportamentos funcionais, não funcionais e os próprios atributos de qualidade a partir de métricas tiradas dos testes, suportando a qualidade e evolução da aplicação.&lt;/p&gt;




&lt;h4&gt;
  
  
  Evolvability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Suportar mudanças de forma incremental, sem causar impacto negativo, continuamente atendendo ao negócio suportado e capacidade da aplicação.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Durante o ciclo de vida da aplicação, ele consequentemente irá mudar, em vez de ser um sofrimento, podemos preparar para que sejam evoluções.&lt;/p&gt;

&lt;p&gt;Essas evoluções podem ser funcionalidades novas, novos entendimentos não claros inicialmente, novos problemas, novas capacidades e etc.&lt;/p&gt;

&lt;p&gt;O contexto muda e é preciso que a aplicação acompanhe.&lt;/p&gt;

&lt;p&gt;Para que essa capacidade seja alcançada, é necessário alcançar outros que estão compostos:&lt;/p&gt;

&lt;h5&gt;
  
  
  Modifiability:
&lt;/h5&gt;

&lt;p&gt;Ser facilmente modificável, onde é adaptado com facilidade.&lt;/p&gt;

&lt;h5&gt;
  
  
  Modularity:
&lt;/h5&gt;

&lt;p&gt;É composto de componentes coesos, desacoplados e independentes uns dos outros, onde são compostos, trabalhando juntos para construir o todo.&lt;/p&gt;

&lt;h5&gt;
  
  
  Simplicity:
&lt;/h5&gt;

&lt;p&gt;Lidar com problemas complexos com soluções simples, buscando sempre a complexidade essencial e não acidental.&lt;/p&gt;




&lt;h2&gt;
  
  
  Negócio
&lt;/h2&gt;

&lt;p&gt;Capacidades requisitadas para que o negócio possa ser suportado além do produto ser funcional, é preciso que além da entrega da funcionalidade, a aplicação opere essa funcionalidade conforme a demanda e dentro do contexto do negócio.&lt;/p&gt;

&lt;h4&gt;
  
  
  Auditability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Deve ocorrer a coleta,  registro de fatos e evidências das atividades exercidas, com objetivo de captar como, onde, quem e quando foi feito, com objetivo de avaliar a conformidade da operação em relação ao que foi acordado, requisitos legais e etc, senão eficazes e alcançando os objetivos.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Dependendo do negócio envolvido, o nível de sua criticidade e seus requisitos, como aplicações financeiras, governamentais e outras, recorrentemente ocorrem auditorias para avaliar a conformidade, alguma legislação imposta, podendo a auditoria ser um processo natural, mas também situações críticas de questionamento da veracidade de uma operação.&lt;/p&gt;




&lt;h4&gt;
  
  
  Atomicity
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;As operações devem ser atômicas, onde não pode ser considerado ou aceito parte do processo.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Uma transferência não pode ocorrer pela metade, onde a conta de origem tem o valor subtraído, mas a de destino não recebe o valor ou o contrário.&lt;/p&gt;




&lt;h4&gt;
  
  
  Isolability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;O contexto das operações não devem afetar uma as outras, não as afetando. &lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Uma transação não deve influenciar o contexto de uma outra transação, mesmo que ambas tenham envolvido uma entidade em comum, uma deve aguardar a outra, estando sincronizadas.&lt;/p&gt;




&lt;h4&gt;
  
  
  Consistency
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Onde a execução das operações ocorrem de forma válida, seguindo as definições e resultando no que é esperado.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Uma sequência de operações bancárias devem finalizar com as contas bancárias envolvidas com valores corretos, não tendo mais ou menos dinheiro do que esperado, pois estaria quebrando a consistência do saldo dos clientes.&lt;/p&gt;




&lt;h4&gt;
  
  
  Durability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Os resultados das operações devem permanecer e perdurar até que outra operação venha a causar alterações.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;A contratação de um serviço ou a realização de um pagamento deve permanecer intacto, não parecendo que não ocorreu, tendo que refazer até efetivar.&lt;/p&gt;




&lt;h4&gt;
  
  
  Integrity
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;A aplicação deve ter e tomar medidas da qual mantenha a garantia, manutenção, qualidade e veracidade de suas operações por todo ciclo de vida da aplicação em relação ao seu estado em diversos níveis.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Aplicações financeiras são muito críticas, suas informações literalmente valem dinheiro, é imprescindível a confiança das movimentações financeiras, mantendo as íntegras, não perdendo ou corrompendo alguma das informações.&lt;/p&gt;




&lt;h4&gt;
  
  
  Reliability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Manter um nível aceitável de operabilidade, mesmo em situações de falha e anomalias.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Falhas, situações anormais, erros, ataques e etc, podem e vão ocorrer, mas sem o controle de quando e como, para isso é necessário prevenir, projetando contra essas situações nos vários níveis da aplicação, para que ela continue operando em situações críticas até normalizar.&lt;/p&gt;

&lt;p&gt;Diversos níveis e aspectos da aplicação, sendo primária ou terceiras, podem acarretar em uma situação dessa.&lt;/p&gt;




&lt;h4&gt;
  
  
  Security
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;A aplicação deve ter medidas da qual se mantenha protegida contra ataques e ações maliciosas que venham explorar e causar danos ao negócio e clientes.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Aplicações financeiras são muito visadas por criminosos, pelo fato de que podem conseguir ganhos ilícitos ao explorá-las, sendo necessário proteger a aplicação nos diversos níveis e manter uma política e cultura de segurança, conscientizando os envolvidos e até mesmo uma área específica para cuidar da segurança, famosas equipes red e blue.&lt;/p&gt;




&lt;h4&gt;
  
  
  Availability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Característica de que a aplicação para estar disponível, precisa estar funcionando satisfatoriamente(uptime) nos períodos, com os comportamentos e características especificadas, levando em consideração todo o ciclo da operação.&lt;/p&gt;

&lt;p&gt;Quando a aplicação está funcionando e respondendo como esperado o tempo e a quantidade de carga, ela é considerada que tem disponibilidade.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Aplicações financeiras como uma conta bancária, necessitam estar sempre disponíveis para quando seus clientes necessitam, mas além disso, essas aplicações têm rígidos requisitos como tempo de resposta aceitáveis baixíssimos para uma transação por exemplo, que deve ser alcançado mesmo em picos de carga, pois menos que isso, gastará mais tempo, realizando menos operações em um período, sendo considerada indisponível.&lt;/p&gt;




&lt;h2&gt;
  
  
  Infraestrutura
&lt;/h2&gt;

&lt;p&gt;Capacidades requisitadas para que a aplicação possa ser suportada, para conforme as necessidades a aplicação operar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Observabiltity
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;É poder atraves das informações geradas dos comportamentos do sistema, realizar metricas que reflitam como um historico do seu estado em seus diversos niveis, podendo assim com maior facilidade, entender o que aconteceu, acontece e acontecera.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Naturalmente sistemas são ou se tornam complexos, dependendo do seu contexto uns são menos ou mais que outros, mas em todos é muito importante que a gente tenha a capacidade de entender o que esta acontecendo com clareza e precisam, seja por exemplo para identificação e resolução de um problema, averigar a assertividade de uma operação e etc, possibilitando sermos mais mais assertivos.&lt;/p&gt;

&lt;p&gt;Queremos evitar situações onde não sabemos o que aconteceu, em qual componente ocorreu o problema, seja no banco de dados ou em um serviço terceiro e em qual parte desse componente.&lt;/p&gt;




&lt;h4&gt;
  
  
  Configurability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;O sistema varia os comportamentos que são configuraveis conforme os parametros passados na configuração, não ficando estatico a um unico contexto, podendo alcançar adaptações de forma flexivel, sem muito trabalho.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Por base os sistemas precisam se adaptar em diferentes contextos, como na implantação em ambientes diversos, que tem diferentes requisitos, mudar um fluxo ou operação a partir de um paretro e etc.&lt;/p&gt;

&lt;p&gt;Para que não precisemos fazer alterações a nivel de codigo para adaptar a qualquer uma dessas situações a gente identifica e implementa esses pontos de forma que sejam configuraveis, tendo apenas que alterar os parametros para se adaptar.&lt;/p&gt;




&lt;h4&gt;
  
  
  Fault Tolerance
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Na ocorrencia de falhas, os impactos causados na aplicação devem refletir proprocionalmente a sua gravidade, onde uma falha simples não deve deixar a aplicação inoperavel, mas apenas onerar a parte onde ocorreu a falha.&lt;/p&gt;

&lt;p&gt;No caso da indisponibilidade de um sistema upstream, mesmo que as operações dependentes do mesmo não serem operaveis, as demais que não dependem, devem operar normalmente, lidando de uma forma agradevel com a degradação parcial(graceful degradation) ou total.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Falhas acontecem, apenas na maioria da vezes não sabemos quando, para isso devemos preparar o sistema para lidar com a falha, seja a nivel de design/implementação, infraestrutura e recursos computacionais, acoplamento dos componentes e etc, buscando ter isso como um comportamente natural, ação automatizada e em situações extremas, manualmente com a intervenção humana.&lt;/p&gt;




&lt;h4&gt;
  
  
  Scalability
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;A aplicação é projetada para atender o aumento ou diminuição dos recursos computacionais conforme a carga de trabalho, sendo possivel os alterar conforme a necessidade para continuar disponivel e realizando o trabalho, onde a escala pode ser horizontal(scale out) que ocorre com o aumento de nós em um cluster ou vertical(scale up) que ocorre com o aumento de recursos computacionais de unico mesmo nó, como mais memoria ou nucleos.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Toda aplicação tem uma carga de trabalho base, mas que ele pode variar em momentos esperados como em picos em momentos padrões ou aumentar conforme o negocio cresce.&lt;/p&gt;

&lt;p&gt;Cada aplicação tem sua caracteristica, como uma aplicação foodtech tem o aumento em horarios de alimentação e backfriday para e-commerces e marktplaces.&lt;/p&gt;

&lt;p&gt;Fora momentos que podem ser inesperados, onde a aplicação deve estar preparada para escalar e aguentar a carga.&lt;/p&gt;




&lt;h4&gt;
  
  
  Performance
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Conceito:
&lt;/h5&gt;

&lt;p&gt;Medida que representa o desempenho da aplicação na realização de suas operações, seja quanto tempo levou, quantos operações foram feitas em um determinado periodo e quantidade de recursos utilizados.&lt;/p&gt;

&lt;p&gt;Quão mais rapida realiza as operações, mais operações realiza em um determinado periodo e utilizando menos recursos, mais performatica, tendo uma melhor desempenho.&lt;/p&gt;

&lt;h5&gt;
  
  
  Justificativa:
&lt;/h5&gt;

&lt;p&gt;Certas operações necessitam de um cuidado especial em relação a performance, por exemplo, pode exigir um tempo de resposta baixo e que sejam realizadas uma quatidade X de operações em um periodo curto de tempo para que esteja disponivel.&lt;/p&gt;

&lt;p&gt;Outras podem exigir um melhor uso dos recursos computacionais, otimizando as operações para que use apenas o necessario, diminuindo custos, pois parte dos recursos seriam redistribuidos para as demais operações da aplicação.&lt;/p&gt;




&lt;h1&gt;
  
  
  Arquitetura:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CKlIvEg9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/8ruo6n4whaeyo4am9w2x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CKlIvEg9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/8ruo6n4whaeyo4am9w2x.png" alt="Alt Text" width="741" height="1061"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Amplie a imagem para visualizar melhor
&lt;/h5&gt;

&lt;p&gt;A arquitetura por parte dos clientes, inicialmente é composta somente por primários que farão o interfaceamento com os usuários finais, tendo cada um deles uma finalidade diferente, pois cada contexto tem suas necessidades, sendo web para o back office onde os administradores irão gerenciar a plataforma, já os cidadãos, utilizam as plataformas mobile para acesso e gerenciamento de sua conta e máquinas de pagamento para pagamento dos serviços.&lt;/p&gt;

&lt;p&gt;Com objetivo de evitar acesso direto aos recursos, principalmente a api, a frente de todas requisições terá um proxy reverso que pela sua maturidade a escolha foi o nginx. Toda comunicação passará por ele, será o filtro inicial antes do redirecionamento, realizando alguns trabalhos gerais e genéricos em relação a requisição, intermediando entre os recursos internos e os requisitantes.&lt;/p&gt;

&lt;p&gt;Uma das partes mais importantes é a api rest utilizando em seus contratos de comunicação o formato json, responsável pela operacionalização da plataforma, aplicando as regras de negócio. &lt;br&gt;
Irá servir aos clientes, estará integrado ao vault para gerenciamento dos segredos que estarão envolvidos na infra e em algumas das regras de negócio, onde iremos nos aprofundar mais a frente em próximos artigos, e  o banco de dados postgres para persistências das informações, tanto para a api, quanto ao vault, podendo adotar abordagens relacional e não relacional. &lt;/p&gt;

&lt;p&gt;O projeto tem como premissa ser cloud native, que será optado entre a google cloud e a digital ocean, tendo como restrição o custo financeiro final, por se tratar de um projeto sem fins lucrativos e financiado por fundos pessoais.&lt;/p&gt;

&lt;p&gt;Todo o projeto por questões de segurança estaria em uma  VPC e sub-redes para não estarem expostos diretamente a internet, além de ter o proxy como um gateway, criando um ambiente seguro, gerenciado em várias etapas e claro em containers docker.&lt;/p&gt;

&lt;p&gt;Agora vamos falar detalhadamente de cada parte.&lt;/p&gt;


&lt;h1&gt;
  
  
  Clientes:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8AgYgVIB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/daobn648qs16ultqxw60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8AgYgVIB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/daobn648qs16ultqxw60.png" alt="Alt Text" width="381" height="741"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Amplie a imagem para visualizar melhor
&lt;/h5&gt;

&lt;p&gt;Todos clientes primários por fim vão representar um usuário final, seja um administrador ou um cidadão.&lt;/p&gt;

&lt;p&gt;A responsabilidade do administrador é gerenciar a plataforma, muitas das vezes tendo um terminal de trabalho onde não caberá somente a responsabilidade do gerenciamento da plataforma a e-Money, podendo também trabalhar com outras finalidades, sendo a web uma ótima plataforma para o back office.&lt;/p&gt;

&lt;p&gt;Já para os cidadãos que utilizam a plataforma como consumidores finais, que  precisam de uma maior praticidade e mobilidade para gerenciarem suas contas de qualquer lugar, a escolha são as plataformas mobile.&lt;/p&gt;

&lt;p&gt;Por segurança a plataforma só aceita clientes primários, os quais confiá, sendo autenticados e autorizados para interagir com os serviços, passando pelo processo de MTLS, além do tunelamento seguro para comunicação.&lt;/p&gt;

&lt;p&gt;Além da parte do cliente, outro nível de segurança é por parte do usuário final que o utiliza, precisando também se autenticar, para sua identificação durante o ciclo de uso e autorização das ações dentro da plataforma, utilizando tokens de identidade(id token) e acesso(access token).&lt;/p&gt;

&lt;p&gt;Quando existir situações sem autenticação do usuário final, MTLS será o suficiente.&lt;/p&gt;


&lt;h1&gt;
  
  
  Cliente de pagamento:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5JmHOJN2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/kisiy4oieafinkanm5ee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5JmHOJN2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/kisiy4oieafinkanm5ee.png" alt="Alt Text" width="522" height="941"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Amplie a imagem para visualizar melhor
&lt;/h5&gt;

&lt;p&gt;O cliente especifico para pagamentos é por onde as entidades parceiras utilizaram para realizar as transações referente ao pagamento dos serviços consumidos e somente por eles que os mesmos ocorreram.&lt;/p&gt;

&lt;p&gt;Além de se autenticar e ocorrer a tunelização da comunicação com MTLS, esse tipo de cliente em especial, irá representar uma entidade da qual efetuará as transações através dele, sua identidade tem que corresponder a da qual foi configurado e certificado.&lt;/p&gt;

&lt;p&gt;Somente será autorizado transações quando autenticado e corresponder a entidade para qual foi configurada, logo sua identidade é previamente feita e ligada a sua configuração na plataforma pela administração.&lt;/p&gt;


&lt;h1&gt;
  
  
  Proxy reverso:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GLT7ha8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/0kku297p2s38kips9rmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GLT7ha8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/0kku297p2s38kips9rmd.png" alt="Alt Text" width="461" height="321"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Amplie a imagem para visualizar melhor
&lt;/h5&gt;

&lt;p&gt;O proxy intermedia a comunicação, é quem conhece e redireciona para os responsáveis por lidar com as requisições, podendo aplicar alguma medida manipulando a requisição, segurança, balanceamento e filtro,  como só aceitar clientes válidos e confiáveis antes de redirecionar, pois é o primeiro a receber a  requisição.&lt;/p&gt;

&lt;p&gt;Isolando os recursos do mundo externo, ele é único conhecido e está a frente de toda comunicação, mantendo os demais seguros.&lt;/p&gt;

&lt;p&gt;Além de segurança, ele pode contribuir para performance e outras medidas, como cache, filtros e etc. Todos as requisições são intermediadas por ele, podendo fazer a manipulação e ações na entrada e saída, conforme as possibilidades de configuração do nginx.&lt;/p&gt;

&lt;p&gt;Outra solução que poderia se encaixar muito bem seria um api gateway, sendo alguns baseados propriamente em cima do nginx.&lt;/p&gt;


&lt;h1&gt;
  
  
  Contrato com a api:
&lt;/h1&gt;

&lt;p&gt;O consumo da api deve ser claro, tento bem modelado os recursos, expressando seus contratos e principalmente expor o estado, resultado de cada ação e operação, para que diante disso o consumidor possa ficar ciente e a partir disso possivelmente realizar os comportamentos corretos conforme a situação.&lt;/p&gt;

&lt;p&gt;Para isso a api deve estar bem documentada, deixando explícito seus recursos, ações, e como realizar e seus comportamentos esperados, além disso um contrato em comum das respostas, seus estados e regras conforme as situações.&lt;/p&gt;

&lt;p&gt;Base:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Status code&lt;/li&gt;
&lt;li&gt;Estado da ação&lt;/li&gt;
&lt;li&gt;Descrição&lt;/li&gt;
&lt;li&gt;Resultado&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;



&lt;p&gt;Ex:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Casos 2xx:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code: 201
{
  "state": "success",
  "description": "A conta foi aberta com sucesso",
  "result": {
    "resource": "accounts/8129391"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;Casos 4xx:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code: 400
{
  "state": "Dados invalidos",
  "description": "A conta não pode ser aberta, ",
  "result": {
    "messages": [
        {
          "property":"...",
          "value":"..."
        },
        {
          "property":"...",
          "value":[
              {
                "property":"...",
                "value":"..."
              },
              {
                "property":"...",
                "value":"..."
              },
              {
                "property":"...",
                "value":"..."
              }
            ]
        },
        {
          "property":"...",
          "value":"..."
        }
      ]
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;Casos 5xx:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code: 500
{
  "state": "Erro inesperado",
  "description": "Ocorreu um erro interno ao tentar processar esta ação"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Persistencia dos dados:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tpdo458W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/el3pmotx5kstg1lmusmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tpdo458W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/el3pmotx5kstg1lmusmg.png" alt="Alt Text" width="531" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Amplie a imagem para visualizar melhor
&lt;/h5&gt;

&lt;p&gt;O RDBMS escolhido será o postgresql, além da sua maturidade, popularidade, eficiência e extensibilidade, aproveitar tanto da sua abordagem relacional, quanto a não relacional com a feature de persistências de arquivos json e jsonb, podendo obter também uma abordagem de documentos.&lt;/p&gt;

&lt;p&gt;Toda comunicação com o banco será segura através de conexões utilizando TLS.&lt;/p&gt;

&lt;p&gt;Estando em avaliação referente a restrição financeira se será optado por uma abordagem de um serviço gerenciado nas clouds propostas, ou não.&lt;/p&gt;




&lt;h1&gt;
  
  
  Vault:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DU13soja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/bniijwjve5x1ra22onnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DU13soja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/bniijwjve5x1ra22onnh.png" alt="Alt Text" width="741" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Amplie a imagem para visualizar melhor
&lt;/h5&gt;

&lt;p&gt;A aplicação lidará e gerenciará segredos, seja por parte da infraestrutura quanto de algumas regras de negócio, além de armazenar, também gerar.&lt;/p&gt;

&lt;p&gt;Não somente os segredos, mas lidar corretamente com criptografia que terá uma grande atuação no projeto.&lt;/p&gt;

&lt;p&gt;Para que não precise implementar na mão ou utilizar soluções não tão confiáveis, o vault vem como solução especializada e madura nisso, sendo utilizado como um serviço integrado ao projeto e o melhor, aplicando esses conceitos críticos de forma correta, além de abrir outras possibilidades, pois o mesmo tem mais features do que está descrito aqui e de uma forma mais aprofundada.&lt;/p&gt;

&lt;p&gt;A persistência das informações ocorrerá a partir da utilização de um banco postgres próprio e isolado.&lt;/p&gt;




&lt;h1&gt;
  
  
  Considerações finais
&lt;/h1&gt;

&lt;p&gt;Agradeço por todos que leram até o final, é um passo importante para mim estar escrevendo meu primeiro artigo e estar compartilhando minha experiência nesse projeto.&lt;/p&gt;

&lt;p&gt;Provavelmente nos próximos capítulos já será sobre a primeira entrega, dando início ao desenvolvimento.&lt;/p&gt;

&lt;p&gt;Novamente, estou aberto a feedbacks, discussões, trocar uma ideia, compartilhar, contribuições e tudo aquilo que venha agregar e contribuir para a evolução contínua. &lt;/p&gt;

&lt;p&gt;Obrigado.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
