<?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: Adriano Aguiar</title>
    <description>The latest articles on DEV Community by Adriano Aguiar (@adrianoaguiar).</description>
    <link>https://dev.to/adrianoaguiar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1294675%2F5375c49f-c43c-4298-82d0-f9423ebec38b.jpeg</url>
      <title>DEV Community: Adriano Aguiar</title>
      <link>https://dev.to/adrianoaguiar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adrianoaguiar"/>
    <language>en</language>
    <item>
      <title>Como Configurar e Integrar o MiniO com Java</title>
      <dc:creator>Adriano Aguiar</dc:creator>
      <pubDate>Tue, 02 Jul 2024 15:01:10 +0000</pubDate>
      <link>https://dev.to/adrianoaguiar/minio-com-spring-boot-32bl</link>
      <guid>https://dev.to/adrianoaguiar/minio-com-spring-boot-32bl</guid>
      <description>&lt;p&gt;O MiniO é uma solução de armazenamento compatível com S3, ideal para empresas que precisam armazenar dados internamente. Além de oferecer capacidade de armazenamento de arquivos, essa solução permite a criação de data lakes, sendo especialmente útil para profissionais que lidam com grandes volumes de dados.&lt;/p&gt;

&lt;p&gt;Neste artigo, vou demonstrar como configurar a integração com Java e realizar o envio de arquivos. Abordaremos os seguintes tópicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vantagens de Usar o MiniO;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Levantando uma Imagem MiniO;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tela de Acesso ao MiniO;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configurando um Projeto em Java com MiniO;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arquivo de Configuração;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enviando Arquivos Usando o Postman;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exemplo de Como Enviar um Arquivo para o MiniO;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exemplo de Como Remover um Arquivo do MiniO;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exemplo de Como Buscar um Arquivo pelo Nome no MiniO.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acompanhe o passo a passo detalhado para levantar uma imagem do MiniO, configurar seu projeto em Java e realizar o processo de envio de arquivos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual a vantagem de usar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O MiniO é um servidor de armazenamento de objetos open-source e compatível com o S3 da Amazon, permitindo uma migração fácil para a Amazon. Além disso, está disponível para várias plataformas.&lt;/p&gt;

&lt;p&gt;Levantando uma Imagem MiniO:&lt;/p&gt;

&lt;p&gt;Vou explicar como iniciar uma imagem do MiniO no Docker e incluir as credenciais de acesso no arquivo docker-compose.yml. Abaixo está um exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forfp052yxpx9etilq2wv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forfp052yxpx9etilq2wv.png" alt="Image description" width="800" height="1088"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;docker-compose up -d&lt;/p&gt;

&lt;p&gt;Para acessar localmente, basta informar a seguinte URL: &lt;a href="http://localhost:9000/"&gt;http://localhost:9000/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aqui está a tela de acesso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4ejh4vyc3nzsswdwfc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4ejh4vyc3nzsswdwfc6.png" alt="Image description" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configurando um projeto em java com Minio:&lt;/p&gt;

&lt;p&gt;Como estou utilizando Maven, vou mostrar como adicionar as dependências necessárias no arquivo pom.xml:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F393f76uskjywwfcxvakn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F393f76uskjywwfcxvakn.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, precisamos iniciar o MiniO. Para isso, vamos criar um arquivo de configuração da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7h67sqs38d3t09g8d2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7h67sqs38d3t09g8d2q.png" alt="Image description" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No entanto, precisamos definir as variáveis de ambiente com as informações necessárias para que o projeto consiga se conectar ao MiniO.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5yi337e1s4hbudeiyar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5yi337e1s4hbudeiyar.png" alt="Image description" width="792" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arquivo de configuração:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcerwldt3jui6o1g3mkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcerwldt3jui6o1g3mkh.png" alt="Image description" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo está um exemplo de como enviar um arquivo para o MiniO utilizando o Postman:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Abra o Postman e selecione o método POST.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Insira a URL do seu servidor MiniO&lt;br&gt;
Vá até a aba "Body" e selecione "form-data".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adicione um campo com o nome file e, no valor, selecione o arquivo que deseja enviar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clique em "Send" para enviar o arquivo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9msngix9dctfd1jpa7v5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9msngix9dctfd1jpa7v5.png" alt="Image description" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo está um exemplo de como enviar um arquivo para o MiniO utilizando Java:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3eu1zrghrzz1o3km4qpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3eu1zrghrzz1o3km4qpd.png" alt="Image description" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo está um exemplo de código em Java para remover um arquivo do MiniO:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fno08m2538wslvs4ao0lo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fno08m2538wslvs4ao0lo.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo está um exemplo de como buscar um arquivo pelo nome no MiniO utilizando Java:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwcmu3hp01l3jl7gsbmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwcmu3hp01l3jl7gsbmu.png" alt="Image description" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br&gt;
Neste artigo, exploramos como o MiniO pode ser uma solução eficiente para o armazenamento de dados, oferecendo compatibilidade com o Amazon S3 e sendo uma alternativa open-source robusta. Abordamos desde a configuração do MiniO e a integração com Java até exemplos práticos de envio e remoção de arquivos.&lt;/p&gt;

&lt;p&gt;O MiniO se destaca por sua facilidade de uso e flexibilidade, permitindo que empresas de todos os tamanhos implementem soluções de armazenamento escaláveis e seguras. Com a configuração correta e o uso das APIs, é possível integrar o MiniO a diversas aplicações, proporcionando uma experiência de armazenamento de objetos eficiente e acessível.&lt;/p&gt;

&lt;p&gt;No próximo artigo, abordaremos como utilizar o MiniO com multitenancy, permitindo que você gerencie vários inquilinos de forma isolada e segura. Fique atento para aprender mais sobre essa funcionalidade avançada e como ela pode beneficiar ainda mais sua infraestrutura de armazenamento.&lt;/p&gt;

&lt;p&gt;Repositório do Projeto:&lt;br&gt;
&lt;a href="https://github.com/adrianoaguiardez/minio-spring"&gt;https://github.com/adrianoaguiardez/minio-spring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite o MiniO&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Site Oficial do MiniO: &lt;a href="https://min.io"&gt;https://min.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Documentação&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Documentação Oficial: Documentação do MiniO&lt;br&gt;
GitHub&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repositório Oficial: &lt;a href="https://github.com/minio/minio"&gt;https://github.com/minio/minio&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Implementando o Dual Write com Mensageria PostgreSQL</title>
      <dc:creator>Adriano Aguiar</dc:creator>
      <pubDate>Thu, 14 Mar 2024 12:09:41 +0000</pubDate>
      <link>https://dev.to/adrianoaguiar/implementando-o-dual-write-com-mensageria-postgresql-271o</link>
      <guid>https://dev.to/adrianoaguiar/implementando-o-dual-write-com-mensageria-postgresql-271o</guid>
      <description>&lt;p&gt;Na era dos negócios digitais, a garantia da consistência dos dados é uma preocupação crítica. Em processos como o processamento de pedidos, onde a precisão e integridade das informações são essenciais, estratégias eficazes para gerenciar transações simultâneas são indispensáveis. Neste artigo, exploraremos como o Dual Write, combinado com a mensageria do PostgreSQL, pode ser uma solução poderosa para alcançar esse objetivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dual Write: Uma Introdução&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Dual Write é uma técnica que envolve escrever dados simultaneamente em dois sistemas ou bancos de dados. Essa abordagem é adotada para garantir a consistência e integridade dos dados, especialmente em cenários onde múltiplas transações ocorrem simultaneamente.&lt;/p&gt;

&lt;p&gt;Lidar com erros é uma parte essencial do processo de Dual Write. Se ocorrer uma falha na gravação principal, o sistema será automaticamente direcionado para um agendador de tarefas, que neste contexto específico utiliza a funcionalidade 'Scheduled' do framework Spring Boot. Este agendador tentará a cada 2 minutos, garantindo que nenhum pedido seja perdido ou processado de forma inadequada. Ao ser acionado, o agendador recupera todos os pedidos que não foram concluídos e os encaminha para o tópico 'pg_notify' com o devido payload. Assim que o payload é enviado, o sistema entra em um modo de escuta ('listen') para processar a mensagem e, consequentemente, os pedidos associados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cenário de Uso: Processamento de Pedidos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Considere um cenário em sistema de gerenciamento de pedido: a liberação de um pedido. Neste caso, precisamos atualizar o status do pedido em um banco de dados PostgreSQL e garantir que a transação seja concluída sem falhas após a confirmação do pagamento. Se ocorrer algum erro durante o processo, é crucial ter um mecanismo de recuperação confiável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pedido:&lt;/strong&gt; Essa classe representa a tabela de pedido e sempre vou salvar os dados com status Aberto para depois validar se o pedido será concluído.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1iqkby022m931077x6ry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1iqkby022m931077x6ry.png" alt="Image description" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Implementação com Mensageria do PostgreSQL&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Para implementar o Dual Write, podemos aproveitar as capacidades de mensageria do PostgreSQL. Ao escrever os dados no banco principal, também podemos aproveitar a mesma arquitetura e utilizar o banco para nos ajudar e sem precisar instalar e integrar com outras soluções como Kafka ou RabbitMQ. Isso garante que, mesmo em caso de falha na gravação principal, os dados ainda possam ser recuperados.&lt;/p&gt;

&lt;p&gt;Tarefa: Essa classe representa um agendamento feito para verificar os pedidos que estão pendentes e caso encontre será encaminhado para mensageria do Postgres com tópico list_pedido..&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wxa1hfcoahro5zgt8hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wxa1hfcoahro5zgt8hn.png" alt="Image description" width="800" height="875"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos fazer com que o Postgres processa esse evento e verifica como é situação do pedido, lembrando que vou só simular que será confirmado o pagamento e atualizar para concluído, vou aqui apresentar como fica essa funcionalidade do consumer desse evento, mas essa funcionalidade eu acabei colocando no mesmo projeto para facilitar apresentação do mesmo, porém posso criar projeto separado somente para consumir esses eventos.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzqdphk7mv41nw1qamcu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzqdphk7mv41nw1qamcu.png" alt="Image description" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Considerações:&lt;/p&gt;

&lt;p&gt;Implementar o Dual Write com mensageria PostgreSQL é uma estratégia robusta para garantir a consistência dos dados em processos críticos, como o processamento de pedidos. Ao escrever dados simultaneamente em dois sistemas, podemos minimizar o risco de falhas e garantir que as transações sejam concluídas de forma confiável. No entanto, é essencial gerenciar cuidadosamente os erros e considerar os impactos no desempenho e na escalabilidade do sistema. Com uma implementação cuidadosa e uma abordagem pragmática, o Dual Write pode se tornar uma ferramenta poderosa para maximizar a integridade dos dados em ambientes empresariais dinâmicos.&lt;/p&gt;

&lt;p&gt;Segue link repositório: &lt;a href="https://github.com/adrianoaguiardez/dual-write-mensageria-postgres"&gt;https://github.com/adrianoaguiardez/dual-write-mensageria-postgres&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>mensageria</category>
      <category>springboot</category>
      <category>postgres</category>
    </item>
  </channel>
</rss>
