<?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: Tiago Paes</title>
    <description>The latest articles on DEV Community by Tiago Paes (@tiagopaes).</description>
    <link>https://dev.to/tiagopaes</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%2F1186469%2F70747d23-5f43-4d62-9848-6b5c752764e4.png</url>
      <title>DEV Community: Tiago Paes</title>
      <link>https://dev.to/tiagopaes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tiagopaes"/>
    <language>en</language>
    <item>
      <title>API open-source para enviar mensagens no Whatsapp</title>
      <dc:creator>Tiago Paes</dc:creator>
      <pubDate>Fri, 17 May 2024 15:35:18 +0000</pubDate>
      <link>https://dev.to/tiagopaes/api-open-source-para-enviar-mensagens-no-whatsapp-2026</link>
      <guid>https://dev.to/tiagopaes/api-open-source-para-enviar-mensagens-no-whatsapp-2026</guid>
      <description>&lt;p&gt;Recentemente comecei a me interessar e estudar mais sobre automações usando o whatsapp. Uma ferramenta open-source que facilita esse processo é a evolution-api.&lt;/p&gt;

&lt;p&gt;A evolution-api é uma solução open-source (não oficial) de integração com o whatsapp que usa o whatsapp web para se conectar a conta e enviar mensagens.&lt;/p&gt;

&lt;p&gt;Pra quem quiser dar uma olhada e testar vou deixar a abaixo os links do repositório e documentação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repositório: &lt;a href="https://github.com/EvolutionAPI/evolution-api"&gt;https://github.com/EvolutionAPI/evolution-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentação: &lt;a href="https://docs.evolution-api.com"&gt;https://docs.evolution-api.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postei um vídeo curto sobre o assunto, mas pretendo gravar mais vídeos para documentar tanto o aprendizado na ferramenta quanto futuros projetos que vão sair a partir disso.&lt;/p&gt;

&lt;p&gt;Pra quem quiser acompanhar e dar uma fortalecida, esse é o link do vídeo: &lt;a href="https://www.youtube.com/shorts/pTS-vXjIIRA"&gt;https://www.youtube.com/shorts/pTS-vXjIIRA&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>whatsapp</category>
      <category>api</category>
    </item>
    <item>
      <title>Melhorando a eficiência com processamento assíncrono em filas</title>
      <dc:creator>Tiago Paes</dc:creator>
      <pubDate>Mon, 13 May 2024 16:10:24 +0000</pubDate>
      <link>https://dev.to/tiagopaes/melhorando-a-eficiencia-com-processamento-assincrono-em-filas-338l</link>
      <guid>https://dev.to/tiagopaes/melhorando-a-eficiencia-com-processamento-assincrono-em-filas-338l</guid>
      <description>&lt;p&gt;Há alguns meses assumi o desenvolvimento de um projeto e logo de cara precisei resolver um problema que estava acontecendo na geração de relatórios. Nesse post eu vou explicar um pouco mais sobre esse problema e como resolvi usando processamento assíncrono com filas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cenário problemático
&lt;/h2&gt;

&lt;p&gt;O sistema estava desenhado para quando o usuário clicar no botão de "Baixar relatório", um endpoint no backend era chamado. O endpoint buscava os dados do banco de dados, processava os dados e retornava para o frontend em formato csv, então o arquivo csv era baixado para a máquina do usuário.&lt;/p&gt;

&lt;p&gt;Esse fluxo até que funcionava bem quando o relatório tinha poucos registros, mas quando o número de registros aumentava, isso já gerava alguns problemas como timeout na requisição, e as vezes até travava a aplicação inteira pelo consumo exagerado de memória no processamento dos dados.&lt;/p&gt;

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

&lt;p&gt;A solução adotada foi mudar o fluxo de download dos relatórios, agora quando o usuário solicita um relatório, o backend vai criar um "job" para esse relatório, adiciona-lo a uma fila de processamento e retornar a requisição imediatamente para o frontend informando que o job foi criado.&lt;/p&gt;

&lt;p&gt;Agora, com esse job adicionado na fila, o sistema em um outro processo que vai consumir os jobs que chegam na fila, vai gerar o relatório e quando terminar vai notificar o usuário que o solicitou.&lt;/p&gt;

&lt;p&gt;Além de mover o processamento do relatório para ser executado em segundo plano, o processamento também foi dividido em pequenas partes (chunks), ou seja, invés de buscar 1 milhão de registros no banco de dados, trazer isso para a memória da aplicação e processar, agora a aplicação busca os registros de 100 em 100 por exemplo, processa os 100, quando termina de processar, busca mais 100 até processar o relatório todo.&lt;/p&gt;

&lt;p&gt;Dessa forma, o problema de timout foi resolvido, já que o endpoint não processa mais o relatório todo na mesma requisição. O problema de consumo de memória também foi resolvido, já que agora há um número limitado de registros que podem ser processados ao mesmo tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tecnologias
&lt;/h2&gt;

&lt;p&gt;Para esse projeto, eu utilizei as ferramentas do ecosistema &lt;a href="https://laravel.com"&gt;Laravel&lt;/a&gt;. Usei as &lt;a href="https://laravel.com/docs/11.x/queues"&gt;filas do laravel&lt;/a&gt;, integrada com o redis, e para processar e agrupar os chunks usei os &lt;a href="https://laravel.com/docs/11.x/queues#job-batching"&gt;Job batches&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Independente da tecnologia, o mais importante é entender o conceito de filas e processamento assíncrono e saber quando utilizar. Nesse caso específico a solução proposta funcionou bem e o problema foi resolvido.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>filas</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
