<?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: Sam</title>
    <description>The latest articles on DEV Community by Sam (@samsantosb).</description>
    <link>https://dev.to/samsantosb</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%2F1073001%2F375cd36f-421a-477c-a8c2-eef450c302d2.jpg</url>
      <title>DEV Community: Sam</title>
      <link>https://dev.to/samsantosb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samsantosb"/>
    <language>en</language>
    <item>
      <title>How I made BeeThreads and what doest it solve</title>
      <dc:creator>Sam</dc:creator>
      <pubDate>Fri, 05 Dec 2025 18:35:32 +0000</pubDate>
      <link>https://dev.to/samsantosb/how-i-made-beethreads-and-what-doest-it-solve-2fk0</link>
      <guid>https://dev.to/samsantosb/how-i-made-beethreads-and-what-doest-it-solve-2fk0</guid>
      <description>&lt;h1&gt;
  
  
  How I built BeeThreads in 2 days (and now it has 3k+ downloads)
&lt;/h1&gt;

&lt;p&gt;A week ago I was complaining (again) about the same old thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Man, I just want to write normal sync code and in the background with a very simple a manageble DX.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We’ve all been there. One heavy crypto operation, one giant JSON parse, one dumb recursive Fibonacci… and boom — the event loop is dead. Everyone hates it.&lt;/p&gt;

&lt;p&gt;So two days ago I decided to test Claude Opus 4.5 and try to make this real.&lt;/p&gt;

&lt;p&gt;I was expecting a half-broken prototype.&lt;/p&gt;

&lt;p&gt;Four hours later we had something that actually worked.  &lt;/p&gt;

&lt;p&gt;And somehow, in less than two days, it’s already at &lt;strong&gt;3k+ downloads&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The dream vs reality
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before (native worker_threads)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~50+ lines of pain&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Worker&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker_threads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;exit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// plus pooling, timeouts, retries, queue limits… you get it&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Would become this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// bee-threads: 1 line&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I didn’t want to stop at “it works”. I wanted rock-solid worker management and an absolutely killer developer experience (DX). &lt;/p&gt;

&lt;p&gt;Here’s exactly how I made it happen:&lt;/p&gt;

&lt;p&gt;I turned the event-driven nature of worker_threads into real Promises on the main thread — so threading feels exactly like writing normal async/await code. &lt;/p&gt;

&lt;p&gt;Errors work the same way too: they’re proper Error instances with all custom properties, .cause, stack traces — everything preserved perfectly across thread boundaries.&lt;/p&gt;

&lt;p&gt;The biggest challenge (and the magic) is running completely dynamic code inside workers without ever forcing you to create a separate worker file. We do this safely with vm.Script (never eval), and we aggressively cache the compiled functions using an LRU cache. &lt;/p&gt;

&lt;p&gt;That means no AST parsing or recompilation on repeated calls — we go from ~0.4 ms (first run) down to ~1–3 µs on cache hits.&lt;/p&gt;

&lt;p&gt;There are tons of production-ready features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retry with exponential backoff&lt;/li&gt;
&lt;li&gt;AbortSignal cancellation&lt;/li&gt;
&lt;li&gt;Timeout support&lt;/li&gt;
&lt;li&gt;Streaming generators (for await)&lt;/li&gt;
&lt;li&gt;Transferable Buffers (coming in next release)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And also ridiculous amount of V8-level optimizations: monomorphic object shapes (no hidden class junk), raw for loops in hot paths, O(1) counters instead of array scans, shared base vm.Context — all the scary stuff… but you never see it. The API stays clean and buttery smooth.&lt;/p&gt;

&lt;p&gt;Under the hood, BeeThreads is smart about picking the best worker for each task. It uses function affinity: if a worker has already executed your function, it gets priority. That keeps the code “hot” in V8’s TurboFan JIT, giving you near-native performance after just a few calls.&lt;/p&gt;

&lt;p&gt;Here’s some examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;bee&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bee-threads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Run any function in a separate thread - promise like&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 42&lt;/span&gt;

&lt;span class="c1"&gt;//Non Blocking I/O in any CPU-Itensive operation.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
  &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pbkdf2Sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;salt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha512&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Run with Promise.all&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nf"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also write code using method chaining if a very complete API called BeeThreads&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;beeThreads&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bee-threads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;beeThreads&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;usingParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// → 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;if you would like to have a try&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i bee-threads&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/samsantosb/BeeThreads" rel="noopener noreferrer"&gt;https://github.com/samsantosb/BeeThreads&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/bee-threads" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bee-threads&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>node</category>
      <category>performance</category>
    </item>
    <item>
      <title>Como RUSHAR um serviço assíncrono de envio de dados</title>
      <dc:creator>Sam</dc:creator>
      <pubDate>Fri, 02 Feb 2024 01:05:28 +0000</pubDate>
      <link>https://dev.to/samsantosb/como-rushar-um-sistema-assincrono-de-envio-de-dados-4l6f</link>
      <guid>https://dev.to/samsantosb/como-rushar-um-sistema-assincrono-de-envio-de-dados-4l6f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Olá amigos,&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recentemente tive que fazer um projeto para ontem..&lt;/p&gt;

&lt;p&gt;Uma dos pontos chave era: &lt;strong&gt;Tornar o cadastro de um produto, um cadastro de múltiplos&lt;/strong&gt;. A feature original se encontrava em um contexto de difícil manutenção (põe diíficil nisso)&lt;/p&gt;

&lt;p&gt;O desenvolvimento deveria ser extremamente rápido.&lt;/p&gt;

&lt;p&gt;Eis que com um breve refinamento veio a ideia:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Clássica tática de &lt;strong&gt;Serverless Async&lt;/strong&gt; - S3 + SQS + Lambda&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se liga nessa gambi braba...&lt;br&gt;
Ao qual criamos um serviço que faz multi-requests pro nosso endpoint original.&lt;/p&gt;

&lt;p&gt;Dessa forma não foi necessário alterar diretamente o domínio da aplicação e criar um novo caso de uso. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A estrutura:&lt;/strong&gt;&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%2F8zhwlbp0e9awiuigmklw.jpg" 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%2F8zhwlbp0e9awiuigmklw.jpg" alt="Image description" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1)&lt;/strong&gt; Um big array de registros enviado para o endpoint do monolito&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2)&lt;/strong&gt; Monolito salva um JSON no S3, pega o link e envia para um SQS. Ele também envia uma mensagem amigável pro front.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Porque S3 + SQS?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Porque literalmente já vem com a infra pronta, que facilita muito para ganho de tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mas porque o S3?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O SQS tem um limite no tamanho das mensagens, então uma prática(gambiarra) comum é armazenar dados no S3 e enviar os links de acesso desses dados para a fila.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3)&lt;/strong&gt; Uma lambda recebe um trigger quando a URL do S3 chega no SQS e consome as mensagens da fila.&lt;/p&gt;

&lt;p&gt;Há um pequeno desafio aqui, Lambdas escalam horizontalmente por chamadas... Então..&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Como evitar que outra instancia da lambda consuma a mesma mensagem?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fazer um setup de visibilidade na AWS e apagar/transferir mensagens lidas para outro lugar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4)&lt;/strong&gt; Lambda faz o download do JSON no S3 e faz multiplas requests pro endpoint de cadastro múltiplo&lt;/p&gt;

&lt;p&gt;Há um outro ponto interessante aqui. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fazer requests uma a uma iria tornar tudo mais trabalhoso e possivelmente daria um timeout na Lambda.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para resolver esse caso utilizamos o Promise.allSettled() para realizar as requests de maneira paralela e ter um controle melhor das falhas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As promises com Status Rejected teriam seus dados tratados em outro momento, armazenados em um bucket de logs, ao ponto de permitir enviar por e-mail uma devolutiva para o cliente do porque esses dados não foram cadastrados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo do Handler da Lambda:&lt;/strong&gt;&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%2Fde59wpe1tvevor94zmp5.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%2Fde59wpe1tvevor94zmp5.png" alt="Image description" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo do processamento com Promise.AllSettled:&lt;/strong&gt;&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%2Fmzum166bhjgp4y9f1s0w.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%2Fmzum166bhjgp4y9f1s0w.png" alt="Image description" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5)&lt;/strong&gt; Um último desafio, validar uma AWS Lambda localmente&lt;/p&gt;

&lt;p&gt;Hoje com o serverless framework &lt;a href="https://www.serverless.com/"&gt;https://www.serverless.com/&lt;/a&gt; é possível reproduzir vários recursos da AWS localmente, mas uma Lambda Trigger com SQS ainda é um desafio CHATISSIMO.&lt;/p&gt;

&lt;p&gt;Nesse caso, como Lambdas geralmente são soluções simples e isoladas a opção para validar comportamentos das sub-funções foi Unit Tests.&lt;/p&gt;

&lt;p&gt;Não costumo usar unit tests em todos os casos mas visto as limitações de reproduzir alguns padrões da AWS localmente, podem ser uma solução. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pontos interessantes/Possíveis dúvidas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Porque não usou generators?&lt;/em&gt;&lt;br&gt;
Porque o caso de uso não terá dados tão grandes assim e Lambda tem um tempo limite de execução.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Porque serverless?&lt;/em&gt;&lt;br&gt;
O Endpoint não será utilizado com alta frequência e o tempo de desenvolvimento era restrito.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- S3 com JSONS meu parceiro ????&lt;/em&gt;&lt;br&gt;
S3 é o noSQL do povo (em alguns casos)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Tem DLQ, Retry Bucket pra Logs ??&lt;/em&gt;&lt;br&gt;
Tem sim, só não entrei no merito pra tentar ser direto ao caso da solução&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- E se a Lambda gargalar ???&lt;/em&gt;&lt;br&gt;
Hoje da pra fazer Lambda com GO. Go é bala&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura !!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>aws</category>
      <category>webdev</category>
    </item>
    <item>
      <title>LookUp Table Pattern Javascript</title>
      <dc:creator>Sam</dc:creator>
      <pubDate>Thu, 27 Apr 2023 18:24:57 +0000</pubDate>
      <link>https://dev.to/samsantosb/lookup-table-pattern-javascript-2pm7</link>
      <guid>https://dev.to/samsantosb/lookup-table-pattern-javascript-2pm7</guid>
      <description>&lt;p&gt;The LookUp Table Pattern is a design pattern that can be used to map keys to corresponding values. This is particularly useful when we have a large number of keys and want to quickly retrieve the corresponding value.&lt;/p&gt;

&lt;p&gt;In the context of JavaScript, a LookUp table can be implemented using an object literal, where the keys represent the keys of the table and the corresponding values represent the values. This way, we can quickly retrieve the corresponding value for a given key.&lt;/p&gt;

&lt;p&gt;For example, imagine we have a list of fruits and need to categorize them as sweet or citrus. We can create a LookUp table that maps the fruits to their respective categories. This allows us to quickly categorize a fruit, instead of writing a large number of if/else or switch/case statements.&lt;/p&gt;

&lt;p&gt;Moreover, using a LookUp table makes our code more readable and easier to maintain. We can easily add new keys and values to the table without having to modify the function logic.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UFhZ3ASP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jyqjuq2iko6a6qlf199b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UFhZ3ASP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jyqjuq2iko6a6qlf199b.png" alt="Image description" width="800" height="858"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>designpatterns</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Javascript Indexing Pattern</title>
      <dc:creator>Sam</dc:creator>
      <pubDate>Thu, 27 Apr 2023 18:13:52 +0000</pubDate>
      <link>https://dev.to/samsantosb/javascript-indexing-pattern-2850</link>
      <guid>https://dev.to/samsantosb/javascript-indexing-pattern-2850</guid>
      <description>&lt;p&gt;I'm going to start a series of posts about Javascript with some Patterns to share knowledge.&lt;/p&gt;

&lt;p&gt;Here's the first Pattern.&lt;/p&gt;

&lt;p&gt;The Indexing Pattern is a design pattern that allows easy access to elements in a data collection using a numeric index. In JavaScript, arrays are one of the most common data structures that use the indexing pattern, but we can also use literals, Maps, Sets, Classes with Static Attributes, etc.&lt;/p&gt;

&lt;p&gt;It's common that when comparing arrays, we often increase the spatial complexity of the code...&lt;/p&gt;

&lt;p&gt;The ideal way to handle this is to use this Pattern. Viable options are Literals, Maps or Classes with Static Attributes.&lt;/p&gt;

&lt;p&gt;With this, we can reduce spatial complexity, which can scale exponentially when we chain for loops. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8ucWDrSk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vn3fzmrdzf4cu795315.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8ucWDrSk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vn3fzmrdzf4cu795315.png" alt="Image description" width="639" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>designpatterns</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
