<?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: Ortiz de Arcanjo António David</title>
    <description>The latest articles on DEV Community by Ortiz de Arcanjo António David (@ortizdavid).</description>
    <link>https://dev.to/ortizdavid</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%2F651046%2F503848e3-cf33-4502-a605-6853ab536783.jpg</url>
      <title>DEV Community: Ortiz de Arcanjo António David</title>
      <link>https://dev.to/ortizdavid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ortizdavid"/>
    <language>en</language>
    <item>
      <title>Por que contratar um Dev Remoto Angolano?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:06:57 +0000</pubDate>
      <link>https://dev.to/ortizdavid/por-que-contratar-um-dev-remoto-angolano-2il4</link>
      <guid>https://dev.to/ortizdavid/por-que-contratar-um-dev-remoto-angolano-2il4</guid>
      <description>&lt;p&gt;Enquanto todo mundo disputa os mesmos devs caros nos EUA e Europa, existe um mercado inteiro de talento sendo ignorado: Angola.&lt;/p&gt;

&lt;p&gt;Aqui vão 4 motivos reais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Custo x Qualidade
Formação sólida, bilíngue PT/EN, fuso GMT+1. Mesma qualidade técnica, investimento 3x menor. Oportunidade que gera impacto real.&lt;/li&gt;
&lt;li&gt;Fome de Crescimento
Aqui as vagas são poucas e muito concorridas. Quando um dev angolano recebe uma chance global, ele agarra com as duas mãos e entrega 200%.&lt;/li&gt;
&lt;li&gt;Resiliência nível Hard
Aprender a programar com poucos recursos te ensina a ser criativo e resolver problema. Qualquer desafio de produto é pequeno perto disso.&lt;/li&gt;
&lt;li&gt;Pagamento? Resolvido
SWIFT, Wise, Payoneer, Deel. Já não é mais desculpa. O dinheiro chega em USD.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Angola está cheia de talento que só precisa da primeira porta aberta.&lt;/p&gt;

&lt;p&gt;Dê essa oportunidade. Você ganha um dev leal, dedicado e com algo pra provar. Nós ganhamos a chance de mostrar nosso valor.&lt;/p&gt;

&lt;p&gt;Angola pode ser a nova Índia do desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;Aqui existem milhares de desenvolvedores resilientes, criativos e altamente qualificados. Gente que entrega resultado de excelência mesmo com poucos recursos, internet instável e prazos apertados.&lt;/p&gt;

&lt;p&gt;A tua empresa pode contratar esse talento hoje. &lt;br&gt;
Mesma qualidade de um dev da Europa/EUA. Custo muito menor. Impacto social gigante.&lt;/p&gt;

&lt;p&gt;Dê a primeira oportunidade remota para um desenvolvedor angolano. &lt;br&gt;
A tua empresa contrata talento e consequentemente muda a realidade de uma família inteira.&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%2Ffa18896nbryussotqi6e.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%2Ffa18896nbryussotqi6e.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angola</category>
      <category>remote</category>
      <category>developer</category>
      <category>software</category>
    </item>
    <item>
      <title>Trabalho Remoto - Como receber os Pagamentos</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Sun, 30 Aug 2026 21:29:08 +0000</pubDate>
      <link>https://dev.to/ortizdavid/trabalho-remoto-como-receber-os-pagamentos-17fb</link>
      <guid>https://dev.to/ortizdavid/trabalho-remoto-como-receber-os-pagamentos-17fb</guid>
      <description>&lt;p&gt;Se enumerarmos os fatores que levantam dúvidas e atrapalham o primeiro passo no trabalho remoto, com certeza a forma de Pagamento e Recebimento do salário ocupa o 1º lugar.&lt;/p&gt;

&lt;p&gt;A incerteza de como a empresa fará os pagamentos do salário e de como o Desenvolvedor vai receber, afasta as negociações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realidade de Angola
&lt;/h2&gt;

&lt;p&gt;No meu caso, Angola não oferece condições para pagamentos internacionais como es da Europa e América, por exemplo. Esse favor coloca Angola fora de do mapa de trabalho remoto.&lt;/p&gt;

&lt;p&gt;Há muitos casos em que a empresa opta por outros candidatos de países que facilitam essa transação. No meu caso, perdi e continuo a perder  várias oportunidades de emprego, por causa dessa incerteza, desde o jurídico até o financeiro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos/ Sistemas Conhecidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WISE&lt;/li&gt;
&lt;li&gt;Revoult&lt;/li&gt;
&lt;li&gt;Payoneer&lt;/li&gt;
&lt;li&gt;USDT&lt;/li&gt;
&lt;li&gt;Stripe &lt;/li&gt;
&lt;li&gt;Nomes Global&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solução Oficial
&lt;/h2&gt;

&lt;p&gt;A solução mais segura que encontrei foi a transferência internacional por meio do sistema SWIFT.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o SWIFT?
&lt;/h2&gt;

&lt;p&gt;Em poucas palavras: SWIFT é a forma oficial de transferências entre países. Todas transferências comerciais entrar países passam por esse sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura do SWIFT
&lt;/h2&gt;

&lt;p&gt;O Swift é formado pelo IBAN, Endereço do Banco, Código Swift, Registo Bancário, Contacto do Banco e Endereço do Beneficiário.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como usar o SWIFT para pagamentos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Solicitar os dados SWIFT no seu banco.&lt;/li&gt;
&lt;li&gt;Organizar os dados SWIFT num arquivo PDF ou Imagem&lt;/li&gt;
&lt;li&gt;Fornecer os dados a Empresa&lt;/li&gt;
&lt;li&gt;O valor chega em dólares, na conta do seu banco comercial&lt;/li&gt;
&lt;li&gt;Converter o valor de USD para AOA&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Observações
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A transferência internacional com SWIFT pode durar de 3 a 5 dias úteis&lt;/li&gt;
&lt;li&gt;Necessita de conversão por parte da Empresa, mas é simples&lt;/li&gt;
&lt;li&gt;A transferência requer validação de N bancos intermediários e outras instituições &lt;/li&gt;
&lt;li&gt;O beneficiário sofre pequenos descontos, totalizando aproximadamente 13 000 AOA&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resultado
&lt;/h2&gt;

&lt;p&gt;No início duvidava desse método. &lt;br&gt;
O primeiro contacto foi estranho pela demora mas ganhei confiança nesse método actualmente é o que mais confio.&lt;/p&gt;

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

&lt;p&gt;O SWIFT pode ser a resposta que as empresas estrangeiras procuram durante o recrutamento de Profissionais Angolanos.&lt;br&gt;
As empresas internacionais podem economizar muito, dando oportunidade aos programadores angolanos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;p&gt;Em seguida forneço uma imagem com os dados necessários para uma transferência Swift, usando o banco BAI.&lt;/p&gt;

&lt;p&gt;Para mais informações, contactar o seu banco pode trazer as melhores respostas.&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%2Fpae3rl4le7gczlb6qinr.jpeg" 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%2Fpae3rl4le7gczlb6qinr.jpeg" alt=" " width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>remote</category>
      <category>backend</category>
    </item>
    <item>
      <title>Minha experiência: 1 ano de Trabalho Remoto</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Sun, 16 Aug 2026 21:59:30 +0000</pubDate>
      <link>https://dev.to/ortizdavid/minha-experiencia-1-ano-de-trabalho-remoto-1amg</link>
      <guid>https://dev.to/ortizdavid/minha-experiencia-1-ano-de-trabalho-remoto-1amg</guid>
      <description>&lt;h2&gt;
  
  
  Como começou
&lt;/h2&gt;

&lt;p&gt;Em junho de 2025 comecei a trabalhar remotamente como Backend Engineer.&lt;br&gt;
Stack: Python, MongoDB e Redis para o desenvolvimento de uma plataforma administrativa multi-organizações, focada no setor jurídico e com expansão para RH e financeiro de cada cliente.&lt;/p&gt;

&lt;p&gt;3 meses depois ingressei em outra oportunidade como Golang Developer, desenvolvendo microsserviços para diferentes produtos: motor de assinatura de documentos, serviço de log e auditoria de sistemas, gestão completa de produtos e até controle de frota com autenticação OTP.&lt;/p&gt;

&lt;p&gt;Depois de 1 ano trabalhando ativamente e de forma deliberada com a cultura remota, adquiri experiências que serão úteis em qualquer oportunidade. Acredito que é o formato que mais se identifica comigo: foco, testar, corrigir e entregar.&lt;/p&gt;

&lt;p&gt;O que esses trabalhos têm em comum: orientação a resultado. São muitas demandas e todos os sistemas têm um requisito básico: multi-tenant. Eu já tinha noções sobre o tema, mas aprendi na prática a lidar com a complexidade de isolar dados sem vazamento entre organizações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolução
&lt;/h2&gt;

&lt;p&gt;Anteriormente eu tinha uma má impressão sobre o trabalho remoto. Como seria avaliado? Como mostrar resultados? Como ficariam as interações?&lt;br&gt;
Com o tempo, essas questões se tornaram fáceis para mim.&lt;/p&gt;

&lt;p&gt;Remoto não é desvantagem. Apenas exige um tempo de adaptação, tanto para a empresa quanto para o profissional.&lt;br&gt;
Quem ingressa no remoto e colhe bons resultados, raramente deseja voltar ao formato 100% presencial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparação com o presencial
&lt;/h2&gt;

&lt;p&gt;O formato presencial é bom: há interações pessoais cara a cara, confraternizações, facilidade para explicar inquietações aos líderes e agilidade no dia a dia. Mas, felizmente, a área de software nos dá a possibilidade de trabalhar remoto e entregar mais resultados, abrindo mão apenas da interação pessoal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos fortes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Orientação a resultado&lt;/li&gt;
&lt;li&gt;Eficiência&lt;/li&gt;
&lt;li&gt;Reuniões mais curtas&lt;/li&gt;
&lt;li&gt;Sem conversas paralelas&lt;/li&gt;
&lt;li&gt;Obriga a automatizar processos de desenvolvimento&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desafios
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cobrança maior, pela falta de outros elementos de acompanhamento&lt;/li&gt;
&lt;li&gt;Risco de acúmulo de tarefas em pouco tempo&lt;/li&gt;
&lt;li&gt;Pouca interação pessoal, o que pode ser um problema para alguns&lt;/li&gt;
&lt;li&gt;Questões documentais podem ser menos rigorosas&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Espero permanecer por muitos anos trabalhando remotamente.&lt;br&gt;
Tem sido satisfatório trabalhar nesse formato, de qualquer lugar, entregando resultados com pouca burocracia.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>remote</category>
      <category>go</category>
      <category>python</category>
    </item>
    <item>
      <title>Como implementar No-Ops para Blindar Microsserviços em Go</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 12 May 2026 13:52:29 +0000</pubDate>
      <link>https://dev.to/ortizdavid/como-implementar-no-ops-para-blindar-microsservicos-em-go-12kd</link>
      <guid>https://dev.to/ortizdavid/como-implementar-no-ops-para-blindar-microsservicos-em-go-12kd</guid>
      <description>&lt;p&gt;Muitas aplicações morrem (&lt;code&gt;panic&lt;/code&gt;) porque um serviço de telemetria ou um broker de mensagens ficou offline por apenas 5 segundos.&lt;br&gt;
Por que é que a minha API de vendas caiu se o problema foi no servidor de logs, de cache ou de tracing?&lt;/p&gt;

&lt;p&gt;O sistema em produção deve resistir em caso de falha de infraestrutura. Para isso, basta definirmos prioridades e criticidade de acordo com o contexto da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos-Chave
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fail Fast: Para a Database. Se não há dados, não há negócio. Trava o processo cedo.&lt;/li&gt;
&lt;li&gt;Fail-Safe / Graceful Degradation: Para Observabilidade e serviços auxiliares. Se o Tracing caiu, a vida continua.&lt;/li&gt;
&lt;li&gt;Null Object Pattern (No-Op): A técnica de implementar interfaces com métodos vazios (ou neutros) para evitar verificações de &lt;code&gt;if resource != nil&lt;/code&gt; constantes no código de negócio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anatomia da Blindagem
&lt;/h2&gt;

&lt;p&gt;A nossa estrutura de &lt;code&gt;InfrapResources&lt;/code&gt; deve ser inteligente ao inicializar os contratos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hard Dependencies: Aquelas que definem o estado (ex: Postgres para transações, Redis para Auth).&lt;/li&gt;
&lt;li&gt;Soft Dependencies: Aquelas que auxiliam o sistema (ex: RabbitMQ para eventos assíncronos, Prometheus, OpenTelemetry).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Base para a Implementação
&lt;/h2&gt;

&lt;p&gt;A base da nossa resiliência reside na Programação por Contratos. Ao definirmos interfaces claras em &lt;code&gt;ports&lt;/code&gt;, permitimos que a aplicação decida, em tempo de boot, qual "peça" encaixar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A peça Real: Conecta ao serviço e executa operações reais.&lt;/li&gt;
&lt;li&gt;A peça No-Op: Silencia falhas e mantém o sistema estável (executa uma operação "vazia").&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ambas respeitam rigorosamente os contratos de infraestrutura: &lt;code&gt;Database&lt;/code&gt;, &lt;code&gt;Cache&lt;/code&gt;, &lt;code&gt;MessageBroker&lt;/code&gt;, entre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios Reais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Developer Experience (DX): O programador não precisa de espalhar &lt;code&gt;if r.Resource != nil&lt;/code&gt; em todo o lado. O contrato está lá e é seguro chamá-lo.&lt;/li&gt;
&lt;li&gt;Resiliência: A app sobrevive em ambientes instáveis (como instâncias gratuitas ou clouds com flutuações de rede).&lt;/li&gt;
&lt;li&gt;Testabilidade: No-Ops são, na prática, Mocks prontos para testes de integração e desenvolvimento local rápido.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Muita gente confunde resiliência com 'nunca falhar'. Na verdade, resiliência é saber o que fazer quando a falha acontece.&lt;br&gt;
Implementar No-Ops em Go é uma das formas mais elegantes de garantir que o teu sistema não entra em pânico por causa de uma dependência não-crítica&lt;/p&gt;

&lt;p&gt;Código Fonte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/resilience" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/resilience&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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%2F6tvs8gplvnmxhr1ktw1z.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%2F6tvs8gplvnmxhr1ktw1z.png" alt=" " width="800" height="229"&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%2Fwifpq31ydj45d0876rp5.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%2Fwifpq31ydj45d0876rp5.png" alt=" " width="800" height="397"&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%2Fgngbr9ndrx30dlp7tlas.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%2Fgngbr9ndrx30dlp7tlas.png" alt=" " width="800" height="424"&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%2Fs9fay5l9epv9hxhj8ull.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%2Fs9fay5l9epv9hxhj8ull.png" alt=" " width="800" height="381"&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%2Fivyupjyzayti9at82jld.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%2Fivyupjyzayti9at82jld.png" alt=" " width="800" height="779"&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%2F8ziycgjiyrfae4w0zymh.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%2F8ziycgjiyrfae4w0zymh.png" alt=" " width="800" height="803"&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%2Fe0vp09hwzdunadcbm32p.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%2Fe0vp09hwzdunadcbm32p.png" alt=" " width="800" height="478"&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%2Fqoleqacfmn6vbvl5kkbj.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%2Fqoleqacfmn6vbvl5kkbj.png" alt=" " width="800" height="755"&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%2Fdi7ncmzeiko7c5lfjoqp.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%2Fdi7ncmzeiko7c5lfjoqp.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>resilience</category>
      <category>microservices</category>
      <category>go</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Gerenciamento de Cron Jobs em Golang</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Fri, 24 Apr 2026 15:02:56 +0000</pubDate>
      <link>https://dev.to/ortizdavid/gerenciamento-de-cron-jobs-em-golang-2i13</link>
      <guid>https://dev.to/ortizdavid/gerenciamento-de-cron-jobs-em-golang-2i13</guid>
      <description>&lt;p&gt;Dando continuidade à nossa série sobre tarefas em segundo plano, hoje vamos focar em algo que todo o sistema robusto precisa: Cron Jobs.&lt;/p&gt;

&lt;p&gt;Muitas vezes, precisamos executar uma tarefa em intervalos específicos: a cada 30 minutos, 15 segundos, ou a cada 2 horas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recapitulando: Worker vs Cron Job
&lt;/h2&gt;

&lt;p&gt;Embora ambos rodem em background:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worker: Foca no processamento contínuo (ex: consumir uma fila até que ela fique vazia).&lt;/li&gt;
&lt;li&gt;Cron Job: Foca na recorrência agendada (ex: gerar um relatório de 15 em 15 minutos).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemplos comuns de Cron Jobs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Limpeza de arquivos temporários: Evitar que o disco fique cheio com logs antigos.&lt;/li&gt;
&lt;li&gt;Relatórios de Negócio: Consolidar vendas do dia anterior.&lt;/li&gt;
&lt;li&gt;Sincronização de Dados: Atualizar taxas de câmbio ou stocks de APIs externas.&lt;/li&gt;
&lt;li&gt;Backup de Segurança: Realizar dumps periódicos de tabelas críticas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O problema da falta de orquestração
&lt;/h2&gt;

&lt;p&gt;Quando começamos a criar vários jobs espalhados pelo código, o problema aparece rápido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visibilidade: Quais tarefas estão ativas agora?&lt;/li&gt;
&lt;li&gt;Resiliência: Se uma tarefa entrar em "panic", ela vai derrubar toda a minha API?&lt;/li&gt;
&lt;li&gt;Encerramento Limpo: Se eu desligar o servidor, as tarefas param no meio do caminho corrompendo dados?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A solução é simples: um Cron Job Manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passos para criação do Cron Job Manager
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Definir uma Interface: Padronizar as operações necessárias, com nome, um tempo de agendamento e o método de execução.&lt;/li&gt;
&lt;li&gt;Implementar o Engine com Tickers: Usar &lt;code&gt;time.NewTicker&lt;/code&gt; para intervalos regulares.&lt;/li&gt;
&lt;li&gt;Isolamento de Erros (Recover): Capturar e logar erros sem interromper o Manager.&lt;/li&gt;
&lt;li&gt;Contexto de Cancelamento: Propagar o &lt;code&gt;context.Context&lt;/code&gt; para que todas as Goroutines respeitem o sinal de paragem do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vantagens desta Arquitetura
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Graceful Shutdown: recebe o sinal de cancelamento do Sistema Operativo e avisa os jobs para terminarem as suas operações de forma segura.&lt;/li&gt;
&lt;li&gt;Desacoplamento: O motor do Cron não conhece a regra de negócio; ele apenas executa "contratos".&lt;/li&gt;
&lt;li&gt;Observabilidade: Centralização de logs, permitindo rastrear o início e o fim de cada operação.&lt;/li&gt;
&lt;li&gt;Plug and Play: Adicionar um novo job é simples. Basta registarmos no Manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Código fonte: &lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/cronjob-manager" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/cronjob-manager&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%2Fsb8vpg67hx4nz1hi1ps1.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%2Fsb8vpg67hx4nz1hi1ps1.png" alt=" " width="800" height="414"&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%2Firhqf5xexesrezrqgaji.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%2Firhqf5xexesrezrqgaji.png" alt=" " width="800" height="414"&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%2F55wtv2v4zixx9vlyjhgx.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%2F55wtv2v4zixx9vlyjhgx.png" alt=" " width="800" height="574"&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%2Fe0l4icmc17jgbw6frs3e.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%2Fe0l4icmc17jgbw6frs3e.png" alt=" " width="800" height="960"&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%2F25wcx335b8jig6ma31re.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%2F25wcx335b8jig6ma31re.png" alt=" " width="800" height="261"&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%2Fpv12fx4z306kwyvhedkd.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%2Fpv12fx4z306kwyvhedkd.png" alt=" " width="800" height="634"&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%2Fz40tfnlskaxd4pke437g.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%2Fz40tfnlskaxd4pke437g.png" alt=" " width="800" height="707"&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%2Fwgzyzx3mmjl7so6vbem2.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%2Fwgzyzx3mmjl7so6vbem2.png" alt=" " width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>software</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>Gerenciamento de Workers numa aplicação Golang</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 06 Apr 2026 14:02:04 +0000</pubDate>
      <link>https://dev.to/ortizdavid/gerenciamento-de-workers-numa-aplicacao-golang-88p</link>
      <guid>https://dev.to/ortizdavid/gerenciamento-de-workers-numa-aplicacao-golang-88p</guid>
      <description>&lt;p&gt;Atualmente é indispensável que um sistema que cresce esteja preparado para processar tarefas em background.&lt;br&gt;
Essas tarefas não devem interromper o fluxo normal da aplicação.&lt;br&gt;
O melhor é estruturar como esses workers vão se comportar e permitir a configuração dos mesmos.&lt;/p&gt;

&lt;p&gt;Felizmente, Golang nos dá a vantagem de criar estruturas que facilitam esse tipo de aplicações.&lt;br&gt;
Usando Goroutines, channels e contextos de cancelamento, conseguimos criar essa estrutura.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cron jobs VS Workers
&lt;/h1&gt;

&lt;p&gt;Facilmente confundimos Cron Jobs com Workers. Eles partem do mesmo princípio de executar tarefas em segundo plano.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worker: processa tarefas num ciclo infinito, usando a frequência e número de tentativas.&lt;/li&gt;
&lt;li&gt;Cron Job: trabalha com agendamento, a tarefa é somente executada no tempo definido.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Exemplos mais comuns de Workers
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Processamento de uma regra de negócio&lt;/li&gt;
&lt;li&gt;Envio de dados para uma fila&lt;/li&gt;
&lt;li&gt;Consumo e processamento de filas&lt;/li&gt;
&lt;li&gt;Envio de e-mails recorrentes&lt;/li&gt;
&lt;li&gt;Campanha de mensagens em massa&lt;/li&gt;
&lt;li&gt;Envios de SMS&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  O problema de muitos workers
&lt;/h1&gt;

&lt;p&gt;Quando a aplicação cresce, podemos ter várias tarefas por processar na aplicação.&lt;br&gt;
Encadear cada tarefa torna o código difícil de ler e manter. Nesse caso, devemos achar uma estratégia para organizar e manter esse número de workers.&lt;br&gt;
A forma mais elegante é o worker manager, organizador e orquestrador de workers, responsável pelo registro, chamada e ciclo de vida dos mesmos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Passos para criação do Worker Manager
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Definir uma interface para a base dos workers: Start, Stop e Worker Name&lt;/li&gt;
&lt;li&gt;Criar o manager que agrupa os workers&lt;/li&gt;
&lt;li&gt;Criar um mecanismo para iniciar e parar todos os workers&lt;/li&gt;
&lt;li&gt;Se necessário, uma função para mostrar as infos dos workers registrados no sistema&lt;/li&gt;
&lt;li&gt;Configurar o máximo de tentativas e o intervalo de tempo que os workers vão executar a operação&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Vantagens
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Graceful shutdown: o manager avisa a todos os workers quando parar. Eles não perdem dados, escutam o sinal de cancel e vão parando.&lt;/li&gt;
&lt;li&gt;Estratégias de backoff&lt;/li&gt;
&lt;li&gt;Modularidade&lt;/li&gt;
&lt;li&gt;Código fácil de manter e evoluir&lt;/li&gt;
&lt;li&gt;Arquitetura plug and play&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No futuro veremos como implementar um cron job manager.&lt;/p&gt;

&lt;p&gt;Código fonte: &lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/worker-manager" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/worker-manager&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%2Fbkdkdq1gxuocgxkwzze8.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%2Fbkdkdq1gxuocgxkwzze8.png" alt=" " width="800" height="478"&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%2Fmemm1pj1bebscnv3dg6w.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%2Fmemm1pj1bebscnv3dg6w.png" alt=" " width="800" height="233"&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%2Foqqf4k4y6wbrfg2noy8s.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%2Foqqf4k4y6wbrfg2noy8s.png" alt=" " width="800" height="562"&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%2F2a2moievqbb0usszjbhh.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%2F2a2moievqbb0usszjbhh.png" alt=" " width="800" height="1081"&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%2Fqyipam4g128pwyw9s4pf.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%2Fqyipam4g128pwyw9s4pf.png" alt=" " width="800" height="237"&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%2Fu10yitgsmyu9ji9ltpnz.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%2Fu10yitgsmyu9ji9ltpnz.png" alt=" " width="800" height="719"&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%2F8e44o3j17rsdb3nxbiyl.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%2F8e44o3j17rsdb3nxbiyl.png" alt=" " width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Por que o seu Microserviço deve permitir Integração via JSON-RPC?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 17 Mar 2026 17:48:02 +0000</pubDate>
      <link>https://dev.to/ortizdavid/por-que-o-seu-microservico-deve-permitir-integracao-via-json-rpc-bfe</link>
      <guid>https://dev.to/ortizdavid/por-que-o-seu-microservico-deve-permitir-integracao-via-json-rpc-bfe</guid>
      <description>&lt;p&gt;Embora o REST seja o padrão absoluto para o Frontend, a comunicação entre serviços (Service-to-Service) pede algo mais direto e menos verboso.&lt;/p&gt;

&lt;p&gt;O gRPC é frequentemente citado como a solução de elite, mas traz uma complexidade de infraestrutura (&lt;code&gt;.proto&lt;/code&gt;, geração de código, HTTP/2) que muitos projetos não precisam no dia zero.&lt;br&gt;
O JSON-RPC surge como o "pote de mel": simples como JSON, mas eficiente e intuitivo como uma chamada de função local.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde cada um brilha?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;REST: Perfeito para recursos públicos. Focado em substantivos (&lt;code&gt;/users&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;gRPC: Ultra-performance e streaming. Focado em contratos rígidos (Binário).&lt;/li&gt;
&lt;li&gt;JSON-RPC: O melhor para comunicação interna ágil. Focado em ações (&lt;code&gt;User.Create&lt;/code&gt;). É nativo em Go e não exige ferramentas externas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementação Enterprise: O que não pode faltar
&lt;/h2&gt;

&lt;p&gt;Para um sistema robusto, não basta apenas "rodar" o RPC. É preciso controle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capabilities: O serviço deve ser capaz de se "auto-apresentar", listando métodos disponíveis via reflexão no arranque.&lt;/li&gt;
&lt;li&gt;Rastreabilidade: Cada chamada deve carregar um &lt;code&gt;Trace-ID&lt;/code&gt; no Contexto para que saibas exatamente quem iniciou a cadeia de ações.&lt;/li&gt;
&lt;li&gt;Segurança (Internal Key): Autenticação rápida via Headers (&lt;code&gt;X-Internal-Key&lt;/code&gt;) para garantir que apenas serviços autorizados acedam ao motor RPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O Desafio da Memória em Go
&lt;/h2&gt;

&lt;p&gt;Um detalhe crítico ao implementar RPC em Go com transações de base de dados: Cuidado com a estabilidade dos ponteiros.&lt;/p&gt;

&lt;p&gt;Ao usar closures (funções anónimas) dentro de transações, evita declarar ponteiros nulos para o retorno. Se tentares preenchê-los apenas dentro da transação, podes enfrentar problemas de visibilidade de memória (Race Conditions) que resultam em &lt;code&gt;nil pointer dereference&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Boa Prática: Inicializa sempre a tua struct de resposta (&lt;code&gt;new(Struct)&lt;/code&gt; ou &lt;code&gt;&amp;amp;Struct{}&lt;/code&gt;) antes de entrar na transação. aIsso garante um endereço de memória estável e evita que o teu Dispatcher RPC sofra um Panic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configurações e Limites
&lt;/h2&gt;

&lt;p&gt;Um motor RPC robusto precisa de fronteiras claras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timeouts: Controle rígido para que uma chamada não "prenda" o serviço infinitamente.&lt;/li&gt;
&lt;li&gt;Payload Limit: Evita que requisições gigantes saturem a memória do servidor.&lt;/li&gt;
&lt;li&gt;Observabilidade: Logs automáticos de cada método invocado, incluindo a latência e o status da resposta.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Adotar JSON-RPC na arquitetura interna reduz o overhead de roteamento, facilita o debug (é legível, ao contrário do gRPC) e mantém o código limpo.&lt;br&gt;
É a escolha de quem prefere resolver problemas de negócio a lutar contra a infraestrutura.&lt;/p&gt;

&lt;p&gt;O JSON-RPC dá ao teu sistema a fluidez de uma chamada de função com a robustez de um microserviço.&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%2Fow9ay8x6m9qe4llrdsdx.jpg" 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%2Fow9ay8x6m9qe4llrdsdx.jpg" alt=" " width="782" height="662"&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%2Fkzno4c6396q1v6bb4pn0.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%2Fkzno4c6396q1v6bb4pn0.png" alt=" " width="800" height="393"&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%2F166bmt6x8rqtqf0zxooc.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%2F166bmt6x8rqtqf0zxooc.png" alt=" " width="800" height="429"&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%2Ftqg64csmz6rvf1istbm2.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%2Ftqg64csmz6rvf1istbm2.png" alt=" " width="800" height="718"&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%2F5jvbixwaomkn95tmyv9r.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%2F5jvbixwaomkn95tmyv9r.png" alt=" " width="800" height="1056"&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%2Fwvmoty842edkwe7m7vug.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%2Fwvmoty842edkwe7m7vug.png" alt=" " width="800" height="911"&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%2Fzw1lw6fo7ajgvnon540v.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%2Fzw1lw6fo7ajgvnon540v.png" alt=" " width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>go</category>
      <category>architecture</category>
      <category>jsonrpc</category>
    </item>
    <item>
      <title>Minha experiência com gRPC e Golang: Construindo um Motor de Assinatura Digital</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 04 Mar 2026 10:25:37 +0000</pubDate>
      <link>https://dev.to/ortizdavid/minha-experiencia-com-grpc-e-golang-construindo-um-motor-de-assinatura-digital-4511</link>
      <guid>https://dev.to/ortizdavid/minha-experiencia-com-grpc-e-golang-construindo-um-motor-de-assinatura-digital-4511</guid>
      <description>&lt;p&gt;Nas últimas duas semanas, aceitei um desafio técnico intenso: desenvolver um microserviço de assinatura digital utilizando Go e gRPC.&lt;br&gt;
Foi um projeto que me tirou da zona de conforto (resolver problemas de negócio puros) e me mergulhou profundamente em engenharia de infraestrutura e criptografia.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Desafio Técnico
&lt;/h2&gt;

&lt;p&gt;O objetivo era criar um motor de processamento capaz de receber documentos financeiros em XML, realizar o parse, garantir a integridade via algoritmos de assinatura digital e retornar o documento assinado de forma única.&lt;br&gt;
Tudo isso com foco em alta performance e disponibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack de Engenharia
&lt;/h2&gt;

&lt;p&gt;Para suportar essa complexidade, utilizei uma stack robusta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go &amp;amp; gRPC: Escolhidos pela necessidade de baixa latência e comunicação eficiente machine-to-machine (evitando o overhead do JSON/REST).&lt;/li&gt;
&lt;li&gt;HashiCorp Vault: Gestão segura de segredos e chaves privadas (Secret Manager).&lt;/li&gt;
&lt;li&gt;MinIO: Armazenamento de objetos para os arquivos de certificados (.pfx).&lt;/li&gt;
&lt;li&gt;MySQL &amp;amp; Redis: Persistência de metadados e camada de cache para otimização de consultas.&lt;/li&gt;
&lt;li&gt;Criptografia X.509: Lógica para extração de metadados e validação de cadeias de confiança.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Destaques de Implementação
&lt;/h2&gt;

&lt;p&gt;A arquitetura foi pensada para garantir a idempotência e a segurança em repouso, pilares fundamentais em sistemas que lidam com documentos financeiros sensíveis.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Segurança Multitenant: O sistema permite que cada consumidor gerencie seu próprio certificado, isolado e protegido por criptografia através do Vault.&lt;/li&gt;
&lt;li&gt;Performance: Sem interface gráfica e focado em processamento pesado, o gRPC garantiu que múltiplos sistemas pudessem consumir o serviço simultaneamente com estabilidade.&lt;/li&gt;
&lt;li&gt;Cultura de Testes: Para validar a resiliência, desenvolvi scripts de automação em Bash e utilizei o grpcurl para testes de stress, simulando múltiplos clientes em simultâneo.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  O Aprendizado
&lt;/h2&gt;

&lt;p&gt;A grande conclusão prática é que o gRPC é a escolha de excelência para integração entre sistemas onde estabilidade e processamento pesado são inegociáveis. Trabalhar com criptografia e certificados digitais é uma área complexa, mas extremamente gratificante quando vemos os resultados de performance validados na prática.&lt;/p&gt;

&lt;p&gt;Mais um conhecimento adquirido e pronto para ser aplicado em soluções de escala global! &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%2F6rxnbdk66fwnubgsdorw.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%2F6rxnbdk66fwnubgsdorw.png" alt=" " width="800" height="269"&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%2Fi6gblzp16dhiyv2w9k30.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%2Fi6gblzp16dhiyv2w9k30.png" alt=" " width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>microservices</category>
      <category>backend</category>
      <category>grpc</category>
    </item>
    <item>
      <title>Como implementar Injeção de Dependências em Go manualmente?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 23 Feb 2026 17:13:19 +0000</pubDate>
      <link>https://dev.to/ortizdavid/como-implementar-injecao-de-dependencias-em-go-manualmente-4i5p</link>
      <guid>https://dev.to/ortizdavid/como-implementar-injecao-de-dependencias-em-go-manualmente-4i5p</guid>
      <description>&lt;p&gt;A linguagem Go permite controlar manualmente as dependências com mais facilidade.&lt;br&gt;
Cada item da sua aplicação pode ser instanciado onde o desenvolvedor desejar. Go nos dá essa liberdade.&lt;/p&gt;

&lt;p&gt;Mas, com o crescimento do projeto, é importante arranjar uma estratégia para carregar as dependências, porque elas podem afetar positiva ou negativamente a aplicação.&lt;br&gt;
Essa liberdade do Go pode dar margem para vários erros de dependências. Para projetos pequenos, faz sentido, mas para grandes projectos pode ser difícil de manter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cenário comum: main inflado
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instanciar DB, cache, configs no main&lt;/li&gt;
&lt;li&gt;Instanciar repos, services&lt;/li&gt;
&lt;li&gt;Criação e inicialização dos componentes
Isso Faz sentido para projetos com poucos componentes, não reprsenta grandes riscos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solução: injeção via containers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Criar container de infraestrutura: DB, Cache, Logger, Mensageria e outros.&lt;/li&gt;
&lt;li&gt;Container de serviços: regras de negócio&lt;/li&gt;
&lt;li&gt;Container de repositórios: interação com a base de dados
No Main, só precisamos carregar os containers. o Main se torna o maestro da aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vantagens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Criação dos objetos 1 vez apenas&lt;/li&gt;
&lt;li&gt;Organização dos componentes&lt;/li&gt;
&lt;li&gt;Separação de responsabilidades&lt;/li&gt;
&lt;li&gt;Performance melhorada&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que fazer isso manualmente?
&lt;/h2&gt;

&lt;p&gt;Embora existam bibliotecas como Google Wire ou Uber FX, fazer a gestão manual com containers traz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance: Sem uso de reflection em tempo de execução.&lt;/li&gt;
&lt;li&gt;Transparência: Você vê exatamente o que está sendo injetado e onde.&lt;/li&gt;
&lt;li&gt;Singleton por Design: Objetos pesados (como pools de DB) são criados apenas uma vez.&lt;/li&gt;
&lt;li&gt;Testabilidade: É fácil substituir um repositório real por um mock nos seus testes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código-fonte
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/golang-pocs" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/dependency-injection" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/dependency-injection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como tens organizado as dependências nos teus projetos? Abordagem manual ou usas bibliotecas?&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%2Fnxxgzdfbizfizm8sz454.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%2Fnxxgzdfbizfizm8sz454.png" alt=" " width="800" height="800"&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%2F7g7jrahce22x7866yrq7.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%2F7g7jrahce22x7866yrq7.png" alt=" " width="800" height="972"&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%2Fosz8skylmuhkzq6hpbew.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%2Fosz8skylmuhkzq6hpbew.png" alt=" " width="800" height="590"&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%2Fbyfn2llzeli26izvk6p0.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%2Fbyfn2llzeli26izvk6p0.png" alt=" " width="800" height="715"&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%2F6d4eptvnqszl4ppaer6j.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%2F6d4eptvnqszl4ppaer6j.png" alt=" " width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>cleancode</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Entrypoint API: Por que o seu /health não é suficiente?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Thu, 19 Feb 2026 11:03:05 +0000</pubDate>
      <link>https://dev.to/ortizdavid/entrypoint-api-por-que-o-seu-health-nao-e-suficiente-5ec</link>
      <guid>https://dev.to/ortizdavid/entrypoint-api-por-que-o-seu-health-nao-e-suficiente-5ec</guid>
      <description>&lt;p&gt;A maioria das APIs limita-se a retornar um simples &lt;strong&gt;status&lt;/strong&gt; para verificar se funciona ou não, mostrando apenas o estado da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambientes sérios
&lt;/h2&gt;

&lt;p&gt;Em ambientes de produção, não basta saber se a aplicação está ativa.&lt;br&gt;
É necessário saber se os recursos essenciais da API estão disponíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base de dados&lt;/li&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Serviços externos críticos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se um desses componentes estiver indisponível ou em modo degradado, o consumidor precisa saber antes de executar operações mais pesadas.&lt;/p&gt;

&lt;p&gt;Outro ponto importante é disponibilizar um pequeno mapa da API para situar o consumidor (integrador e frontend), expondo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nome do serviço&lt;/li&gt;
&lt;li&gt;Estado atual&lt;/li&gt;
&lt;li&gt;Principais endpoints&lt;/li&gt;
&lt;li&gt;Links úteis (health, info, documentação)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que essa preocupação?
&lt;/h2&gt;

&lt;p&gt;Esses itens são importantes para evitar overhead no consumo da API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evita requisições desnecessárias&lt;/li&gt;
&lt;li&gt;Reduz falhas previsíveis&lt;/li&gt;
&lt;li&gt;Previne erros em cascata&lt;/li&gt;
&lt;li&gt;Permite que o frontend aplique estratégias de contingência&lt;/li&gt;
&lt;li&gt;Melhora a experiência de integração&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O frontend pode, por exemplo, verificar o estado do storage antes de iniciar um upload grande.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como resolver?
&lt;/h2&gt;

&lt;p&gt;A API pode disponibilizar no entrypoint principal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um mapa simples do serviço&lt;/li&gt;
&lt;li&gt;Estado detalhado dos recursos críticos&lt;/li&gt;
&lt;li&gt;Links principais da aplicação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também pode expor informações não críticas sobre o ambiente, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limites de upload&lt;/li&gt;
&lt;li&gt;Versão da API&lt;/li&gt;
&lt;li&gt;Configurações relevantes&lt;/li&gt;
&lt;li&gt;Capacidades habilitadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso permite que o consumidor saiba como interagir com o serviço antes de iniciar operações.&lt;/p&gt;

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

&lt;p&gt;Isso eleva a API de um simples backend para uma solução mais robusta e consciente da experiência do consumidor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduz requisições desnecessárias&lt;/li&gt;
&lt;li&gt;Diminui erros evitáveis&lt;/li&gt;
&lt;li&gt;Aumenta a previsibilidade&lt;/li&gt;
&lt;li&gt;Melhora a qualidade do serviço&lt;/li&gt;
&lt;/ul&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%2Fx8m1zne9vfhyst1doavd.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%2Fx8m1zne9vfhyst1doavd.png" alt=" " width="800" height="447"&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%2Fw5qmcs5x8yjb3urr5wbo.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%2Fw5qmcs5x8yjb3urr5wbo.png" alt=" " width="800" height="415"&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%2Fa7uti2td07ub041j82ge.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%2Fa7uti2td07ub041j82ge.png" alt=" " width="800" height="492"&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%2Fp3n0pl0szkxlchd9hzzk.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%2Fp3n0pl0szkxlchd9hzzk.png" alt=" " width="800" height="1068"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rest</category>
      <category>api</category>
      <category>go</category>
      <category>devex</category>
    </item>
    <item>
      <title>Template Python MongoDB API: Arquitetura (Ferramentas)</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 14 Jan 2026 10:37:37 +0000</pubDate>
      <link>https://dev.to/ortizdavid/template-python-mongodb-api-arquitetura-ferramentas-47d</link>
      <guid>https://dev.to/ortizdavid/template-python-mongodb-api-arquitetura-ferramentas-47d</guid>
      <description>&lt;p&gt;Um backend de alto nível exige peças que garantam performance e escalabilidade. Para este template, selecionei uma stack focada em prontidão para produção.&lt;/p&gt;

&lt;h1&gt;
  
  
  🛠️ O Ecossistema
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linguagem:&lt;/strong&gt; Python 3.11+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; FastAPI (Async)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Banco de Dados:&lt;/strong&gt; MongoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache &amp;amp; Segurança:&lt;/strong&gt; Redis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; MinIO, Filesystem e Google Storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidade:&lt;/strong&gt; Prometheus, Grafana e Jaeger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infra:&lt;/strong&gt; Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🎯 O porquê de cada escolha:
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ⚡ FastAPI
&lt;/h2&gt;

&lt;p&gt;Por que: Alta performance com &lt;code&gt;asyncio&lt;/code&gt; e documentação automática (Swagger). Agiliza o desenvolvimento com validação rigorosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍃 MongoDB
&lt;/h2&gt;

&lt;p&gt;Por que: Flexibilidade de schema com JSON. Permite evoluir o banco de dados sem a burocracia de migrações complexas.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Redis
&lt;/h2&gt;

&lt;p&gt;Por que: Baixíssima latência. Ideal para cache de sessões e Blacklist de tokens JWT e Rate Limiting, protegendo o banco principal de sobrecarga.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 MinIO &amp;amp; Multi-storage
&lt;/h2&gt;

&lt;p&gt;Por que: Compatibilidade com Amazon S3. Desacopla arquivos do banco de dados e permite migrar para qualquer nuvem facilmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Prometheus &amp;amp; Grafana
&lt;/h2&gt;

&lt;p&gt;Por que: Visibilidade total. Monitora a saúde da API, latência e recursos em tempo real.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐳 Docker
&lt;/h2&gt;

&lt;p&gt;Por que: Portabilidade absoluta. Garante que o sistema rode idêntico em qualquer ambiente (Cloud-native).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt; Uma base sólida para sair do zero direto para o nível corporativo.&lt;/p&gt;

&lt;p&gt;O que achou dessa stack? No próximo post, vou detalhar a organização das Camadas para garantir manutenção e escala.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código fonte:&lt;/strong&gt; &lt;a href="https://github.com/ortiz-python-templates/python-mongodb-api" rel="noopener noreferrer"&gt;https://github.com/ortiz-python-templates/python-mongodb-api&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%2F1h7qp3720eatdh6w3zq8.jpg" 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%2F1h7qp3720eatdh6w3zq8.jpg" alt=" " width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>mongodb</category>
      <category>docker</category>
    </item>
    <item>
      <title>Identidade e Segurança — Autenticação (Python Template Mongo API)</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 14 Jan 2026 10:33:42 +0000</pubDate>
      <link>https://dev.to/ortizdavid/identidade-e-seguranca-autenticacao-python-template-mongo-api-105l</link>
      <guid>https://dev.to/ortizdavid/identidade-e-seguranca-autenticacao-python-template-mongo-api-105l</guid>
      <description>&lt;p&gt;Para sistemas modernos, autenticação não é apenas "validar usuário e senha". É sobre garantir persistência segura, performance e rastreabilidade.&lt;br&gt;
Neste exemplo, implementamos um fluxo completo utilizando FastAPI, MongoDB, JWT, Redis e Middleware.&lt;/p&gt;

&lt;h1&gt;
  
  
  Componentes chaves da solução
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dual Token Strategy (Access e Refresh)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Access Token: Curta duração, enviado via Header ou Cookie para autorizar requisições.&lt;/li&gt;
&lt;li&gt;Refresh Token: Longa duração, armazenado via HttpOnly para gerar novos access tokens com segurança.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware de Autenticação:&lt;/strong&gt; Camada que intercepta as requisições e valida os tokens, liberando automaticamente as rotas públicas (/login, /docs, /health).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Blacklist (Redis):&lt;/strong&gt; Gerenciamento de estado para tokens revogados durante o logout, impedindo ataques de replay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Login Activity Tracking:&lt;/strong&gt; Captura rica de dados do ambiente (Dispositivo, Navegador, SO, IP) usando device-detector para auditoria e segurança.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Fluxo de Login (Passo a Passo)
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Requisição de Login:&lt;/strong&gt; O cliente envia email e password. O AuthService valida as credenciais no MongoDB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração e Persistência:&lt;/strong&gt; O JwtService gera os tokens. Eles são injetados na resposta como Cookies HttpOnly, uma barreira crucial contra ataques XSS.
3.&lt;strong&gt;Registro de Atividade:&lt;/strong&gt; O LoginActivityService analisa o 'User-Agent' e salva o snapshot do acesso (dispositivo e localização).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware em Ação:&lt;/strong&gt; Em cada rota protegida, o Middleware extrai o token, verifica se não está na Blacklist do Redis, valida o usuário e o anexa ao request.state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ciclo de Refresh:&lt;/strong&gt; Quando o Access Token expira, o endpoint /refresh-access-token valida o Refresh Token e emite um novo par, mantendo a UX sem interrupções.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Este fluxo foi pensado para ambientes reais de produção, indo muito além do básico de tutoriais.&lt;br&gt;
A combinação de Stateless JWT com Stateful Blacklist (Redis) oferece o melhor dos dois mundos: escalabilidade e controle.&lt;br&gt;
Na próxima parte, falaremos sobre autorização baseada em Roles &amp;amp; Permissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código Fonte:&lt;/strong&gt; &lt;a href="https://github.com/ortiz-python-templates/python-mongodb-api" rel="noopener noreferrer"&gt;https://github.com/ortiz-python-templates/python-mongodb-api&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%2F1e5x2cttvo397l96q830.jpg" 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%2F1e5x2cttvo397l96q830.jpg" alt=" " width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>redis</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
