<?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>DEV Community: José Leal</title>
    <description>The latest articles on DEV Community by José Leal (@lealnetosena).</description>
    <link>https://dev.to/lealnetosena</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F801380%2F75923e6e-03d9-45b9-9ab3-bd5c55c18617.jpeg</url>
      <title>DEV Community: José Leal</title>
      <link>https://dev.to/lealnetosena</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lealnetosena"/>
    <language>en</language>
    <item>
      <title>Como escalar um sistema legado com arquitetura orientada a eventos (sem reescrevê-lo)</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Mon, 28 Sep 2026 17:13:01 +0000</pubDate>
      <link>https://dev.to/lealnetosena/como-escalar-um-sistema-legado-com-arquitetura-orientada-a-eventos-sem-reescreve-lo-3en1</link>
      <guid>https://dev.to/lealnetosena/como-escalar-um-sistema-legado-com-arquitetura-orientada-a-eventos-sem-reescreve-lo-3en1</guid>
      <description>&lt;p&gt;&lt;em&gt;Primeiro post de uma série sobre arquitetura orientada a eventos (EDA),&lt;br&gt;
construída em público a partir de um case fictício: a Faculdade Leal. Este&lt;br&gt;
post fica em nível de arquitetura — a implementação (Apache Camel, código&lt;br&gt;
dos consumers, etc.) vem nos posts seguintes, conforme for sendo construída.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;p&gt;Imagine que você é responsável pelo financeiro de uma faculdade grande.&lt;br&gt;
Todo mês, o sistema precisa gerar a fatura de milhares de alunos — calculando&lt;br&gt;
matérias cursadas, dependências e taxas de serviço — e hoje isso leva &lt;strong&gt;cerca&lt;br&gt;
de 4 dias&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Paralelamente, quando um aluno entra no site pra pegar o boleto, o sistema&lt;br&gt;
aciona &lt;strong&gt;outra procedure&lt;/strong&gt; (&lt;code&gt;GeraFaturaFinal&lt;/code&gt;), que lê o resultado já&lt;br&gt;
calculado — guardado na &lt;code&gt;TbFatura&lt;/code&gt; — e, &lt;strong&gt;na mesma execução síncrona&lt;/strong&gt;,&lt;br&gt;
chama duas APIs externas em sequência: primeiro o Sistema de Pagamentos,&lt;br&gt;
pra gerar o boleto; depois a Prefeitura, pra emitir a nota fiscal (NFS-e).&lt;br&gt;
Se a segunda falhar, o processo inteiro retorna erro — &lt;strong&gt;mesmo o boleto que&lt;br&gt;
já tinha sido gerado é descartado&lt;/strong&gt;. Funciona bem com pouco acesso e os dois&lt;br&gt;
terceiros no ar. Perto do vencimento, com muito acesso simultâneo e qualquer&lt;br&gt;
instabilidade da Prefeitura, o site fica lento, cai, ou devolve erro em&lt;br&gt;
pedidos que já tinham, na prática, dado certo.&lt;/p&gt;

&lt;p&gt;A arquitetura atual está desta forma:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fluxo em lote — cálculo da fatura&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fosft3ru6cmzpto8ul221.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fosft3ru6cmzpto8ul221.png" alt="Fluxo em lote — cálculo da fatura" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fluxo sob demanda — boleto no clique do usuário&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffkmn5qtzjd2muibkeqzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffkmn5qtzjd2muibkeqzp.png" alt="Fluxo sob demanda — boleto no clique do usuário" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(desenho original: &lt;a href="https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/arquitetura-atual.drawio" rel="noopener noreferrer"&gt;https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/arquitetura-atual.drawio&lt;/a&gt;; versão em&lt;br&gt;
Mermaid equivalente em &lt;a href="https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/01-arquitetura-atual.md" rel="noopener noreferrer"&gt;https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/01-arquitetura-atual.md&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Os problemas, resumidos:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;As tabelas &lt;code&gt;TbLancamentos&lt;/code&gt; e &lt;code&gt;TbFatura&lt;/code&gt; têm dados acumulados de anos, sem
processo de expurgo ou limpeza, e faltam alguns índices.&lt;/li&gt;
&lt;li&gt;O processamento é feito linha a linha, aluno por aluno, e não em lote.&lt;/li&gt;
&lt;li&gt;O usuário pede a fatura e ela executa diversas chamadas síncronas, tanto
para o sistema legado quanto para as APIs externas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Soluções propostas e nova arquitetura
&lt;/h2&gt;

&lt;p&gt;Três frentes resolvem os problemas acima. As duas primeiras são ajustes&lt;br&gt;
pontuais no banco de dados; a terceira é a decisão arquitetural central&lt;br&gt;
deste post, e é ela que o resto do texto detalha:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criação de índices.&lt;/li&gt;
&lt;li&gt;Criação de processo de expurgo no banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vamos implantar arquitetura orientada a eventos (EDA)&lt;/strong&gt;: cada etapa —
cálculo da fatura, geração do boleto, emissão da nota fiscal — passa a
reagir a um evento, em vez de depender de uma chamada síncrona
encadeada. Isso desacopla as etapas entre si e do legado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A implantação consiste em criar um broker de mensageria (Kafka) com eventos&lt;br&gt;
bem definidos.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Producer — fatura pronta
&lt;/h3&gt;

&lt;p&gt;O legado não muda nada — continua realizando o processo de cálculo do jeito&lt;br&gt;
que já faz. Quem avisa que uma fatura ficou pronta é um componente novo, e&lt;br&gt;
aqui existem &lt;strong&gt;duas soluções possíveis&lt;/strong&gt;, porque nem todo ambiente vai&lt;br&gt;
permitir a ideal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução A — Polling (mais simples, acesso padrão)&lt;/strong&gt;&lt;br&gt;
Um projeto lê a &lt;code&gt;TbFatura&lt;/code&gt; a cada 30 minutos e publica as faturas prontas no&lt;br&gt;
evento &lt;code&gt;fatura.pronta&lt;/code&gt;. Não exige nenhuma permissão especial no banco — só&lt;br&gt;
uma conexão de leitura comum, do tipo que qualquer aplicação já tem. Em&lt;br&gt;
troca, aceita até 30 minutos de atraso e uma consulta periódica na tabela.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução B — CDC / Debezium (ideal, mas exige acesso de replicação)&lt;/strong&gt;&lt;br&gt;
Um conector lê o &lt;strong&gt;log de transação&lt;/strong&gt; do banco diretamente — o registro&lt;br&gt;
interno que todo banco já mantém, pra recuperação e réplica — e reage em&lt;br&gt;
milissegundos, sem tocar na tabela nem no legado. O problema: isso exige que&lt;br&gt;
o time de banco de dados libere uma permissão especial (usuário de&lt;br&gt;
replicação), e nem toda empresa concede isso com facilidade, ou já tem a&lt;br&gt;
infraestrutura (Kafka Connect) pronta.&lt;/p&gt;

&lt;p&gt;Por enquanto, seguimos com a &lt;strong&gt;Solução A&lt;/strong&gt;, documentando a B como evolução&lt;br&gt;
possível se o acesso existir ou se o atraso de 30 min virar uma dor real.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Consumer — finaliza fatura
&lt;/h3&gt;

&lt;p&gt;Em vez de finalizar a fatura no momento em que o usuário clica, isso passa a&lt;br&gt;
acontecer antes: como o processo de geração já demora até 4 dias, durante&lt;br&gt;
essa janela, conforme as faturas vão ficando prontas (&lt;code&gt;fatura.pronta&lt;/code&gt;), já&lt;br&gt;
rodamos o cálculo final que hoje é feito no clique (o passo &lt;code&gt;1.2&lt;/code&gt; de&lt;br&gt;
&lt;code&gt;GeraFaturaFinal&lt;/code&gt;). Ao terminar, publica &lt;code&gt;fatura.finalizada&lt;/code&gt; — só isso, sem&lt;br&gt;
gravar nada. Persistir é responsabilidade de outro componente.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Consumer — persiste fatura (atômico)
&lt;/h3&gt;

&lt;p&gt;Um componente com uma responsabilidade só: ouvir &lt;code&gt;fatura.finalizada&lt;/code&gt; e&lt;br&gt;
gravar o resultado num &lt;strong&gt;banco de dados próprio&lt;/strong&gt; (não o do legado — um&lt;br&gt;
armazenamento novo, dono desse dado). A gravação é &lt;strong&gt;insert-only&lt;/strong&gt;: cada&lt;br&gt;
cálculo vira uma linha nova, com data e hora, nunca sobrescrevendo a&lt;br&gt;
anterior. Isso dá dois resultados de graça — uma consulta rápida (a linha&lt;br&gt;
mais recente de um aluno) e um histórico completo, útil pra auditoria,&lt;br&gt;
inclusive se um valor foi recalculado depois, e quando. É esse banco que o&lt;br&gt;
Consumer gerar boleto vai consultar mais tarde, no clique do usuário.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Consumer — gerar boleto
&lt;/h3&gt;

&lt;p&gt;Também usa fila, mas dispara no &lt;strong&gt;clique do usuário&lt;/strong&gt; (&lt;code&gt;boleto.solicitado&lt;/code&gt;),&lt;br&gt;
não de forma proativa: gerar o boleto com antecedência pode ficar errado se&lt;br&gt;
o aluno pagar via PIX, que não aplica o mesmo desconto. O PIX em si não é o&lt;br&gt;
problema hoje, está funcional — mas ainda assim ele isola o boleto do&lt;br&gt;
fornecedor de pagamento usado: a mensagem carrega um campo dizendo qual é o&lt;br&gt;
fornecedor, e mantém o design plugável pra escalar com mais projetos&lt;br&gt;
conectados. (PIX fica fora do escopo do resto da série — citado aqui só como&lt;br&gt;
o motivo de design por trás do boleto ser gerado no clique, não de forma&lt;br&gt;
proativa.) Ao final, publica &lt;code&gt;boleto.gerado&lt;/code&gt;, que aciona o Consumer de&lt;br&gt;
Nota Fiscal e também devolve o boleto pro usuário.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Consumer — Nota Fiscal
&lt;/h3&gt;

&lt;p&gt;Verifica o evento &lt;code&gt;boleto.gerado&lt;/code&gt; e aciona a API da Prefeitura. Esta é a&lt;br&gt;
etapa mais problemática hoje, então aqui entra retry em caso de erro, com&lt;br&gt;
uma fila própria (&lt;code&gt;notafiscal.erro&lt;/code&gt;) pra tratar o que esgotar as tentativas.&lt;br&gt;
Em caso de sucesso, publica &lt;code&gt;notafiscal.pronta&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Consumer — nota fiscal pronta
&lt;/h3&gt;

&lt;p&gt;Conectado à API de notificação e ao site — o site terá um local pra&lt;br&gt;
consultar a nota, e ela também será enviada por e-mail ao usuário.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por que isso escala naturalmente
&lt;/h2&gt;

&lt;p&gt;Com esses componentes isolados, temos possibilidade de escalar&lt;br&gt;
horizontalmente, e isso vai acontecer naturalmente, por dois motivos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O sistema legado tem uma pendência de expurgo e manutenção de índice e&lt;br&gt;
performance (existe até oportunidade de melhorar a procedure). Como é&lt;br&gt;
algo crítico e exige bastante validação, isso vai acontecer ao longo dos&lt;br&gt;
meses. Conforme a velocidade do processamento das faturas for melhorando,&lt;br&gt;
a capacidade dos consumers pode ser expandida — e isso pode até ser feito&lt;br&gt;
de forma automática, usando Kubernetes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Na aquisição de uma nova unidade, ela também vai precisar inserir no&lt;br&gt;
consumer de fatura pronta (ou de fatura final), e, caso tenha um volume&lt;br&gt;
maior, os consumers também podem crescer automaticamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Eventos — quem publica, quem consome
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evento&lt;/th&gt;
&lt;th&gt;Publica&lt;/th&gt;
&lt;th&gt;Consome&lt;/th&gt;
&lt;th&gt;Quando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fatura.pronta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Producer (polling 30min)&lt;/td&gt;
&lt;td&gt;Consumer finaliza fatura&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CalculaFatura&lt;/code&gt; terminou pra 1 aluno&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fatura.finalizada&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer finaliza fatura&lt;/td&gt;
&lt;td&gt;Consumer persiste fatura — grava insert-only num banco próprio (não o do legado)&lt;/td&gt;
&lt;td&gt;Cálculo final rodou, proativo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;boleto.solicitado&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer gerar boleto (dispara com o clique do usuário no Site)&lt;/td&gt;
&lt;td&gt;Consumer gerar boleto — &lt;strong&gt;consulta o banco&lt;/strong&gt; (não consome &lt;code&gt;fatura.finalizada&lt;/code&gt; de novo)&lt;/td&gt;
&lt;td&gt;Aluno clicou pedindo o boleto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;boleto.gerado&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer gerar boleto&lt;/td&gt;
&lt;td&gt;Consumer Nota Fiscal (e o próprio Consumer gerar boleto usa a resposta pra devolver o boleto ao usuário)&lt;/td&gt;
&lt;td&gt;Sistema de Pagamentos respondeu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;notafiscal.pronta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer Nota Fiscal&lt;/td&gt;
&lt;td&gt;Consumer nota fiscal pronta (site/e-mail)&lt;/td&gt;
&lt;td&gt;Prefeitura respondeu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;notafiscal.erro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer Nota Fiscal&lt;/td&gt;
&lt;td&gt;Fila de erro / alerta&lt;/td&gt;
&lt;td&gt;Esgotou retry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  A nova arquitetura
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(diagramas: ver &lt;a href="https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/02-arquitetura-proposta.md" rel="noopener noreferrer"&gt;https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/02-arquitetura-proposta.md&lt;/a&gt; — a arquitetura&lt;br&gt;
completa com os componentes descritos acima, além do detalhamento&lt;br&gt;
completo com os nomes concretos de tecnologia em&lt;br&gt;
&lt;a href="https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/arquitetura-atual.drawio" rel="noopener noreferrer"&gt;https://github.com/lealnetosena/faculdade-leal/blob/master/diagramas/arquitetura-atual.drawio&lt;/a&gt;)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    Legado["Sistema Acadêmico&amp;lt;br/&amp;gt;(legado, sem mudança)"] --&amp;gt; Producer["Producer&amp;lt;br/&amp;gt;fatura pronta"]
    Producer --&amp;gt;|fatura.pronta| CF["Consumer&amp;lt;br/&amp;gt;finaliza fatura"]
    CF --&amp;gt;|fatura.finalizada| CP["Consumer&amp;lt;br/&amp;gt;persiste fatura&amp;lt;br/&amp;gt;(atômico)"]
    CP --&amp;gt; Banco[("Banco próprio&amp;lt;br/&amp;gt;insert-only")]

    Aluno(["Aluno&amp;lt;br/&amp;gt;clica no site"]) --&amp;gt;|boleto.solicitado| CB["Consumer&amp;lt;br/&amp;gt;gerar boleto"]
    Banco --&amp;gt; CB
    CB --&amp;gt; Pagamentos["Sistema de&amp;lt;br/&amp;gt;Pagamentos"]
    CB --&amp;gt;|boleto entregue| Recebido(["Aluno recebe&amp;lt;br/&amp;gt;o boleto"])
    CB --&amp;gt;|boleto.gerado| CNF["Consumer&amp;lt;br/&amp;gt;Nota Fiscal"]

    CNF --&amp;gt; Prefeitura["Sistema Prefeitura&amp;lt;br/&amp;gt;NFS-e"]
    CNF --&amp;gt;|notafiscal.erro| ErroFila[("Fila de erro")]
    CNF --&amp;gt;|notafiscal.pronta| CNP["Consumer&amp;lt;br/&amp;gt;nota fiscal pronta"]
    CNP --&amp;gt; Aviso(["Aluno é avisado&amp;lt;br/&amp;gt;site / e-mail"])

    classDef novo fill:#d5e8d4,stroke:#82b366
    class Producer,CF,CP,CB,CNF,CNP novo&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Versão detalhada, com os nomes concretos de tecnologia (Spring Batch, Spring&lt;br&gt;
Boot, Apache Camel) e a numeração passo a passo — desenhada no draw.io:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fluxo de cálculo — fatura pronta e persistida&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjx0xiihz20643zi89rg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjx0xiihz20643zi89rg.png" alt="Fluxo de cálculo — fatura pronta e persistida" width="799" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fluxo de boleto — request-reply sobre Kafka + nota fiscal isolada&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhtvkraatw2wq9k8lceol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhtvkraatw2wq9k8lceol.png" alt="Fluxo de boleto — request-reply sobre Kafka + nota fiscal isolada" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bala de prata?
&lt;/h2&gt;

&lt;p&gt;A arquitetura orientada a eventos (EDA) é uma ferramenta importante para&lt;br&gt;
resolver problemas complexos e grandes. Este cenário hipotético é bem&lt;br&gt;
simplificado, mas dá um gosto de um contexto maior, expandido com diversas&lt;br&gt;
áreas. E "bala de prata" é bem a palavra errada pra usar aqui — como toda&lt;br&gt;
decisão de arquitetura, ela troca um conjunto de problemas por outro. Abaixo,&lt;br&gt;
os prós e os contras de implantar essa arquitetura, de forma mais técnica:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desacoplamento entre times e sistemas&lt;/strong&gt; — quem publica e quem consome
não precisam se conhecer, nem fazer deploy juntos, nem compartilhar
banco.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolamento de falha&lt;/strong&gt; — se um consumer cai ou fica lento, não derruba
quem publicou nem os outros consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escala independente&lt;/strong&gt; — aumenta instâncias de um consumer sem tocar no
publicador, e vice-versa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Um fato, várias reações (fan-out)&lt;/strong&gt; — quando algo precisa disparar N
ações independentes, o publicador não precisa saber nem orquestrar quem
são elas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desacoplamento no tempo&lt;/strong&gt; — publicador e consumidor não precisam estar
no ar ao mesmo tempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trilha de auditoria e replay&lt;/strong&gt; — com um log como o Kafka, existe
histórico do que aconteceu, e dá pra reprocessar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ponte entre legado e novo sem reescrever o legado&lt;/strong&gt; — o sistema antigo
só publica um evento, o resto reage sem tocar nele (&lt;em&gt;Strangler Fig&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Contras&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complexidade operacional&lt;/strong&gt; — de um sistema só, passamos a ter 6+
processos independentes, cada um com seu próprio deploy, log e
monitoramento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistência eventual, por design&lt;/strong&gt; — o aluno pode ver o boleto pronto
e a nota ainda "em processamento"; o site precisa saber lidar com
estados intermediários, algo que não existia no fluxo síncrono de hoje.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falha parcial vira um estado real&lt;/strong&gt; — sem retry e fila de erro bem
pensados, uma mensagem perdida é pior do que o erro síncrono de hoje,
porque ninguém percebe na hora.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depuração mais difícil&lt;/strong&gt; — em vez de olhar um log só, é preciso
correlacionar eventos entre vários serviços pra entender o que aconteceu
com uma fatura específica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curva de aprendizado&lt;/strong&gt; — o time precisa entender conceitos que não
existiam no mundo síncrono: mensageria, consumer groups, idempotência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atraso da Solução A&lt;/strong&gt; — o polling ainda deixa até 30 minutos de
defasagem; não é tempo real de verdade até evoluir pra CDC.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eu me considero um eterno estudante. Esse artigo foi criado por mim, com&lt;br&gt;
auxílio de inteligência artificial. Caso encontre algum erro ou alguma&lt;br&gt;
melhoria, fique à vontade para me enviar.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>kafka</category>
      <category>microservices</category>
      <category>java</category>
    </item>
    <item>
      <title>Configuração Simples para rodar servidor PHP. (sem senha ADM)</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Mon, 02 Jan 2023 20:36:01 +0000</pubDate>
      <link>https://dev.to/lealnetosena/configuracao-simples-para-rodar-servidor-php-sem-senha-adm-4992</link>
      <guid>https://dev.to/lealnetosena/configuracao-simples-para-rodar-servidor-php-sem-senha-adm-4992</guid>
      <description>&lt;p&gt;Hoje precisei configurar um ambiente de desenvolvimento para rodar script's PHP e consegui de forma simples seguindo os passos abaixo:&lt;/p&gt;

&lt;p&gt;1- Baixe a versão mais recente no site oficial php&lt;br&gt;
&lt;a href="https://windows.php.net/download" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvv2z4br2cwnzjmj0262.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvv2z4br2cwnzjmj0262.png" alt="Pagina oficial de download php" width="728" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2- Descompacte e deixe os arquivos em um pasta que possa usar depois (pode ser em qualquer pasta do Windows) no meu caso coloquei no C:\php&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6thrjwr2qt7o9vrzi42u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6thrjwr2qt7o9vrzi42u.png" alt="Local dos arquivos descompactados " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3- Você já pode subir um servidor executando o seguinte comando no prompt de comando(cmd):&lt;br&gt;
&lt;code&gt;&lt;br&gt;
C:\php\php.exe -S localhost:8888&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2tpsape59y55o1xkyv4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2tpsape59y55o1xkyv4.png" alt="prompt de comando servidor ouvindo/iniciado " width="754" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4- Observe que o caminho do meu CMD é C:\Git\php_projeto e nesse local que tem que está seus arquivos php:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fms8wr7l2bpxeai6frsae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fms8wr7l2bpxeai6frsae.png" alt="Ide VS Code com os arquivos" width="569" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz2dujbmv15cm8mb3r7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz2dujbmv15cm8mb3r7z.png" alt="Exemplo de execução do código no navegador" width="390" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5- Para facilitar você pode adicionar o php as variaveis de ambientes para que não precise passar o caminho do php todas as vezes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6a7vyxjw7hdl89ixpsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6a7vyxjw7hdl89ixpsb.png" alt="Configuração windows" width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
Escolha a segunda opção para nível usuário(sem senha ADM)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmb4odc1fh4hfq0h4djf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmb4odc1fh4hfq0h4djf.png" alt="Lista de variáveis de ambiente" width="627" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8eox5e5ded0t17ctmcr6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8eox5e5ded0t17ctmcr6.png" alt="Lista de variáveis de ambiente do path e inclusão" width="632" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6- Agora pode digitar o comando para iniciar o servidor da seguinte forma:&lt;br&gt;
&lt;code&gt;php -S localhost:8888&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Scripts (.bat)</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Thu, 17 Feb 2022 19:56:31 +0000</pubDate>
      <link>https://dev.to/lealnetosena/scripts-bat-498p</link>
      <guid>https://dev.to/lealnetosena/scripts-bat-498p</guid>
      <description>&lt;p&gt;&lt;strong&gt;Configuração Arquivo Imagem Scanner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O programa que realiza o escaneamento das impressoras Brother define por padrão o formato .bmp que com as resoluções necessárias cada arquivo ocupava em média 24 MB de espaço em disco.&lt;/p&gt;

&lt;p&gt;Sempre tínhamos problemas de armazenamento nos computadores(120 onde eu atuava) devido a essa configuração.&lt;/p&gt;

&lt;p&gt;Foi encontrado as chaves de registros do windows onde eram armazenadas estas configurações.&lt;/p&gt;

&lt;p&gt;Realizamos uma configuração padrão exportamos e desenvolvemos o script abaixo que adicionamos idle-time para que funcionasse corretamente&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/ping"&gt;@ping&lt;/a&gt; 127.0.0.1 -n 10 -w 1000 &amp;gt; nul&lt;br&gt;
taskkill /F /IM BrccMCtl.exe&lt;br&gt;
taskkill /F /IM brctrcen.exe &lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/ping"&gt;@ping&lt;/a&gt; 127.0.0.1 -n 2 -w 1000 &amp;gt; nul&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button0\HardBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button0\HardBtn\BtnAction" /v "FileComp" /t REG_DWORD /d "0x00000003" /f &lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button0\HardBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button0\SoftBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button0\SoftBtn\BtnAction" /v "FileComp" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button0\SoftBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button3\HardBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x0000000e" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button3\HardBtn\BtnAction" /v "FileComp" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button3\HardBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button3\SoftBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x0000000e" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button3\SoftBtn\BtnAction" /v "FileComp" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8890DW LAN\Tabs\0000\Button3\SoftBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8860DN LAN\Tabs\0000\Button0\HardBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\3.0\MFC-8860DN LAN\Tabs\0000\Button0\HardBtn\BtnAction" /v "FileComp" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
0000\Button0\HardBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8890DW LAN\Tabs\0000\Button0\SoftBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8890DW LAN\Tabs\0000\Button0\SoftBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8890DW LAN\Tabs\0000\Button3\HardBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x0000000e" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8890DW LAN\Tabs\0000\Button3\HardBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8890DW LAN\Tabs\0000\Button3\SoftBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x0000000e" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8890DW LAN\Tabs\0000\Button3\SoftBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button0\HardBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button0\HardBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button0\SoftBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x00000003" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button0\SoftBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button3\HardBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x0000000e" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button3\HardBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button3\SoftBtn\BtnAction" /v "FileType" /t REG_DWORD /d "0x0000000e" /f&lt;br&gt;
REG ADD "HKCU\Software\Brother\ControlCenter\2.0\MFC-8480DN LAN\Tabs\0000\Button3\SoftBtn\ScanSetting" /v "Resolution" /t REG_DWORD /d "0x00000064" /f&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/ping"&gt;@ping&lt;/a&gt; 127.0.0.1 -n 2 -w 1000 &amp;gt; nul&lt;br&gt;
"C:\Program Files (x86)\Brother\ControlCenter3\BrccMCtl.exe"&lt;br&gt;
"c:\Program Files (x86)\Brother\ControlCenter2\brctrcen.exe"&lt;br&gt;
"C:\Program Files\Brother\ControlCenter3\BrccMCtl.exe"&lt;br&gt;
"c:\Program Files\Brother\ControlCenter2\brctrcen.exe"&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Gestão/Automação Processos</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Thu, 17 Feb 2022 18:49:03 +0000</pubDate>
      <link>https://dev.to/lealnetosena/gestaoautomacao-processos-em4</link>
      <guid>https://dev.to/lealnetosena/gestaoautomacao-processos-em4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Solicitação de Arquivo em Servidor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para iniciar um processamento de uma planilha era necessário pedir   os arquivos em TXT em um servidor que só disponibilizava esses arquivos após as 18h.&lt;/p&gt;

&lt;p&gt;E esse arquivo deve ser pedido todo 1° dia útil do mês. Porém como o prazo de entrega desse processamento tem que ser o mais rápido possível, foi cogitado por mim um teste as 6h da manhã já que dava a entender que o arquivo só era gerado fora do horário comercial. &lt;br&gt;
Foi desenvolvido um robô utilizando VBA/Excel, Script(.Bat),Outlook, e Agendador de tarefas do Windows.&lt;br&gt;
Esse robô realizava os seguinte passos&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Disparo realizado pelo Agendador de tarefa do windows&lt;/li&gt;
&lt;li&gt;Abrir o sistema ERP da empresa(.Bat)&lt;/li&gt;
&lt;li&gt;Abrir a planilha de pedido(.Bat)&lt;/li&gt;
&lt;li&gt;Realizar o Login e pedido do arquivo (vba)&lt;/li&gt;
&lt;li&gt;Salva a planilha e envia o um e-mail utilizando o Outlook com o status do pedido para meu email pessoal(vba)&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Caso houvesse algum erro eu já recebia a informação e já atuava.&lt;/p&gt;

&lt;p&gt;Após testes foi implementado e os arquivos eram disponibilizados no horário solicitado(pela manhã antes do expediente)&lt;/p&gt;

&lt;p&gt;Ao iniciar o dia de trabalho já estava com os arquivos ganhando 1 dia no prazo&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Python</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Thu, 17 Feb 2022 17:27:45 +0000</pubDate>
      <link>https://dev.to/lealnetosena/python-2nd7</link>
      <guid>https://dev.to/lealnetosena/python-2nd7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Sumário&lt;/strong&gt;&lt;br&gt;
- Consulta CEP&lt;br&gt;
- Editor PDF&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Consulta CEP&lt;/strong&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código abaixo interage com o navegador Chrome ao relizar a consulta do CEP dentro do site dos correios, colando e clicando nos botões da página.&lt;/p&gt;

&lt;p&gt;E com o Resultado as informações são inseridas em uma planilha.&lt;/p&gt;

&lt;p&gt;Nesse exemplo consulto 25 cep's, que trouxe o resultado em 18s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from playwright.sync_api import sync_playwright
import openpyxl

# Carregando arquivo
book = openpyxl.load_workbook('base_cep.xlsx')
# Selecionando uma página
planilha = book['Planilha1']
cep = []

for rows in planilha.iter_rows(min_row=2,max_row=26,min_col=1,max_col=1):
    cep.append(rows[0].value)


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    j = 2
    for i in cep: 

        page.goto("https://buscacepinter.correios.com.br/app/endereco/index.php")
        # page.wait_for_timeout(1000)
        # Colar o CEP name = "endereco"
        page.fill("input[name='endereco']",i)
        # page.wait_for_timeout(1000)
        # Clicar no botão buscar name="btn_pesquisar"
        page.click("button[name='btn_pesquisar']")
        # page.wait_for_timeout(1000)
        planilha['B' + str(j)] = page.text_content("td[data-th='Logradouro/Nome']")
        planilha['C' + str(j)] = page.text_content("td[data-th='Bairro/Distrito']")
        planilha['D' + str(j)] = page.text_content("td[data-th='Localidade/UF']")

        print(page.text_content("td[data-th='Logradouro/Nome']"))
        print(page.text_content("td[data-th='Bairro/Distrito']"))
        print(page.text_content("td[data-th='Localidade/UF']"))

        j = j + 1
book.save('base2.xlsx')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Planilha que é utilizada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fezfcqj6rifs0e7qqbhhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fezfcqj6rifs0e7qqbhhi.png" alt=" " width="530" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>VBA</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Thu, 17 Feb 2022 17:27:00 +0000</pubDate>
      <link>https://dev.to/lealnetosena/vba-54h</link>
      <guid>https://dev.to/lealnetosena/vba-54h</guid>
      <description>&lt;p&gt;&lt;strong&gt;Transformação de TXT em Excel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Existia um código vba que realizava o tratamento de arquivo TXT e transformava em Excel. Porém como existiam vários TXT denominados com UF era necessário executar o código em cada UF repetindo os passos cerca de 15 vezes.&lt;/p&gt;

&lt;p&gt;Foi aproveitado e modificado de outro código vba que realizava o mesmo trabalho só que para estrutura de arquivos diferentes.&lt;/p&gt;

&lt;p&gt;Em resumo o arquivo TXT em análise era separado por quantidade de caracteres já ou outro separado por ;. Então modifiquei a estrutura do código e adicionei também os formatos de colunas.&lt;/p&gt;

&lt;p&gt;Com isso o código agora com um loop já faz o trabalho nos 15 arquivos e já empilha.&lt;/p&gt;

&lt;p&gt;Veja como o código ficou: &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Técnicas Avançadas Excel</title>
      <dc:creator>José Leal</dc:creator>
      <pubDate>Thu, 17 Feb 2022 17:10:36 +0000</pubDate>
      <link>https://dev.to/lealnetosena/formulas-avancadas-excel-4g9l</link>
      <guid>https://dev.to/lealnetosena/formulas-avancadas-excel-4g9l</guid>
      <description>&lt;p&gt;Essas dicas e alterações são para que melhore a produtividade e você ganhe tempo em cada tarefa fazendo que no fim você ganhe horas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sumário&lt;/strong&gt;&lt;br&gt;
- Consulta Binária&lt;br&gt;
- Cálculo Manual&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Consulta binária&lt;/strong&gt;&lt;a&gt;&lt;/a&gt;&lt;br&gt;
Solução: Retorna o resultado de uma consulta de uma tabela(procv/corresp) muito rapidamente.&lt;/p&gt;

&lt;p&gt;Nas formulas do excel PROCV e CORRESP existe um argumento que altera a forma que a consulta é realizada. &lt;br&gt;
Normalmente utilizamos a consulta exata: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PROCV(A2;B:D;2;FALSO) / CORRESP(A2;B:B;1) &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;que traz o resultado normalmente porém caso você queria fazer muitas consultas ao mesmo tempo (no meu caso 100.000) vai demorar bastante para concluir.&lt;/p&gt;

&lt;p&gt;Nos testes as consultas dessa planilha ai (a dos 100.000 consultas) demorava cerca de 5 minutos. E como tinha que fazer essas consultas pelo menos umas 20 vezes no período de 2 horas ficava inviável.&lt;/p&gt;

&lt;p&gt;A solução foi fazer duas alterações:&lt;br&gt;
1- Alterar o argumento das fórmulas para correspondência aproximada, ficando assim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PROCV(A2;B:D;2;VERDADEIRO) / CORRESP(A2;B:B;0)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2- Ordenar a base com a coluna de consulta/índice em ordem alfabética ou do maior para o menor&lt;/p&gt;

&lt;p&gt;Pronto!!&lt;/p&gt;

&lt;p&gt;Agora tem um porém devido a característica da consulta é necessário um mudança da formula:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SE(PROCV(A2;B:D;1;VERDADEIRO)=A2;PROCV(A2;B:D;3;VERDADEIRO); NÃO.DISP())&lt;/p&gt;

&lt;p&gt;SE(ÍNDICE(B:B;CORRESP(A2;B:D;1))=A2;ÍNDICE(D:D;CORRESP(A2;B:D;1)); NÃO.DISP())&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso se faz necessário pois como essa consulta utiliza o algoritmo binária ou seja divide o intervalo em partes&lt;br&gt;
o valor que pesquisamos é comparado com o elemento no meio da lista e se não corresponder vai dividindo a tabela que ficam no intervalo fora da pesquisa até chegar ao valor mais próximo do valor que procuramos.&lt;/p&gt;

&lt;p&gt;Conceito bastante utilizado em bancos de dados chamado de índice(&lt;a href="http://www.linhadecodigo.com.br/artigo/3620/indices-mysql-otimizacao-de-consultas.aspx" rel="noopener noreferrer"&gt;http://www.linhadecodigo.com.br/artigo/3620/indices-mysql-otimizacao-de-consultas.aspx&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;O Resultado dessa consulta nesse case de 100.000 consultas, hoje é concluído em cerca 10 segundos considerando um processador Core i5-4570 - 3.20 Ghz - 8Gb Ram - HDD disco magnético (não ssd)&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cálculo Manual&lt;/strong&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por padrão o excel ao criar uma fórmula ele realiza o cálculo da fórmula automaticamente, por exemplo&lt;br&gt;
Se criou a fórmula abaixo&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;=SOMA(A2;A3)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E depois disso alterar os valores de A2 e A3 o excel realiza esse calculo automaticamente.&lt;/p&gt;

&lt;p&gt;Porém se tiver planilhas grandes e com muitas fórmulas pode começar a observar o excel travando ou lento, porém ele dá um sinal do por que está assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gchfw894gwzzzac65y1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gchfw894gwzzzac65y1.png" alt=" " width="574" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso mostra que por algum motivo o excel está realizando os cálculos que as vezes você não pediu. &lt;/p&gt;

&lt;p&gt;Uma solução para este problema é alterar a configuração padrão para calcular manualmente. Que agora para calcular a planilha atual utiliza-se F9 e toda a pasta de trabalho Ctrl+F9.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyobnhocqumdok889qir4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyobnhocqumdok889qir4.png" alt=" " width="277" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com essa alteração você ganha bastante tempo e o Excel só vai calcular quando solicitado.&lt;/p&gt;

&lt;p&gt;Atenção: Se abrir alguma planilha depois dessa alteração todas elas irão absorver essa característica e com isso ao salvar e outras pessoas abrirem podem cometer erros ao achar que está automático. Ou seja use essa dica com cuidado &lt;/p&gt;

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