{"id":32444,"date":"2025-03-17T10:00:00","date_gmt":"2025-03-17T09:00:00","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=32444"},"modified":"2025-03-13T17:06:33","modified_gmt":"2025-03-13T16:06:33","slug":"gestire-le-code-senza-una-coda-scopri-fastq","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/","title":{"rendered":"Gestire le code senza una coda: Scopri fastq"},"content":{"rendered":"\n<p>Quante volte hai avuto bisogno di <strong>disaccoppiare i processi utilizzando una coda<\/strong>, solo per scoprire che non ne avevi una a disposizione a causa di vincoli di risorse o dell\u2019impossibilit\u00e0 di installare <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/soft-skill\/lo-sviluppo-del-software-e-una-attivita-collaborativa\/\">software <\/a>aggiuntivo?<\/p>\n\n\n\n<p>In questa serie, ti mostrer\u00f2 <strong>come risolvere questo problema utilizzando diverse librerie e strumenti<\/strong>, anche in assenza di una coda reale. Queste soluzioni sono <strong>versatili e adattabili a vari scenari<\/strong>, permettendoti di ottenere lo stesso risultato senza dipendere da infrastrutture complesse.<\/p>\n\n\n\n<p>Prima di iniziare, voglio rassicurarti: <strong>questi approcci non sono utili solo quando una coda tradizionale non \u00e8 disponibile<\/strong>. Sono abbastanza flessibili da essere adottati <strong>anche quando potresti utilizzarne una vera<\/strong>, senza alcuna controindicazione.<\/p>\n\n\n\n<p>Esplorando gli esempi di questa serie, potrai valutare quale strategia sia <strong>pi\u00f9 adatta al tuo caso d\u2019uso<\/strong>. \ud83d\ude80<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-fastq\"><strong>Fastq<\/strong><\/h2>\n\n\n\n<p>Il primo articolo tratta di <strong>fastq<\/strong>, un pacchetto npm per Node.js sviluppato da <strong>Matteo Collina<\/strong>.<br>Come puoi immaginare, questa soluzione funziona <strong>esclusivamente in un ambiente Node.js<\/strong>.<\/p>\n\n\n\n<p>Utilizzando <strong>fastq<\/strong>, puoi creare <strong>una o pi\u00f9 code in memoria<\/strong>. Tuttavia, questo significa che <strong>se il processo viene terminato, tutti i dati nella coda andranno persi<\/strong>. Per questo motivo, \u00e8 necessario implementare una strategia per ricreare la coda all\u2019avvio dell\u2019applicazione.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-come-iniziare-con-fastq\"><strong>Come iniziare con fastq<\/strong><\/h2>\n\n\n\n<p>Per iniziare, devi installare <strong>fastq<\/strong> all\u2019interno del tuo progetto Node.js. Ho gi\u00e0 preparato un <strong>progetto semplice<\/strong> che puoi seguire passo dopo passo, lo trovi [qui].<\/p>\n\n\n\n<p>Dopo aver eseguito <strong>git clone<\/strong> e <strong>npm install<\/strong>, il primo passo \u00e8 lanciare il comando:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">npm install fastq<\/code><\/span><\/pre>\n\n\n<p>Cos\u00ec facendo, installerai la dipendenza nel tuo progetto e sarai pronto a usare <strong>fastq<\/strong>.<\/p>\n\n\n\n<p>Come puoi vedere, <strong>l\u2019installazione e la configurazione di questo pacchetto sono rapide e semplici<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>La tua prima coda<\/strong><\/h2>\n\n\n\n<p>Ora \u00e8 il momento di creare la tua <strong>prima coda<\/strong> con <strong>fastq<\/strong>!<\/p>\n\n\n\n<p>Fastq offre un\u2019API semplice per interagire con le code. Per iniziare, devi definire una <strong>funzione worker<\/strong> che gestir\u00e0 gli elementi all\u2019interno della coda.<\/p>\n\n\n\n<p>Questa funzione accetta due argomenti:<\/p>\n\n\n\n<p>1\ufe0f\u20e3 Il <strong>primo<\/strong> \u00e8 l&#8217;elemento da processare nella coda.<br>2\ufe0f\u20e3 Il <strong>secondo<\/strong> varia in base all\u2019approccio scelto per completare l&#8217;esecuzione:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Callback approach<\/strong>: il secondo argomento \u00e8 una funzione <code>done<\/code>, che deve essere chiamata al termine del processo. In caso di successo, devi invocarla passando <code>null<\/code> come primo parametro; in caso di errore, devi passare l&#8217;errore.<\/li>\n\n\n\n<li><strong>Promise approach<\/strong>: puoi omettere il secondo argomento e gestire eventuali errori lanciandoli direttamente.<\/li>\n<\/ul>\n\n\n\n<p>Per questo esempio, utilizzeremo l\u2019approccio basato su <strong>Promise<\/strong>, ma sentiti libero di implementarlo anche con le <strong>callback<\/strong> se lo preferisci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Creiamo la nostra coda con fastq<\/strong><\/h2>\n\n\n\n<p>Creiamo un nuovo file <code>src\/queue.ts<\/code> che conterr\u00e0 il nostro <strong>worker per la coda<\/strong>.<\/p>\n\n\n\n<p>Per rendere questo esempio pi\u00f9 concreto, simuleremo un <strong>sistema di registrazione utenti<\/strong>, in cui la coda avr\u00e0 il compito di <strong>inviare un&#8217;email di conferma<\/strong> a un nuovo utente. Ovviamente, non ci addentreremo nei dettagli reali dell\u2019invio email, ma utilizzeremo servizi fittizi per dimostrare il funzionamento di <strong>fastq<\/strong>.<\/p>\n\n\n\n<p> <strong>Ora \u00e8 il momento di costruire la tua prima coda!<\/strong><\/p>\n\n\n\n<p>Nel file <code>queue.ts<\/code>, iniziamo definendo l\u2019interfaccia per il <strong>task<\/strong> da gestire:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">interface<\/span> <span class=\"hljs-selector-tag\">UserCreatedTask<\/span> {\n <span class=\"hljs-attribute\">id<\/span>: string;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>L\u2019interfaccia descrive la struttura di ogni <strong>elemento<\/strong> che verr\u00e0 inserito nella coda. Ora \u00e8 il momento di utilizzarla per gestire il processo all\u2019interno della coda. Prima di procedere, dobbiamo importare alcune dipendenze necessarie.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> type { queueAsPromised } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'fastq'<\/span>;\n<span class=\"hljs-keyword\">import<\/span> * <span class=\"hljs-keyword\">as<\/span> fastq <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'fastq'<\/span>;\n<span class=\"hljs-keyword\">import<\/span> logger <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'logger.js'<\/span>;\n<span class=\"hljs-keyword\">import<\/span> { setTimeout } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'node:timers\/promises'<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>I primi due import sono utilizzati per la gestione della coda; il <strong>logger<\/strong> viene impiegato per mostrare alcune informazioni nel terminale durante l&#8217;esecuzione, mentre <strong>setTimeout<\/strong> simula il tempo di esecuzione di un servizio esterno (in questo caso, un <strong>finto server SMTP<\/strong>).<\/p>\n\n\n\n<p>Ora che hai tutte le dipendenze necessarie, puoi creare il tuo <strong>worker<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">userInsertHandler<\/span>(<span class=\"hljs-params\">arg: UserCreatedTask<\/span>) <\/span>{\n  logger.info(arg, <span class=\"hljs-string\">'User created task received'<\/span>);\n  <span class=\"hljs-keyword\">const<\/span> fakeImplementation = <span class=\"hljs-built_in\">Math<\/span>.random() &gt; <span class=\"hljs-number\">0.8<\/span> ? <span class=\"hljs-string\">'success'<\/span> : <span class=\"hljs-string\">'error'<\/span>\n  <span class=\"hljs-keyword\">const<\/span> timeout = fakeImplementation === <span class=\"hljs-string\">'success'<\/span> ? <span class=\"hljs-number\">2000<\/span> : <span class=\"hljs-number\">1000<\/span>;\n  <span class=\"hljs-keyword\">await<\/span> setTimeout(timeout);\n  <span class=\"hljs-keyword\">if<\/span> (fakeImplementation === <span class=\"hljs-string\">'error'<\/span>) {\n    <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Error<\/span>(<span class=\"hljs-string\">`User created task got error with id: <span class=\"hljs-subst\">${arg.id}<\/span>`<\/span>);\n }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Come puoi vedere, questa funzione \u00e8 semplice, ma ti fornisce tutte le basi necessarie per gestire una coda con <strong>fastq<\/strong>.<\/p>\n\n\n\n<p>Per prima cosa, l&#8217;argomento \u00e8 di tipo <strong>UserCreatedTask<\/strong>, il che significa che l&#8217;elemento nella coda deve rispettare questa struttura.<\/p>\n\n\n\n<p>Successivamente, hai simulato un risultato di successo o errore utilizzando un semplice <strong>Math.random()<\/strong>. Se l&#8217;operazione ha esito positivo, l&#8217;esecuzione attender\u00e0 <strong>2 secondi<\/strong> prima di risolvere la <strong>Promise<\/strong>; in caso contrario, attender\u00e0 <strong>1 secondo<\/strong> prima di generare un errore.<\/p>\n\n\n\n<p>Semplice, vero? Ora devi associare questo <strong>worker<\/strong> a una vera coda <strong>fastq<\/strong>. Per farlo, inserisci questo codice<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> queue: queueAsPromised&lt;UserCreatedTask&gt; = fastq.promise(userInsertHandler, <span class=\"hljs-number\">1<\/span>);\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> queue;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Utilizzando il metodo <strong>fastq.promise<\/strong>, crei la tua coda con <strong>fastq<\/strong> e associ il worker <strong>userInsertHandler<\/strong> alla coda.<\/p>\n\n\n\n<p>Un dettaglio importante: il <strong>secondo parametro<\/strong> definisce il numero di <strong>worker concorrenti<\/strong> che vuoi avere. In questo caso, la coda ha un solo worker, ma puoi aumentarlo a seconda delle tue esigenze.<\/p>\n\n\n\n<p>Infine, l&#8217;ultima riga <strong>esporta<\/strong> la coda al di fuori di questo modulo JS, permettendoti di aggiungere elementi alla coda in qualsiasi punto del tuo codice.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"859\" height=\"527\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/image.png\" alt=\"\" class=\"wp-image-32445\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/image.png 859w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/image-300x184.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/image-768x471.png 768w\" sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Inserire dati nella coda<\/h2>\n\n\n\n<p>L&#8217;ultimo tassello del puzzle riguarda <strong>l&#8217;inserimento dei dati nella coda<\/strong>.<\/p>\n\n\n\n<p>Per farlo, devi <strong>importare la coda<\/strong> nel modulo consumer e chiamare il metodo <strong>push<\/strong>.<\/p>\n\n\n\n<p>Ora, spostati nel file <strong>src\/index.ts<\/strong> e importa la coda.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> userInsertQueue <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/queue.js'<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ora creerai un <strong>metodo di esecuzione fittizio<\/strong> che generer\u00e0 <strong>ID utente casuali<\/strong> e li <strong>inserir\u00e0 nella coda<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">run<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> usersToHandle = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Array<\/span>(<span class=\"hljs-number\">5<\/span>).fill(<span class=\"hljs-literal\">undefined<\/span>).map(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> randomUUID())\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> id <span class=\"hljs-keyword\">of<\/span> usersToHandle) {\n    <span class=\"hljs-keyword\">const<\/span> task = {\n      id\n }\n    userInsertQueue.push(task)\n .then(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n      logger.info(task, <span class=\"hljs-string\">`Task with id <span class=\"hljs-subst\">${task.id}<\/span> has been completed`<\/span>);\n })\n .catch(<span class=\"hljs-function\">(<span class=\"hljs-params\">error<\/span>) =&gt;<\/span> {\n      logger.error(task, <span class=\"hljs-string\">`Task with id <span class=\"hljs-subst\">${task.id}<\/span> has failed`<\/span>, error);\n })\n    logger.info(task, <span class=\"hljs-string\">`Task with id <span class=\"hljs-subst\">${task.id}<\/span> has been pushed`<\/span>);\n }\n}\n\nrun()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Come puoi vedere, il metodo <strong>push<\/strong> restituisce una <strong>promise<\/strong>, quindi puoi gestire il risultato per capire se il task \u00e8 stato <strong>completato con successo<\/strong> o <strong>rigettato<\/strong>.<\/p>\n\n\n\n<p>Tieni a mente questo dettaglio, perch\u00e9 torner\u00e0 utile quando parleremo della <strong>strategia di retry<\/strong>. <\/p>\n\n\n\n<p>Ora torniamo all&#8217;esempio. Nel <strong>metodo run<\/strong>, creiamo una lista di <strong>ID utente casuali<\/strong> utilizzando il metodo <strong>randomUUID<\/strong>. Poi, iteriamo la lista e <strong>inseriamo ogni elemento nella coda<\/strong>. Utilizzando i metodi <strong>then<\/strong> e <strong>catch<\/strong>, registriamo nel log il risultato dell\u2019esecuzione per ogni ID. <\/p>\n\n\n\n<p>Perfetto! Ora \u00e8 il momento di vedere il risultato in azione. Apri il terminale ed esegui il comando: npm run start.<\/p>\n\n\n\n<p>Dovresti vedere un output simile a questo nel terminale:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">13.067<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): User created task received\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"a966759c-f385-4651-a0c1-55742ceb4017\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">13.067<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id a966759c-f385<span class=\"hljs-number\">-4651<\/span>-a0c1<span class=\"hljs-number\">-55742<\/span>ceb4017 has been pushed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"a966759c-f385-4651-a0c1-55742ceb4017\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">13.067<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">24<\/span>d9d735<span class=\"hljs-number\">-2399<\/span><span class=\"hljs-number\">-471<\/span>e-b64c<span class=\"hljs-number\">-55<\/span>ee0c769daa has been pushed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"24d9d735-2399-471e-b64c-55ee0c769daa\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">13.067<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">726<\/span>b4bc5<span class=\"hljs-number\">-794<\/span>d<span class=\"hljs-number\">-4581<\/span>-a96c-e41a474c446d has been pushed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"726b4bc5-794d-4581-a96c-e41a474c446d\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">13.067<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">1<\/span>a6dd1b4<span class=\"hljs-number\">-2123<\/span><span class=\"hljs-number\">-410<\/span>b-a2ad-f420a14d53e9 has been pushed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"1a6dd1b4-2123-410b-a2ad-f420a14d53e9\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">13.067<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">6<\/span>a8681e4-bba4<span class=\"hljs-number\">-42e0<\/span>-b484<span class=\"hljs-number\">-976<\/span>de8be9bcb has been pushed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"6a8681e4-bba4-42e0-b484-976de8be9bcb\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">14.069<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): User created task received\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"24d9d735-2399-471e-b64c-55ee0c769daa\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">14.070<\/span>] ERROR (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id a966759c-f385<span class=\"hljs-number\">-4651<\/span>-a0c1<span class=\"hljs-number\">-55742<\/span>ceb4017 has failed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"a966759c-f385-4651-a0c1-55742ceb4017\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">15.070<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): User created task received\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"726b4bc5-794d-4581-a96c-e41a474c446d\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">15.071<\/span>] ERROR (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">24<\/span>d9d735<span class=\"hljs-number\">-2399<\/span><span class=\"hljs-number\">-471<\/span>e-b64c<span class=\"hljs-number\">-55<\/span>ee0c769daa has failed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"24d9d735-2399-471e-b64c-55ee0c769daa\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">16.071<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): User created task received\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"1a6dd1b4-2123-410b-a2ad-f420a14d53e9\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">16.071<\/span>] ERROR (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">726<\/span>b4bc5<span class=\"hljs-number\">-794<\/span>d<span class=\"hljs-number\">-4581<\/span>-a96c-e41a474c446d has failed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"726b4bc5-794d-4581-a96c-e41a474c446d\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">17.072<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): User created task received\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"6a8681e4-bba4-42e0-b484-976de8be9bcb\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">17.073<\/span>] ERROR (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">1<\/span>a6dd1b4<span class=\"hljs-number\">-2123<\/span><span class=\"hljs-number\">-410<\/span>b-a2ad-f420a14d53e9 has failed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"1a6dd1b4-2123-410b-a2ad-f420a14d53e9\"<\/span>\n&#91;<span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">35<\/span>:<span class=\"hljs-number\">19.074<\/span>] INFO (<span class=\"hljs-number\">59175<\/span>): Task <span class=\"hljs-keyword\">with<\/span> id <span class=\"hljs-number\">6<\/span>a8681e4-bba4<span class=\"hljs-number\">-42e0<\/span>-b484<span class=\"hljs-number\">-976<\/span>de8be9bcb has been completed\n    <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"6a8681e4-bba4-42e0-b484-976de8be9bcb\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Verificando i risultati, puoi notare che alcuni task sono falliti mentre altri sono stati completati con successo. Quindi, come puoi intuire, <strong>fastq non offre una strategia di retry integrata<\/strong>, il che significa che i task falliti rimangono tali alla fine dell&#8217;esecuzione.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-come-puoi-implementare-una-strategia-di-retry\"><strong>Come puoi implementare una strategia di retry?<\/strong><\/h3>\n\n\n\n<p>In questo esempio, possiamo utilizzare una <strong>mappa<\/strong> per salvare lo <strong>stato di ogni task<\/strong> e il <strong>numero di tentativi<\/strong> effettuati.<\/p>\n\n\n\n<p>Vediamo l&#8217;implementazione:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> logger <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'logger.js'<\/span>;\n<span class=\"hljs-keyword\">import<\/span> { randomUUID } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'node:crypto'<\/span>;\n<span class=\"hljs-keyword\">import<\/span> userInsertQueue <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/queue.js'<\/span>;\n\ntype Status = <span class=\"hljs-string\">'not-handle'<\/span> | <span class=\"hljs-string\">'error'<\/span> | <span class=\"hljs-string\">'success'<\/span>\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">run<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> usersToHandle = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Array<\/span>(<span class=\"hljs-number\">5<\/span>).fill(<span class=\"hljs-literal\">undefined<\/span>).map(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> randomUUID())\n  <span class=\"hljs-keyword\">const<\/span> userProcessStatus: Record&lt;string, { <span class=\"hljs-attr\">status<\/span>: Status, <span class=\"hljs-attr\">retryValue<\/span>: number }&gt; = {}\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> id <span class=\"hljs-keyword\">of<\/span> usersToHandle) {\n    userProcessStatus&#91;id] = {\n      <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-string\">'not-handle'<\/span>,\n      <span class=\"hljs-attr\">retryValue<\/span>: <span class=\"hljs-number\">0<\/span>\n };\n    <span class=\"hljs-keyword\">const<\/span> task = {\n      id\n }\n    <span class=\"hljs-keyword\">const<\/span> pushMessage = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> userInsertQueue.push(task)\n .then(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n        logger.info(<span class=\"hljs-string\">`Task with id <span class=\"hljs-subst\">${task.id}<\/span> has been proceed`<\/span>);\n        userProcessStatus&#91;id].status = <span class=\"hljs-string\">'success'<\/span>;\n })\n .catch(<span class=\"hljs-function\"><span class=\"hljs-params\">err<\/span> =&gt;<\/span> {\n        <span class=\"hljs-keyword\">const<\/span> state = userProcessStatus&#91;id]\n        logger.error(err, <span class=\"hljs-string\">`Task with id <span class=\"hljs-subst\">${task.id}<\/span> got error after retry <span class=\"hljs-subst\">${state.retryValue}<\/span>`<\/span>);\n        state.status = <span class=\"hljs-string\">'error'<\/span>;\n        <span class=\"hljs-keyword\">if<\/span> (state.retryValue &lt; <span class=\"hljs-number\">3<\/span>) {\n          state.retryValue++\n          pushMessage()\n }\n })\n    pushMessage()\n    logger.info(task, <span class=\"hljs-string\">`Task with id <span class=\"hljs-subst\">${task.id}<\/span> has been pushed`<\/span>);\n }\n\n  process.on(<span class=\"hljs-string\">'exit'<\/span>, () =&gt; {\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> &#91;id, { status, retryValue }] <span class=\"hljs-keyword\">of<\/span> <span class=\"hljs-built_in\">Object<\/span>.entries(userProcessStatus)) {\n      logger.info(<span class=\"hljs-string\">`Id <span class=\"hljs-subst\">${id}<\/span> is <span class=\"hljs-subst\">${status}<\/span> after <span class=\"hljs-subst\">${retryValue}<\/span> retries`<\/span>);\n }\n })\n}\n\nrun()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo approccio, la <strong>mappa userProcessStatus<\/strong> contiene gli <strong>ID utente come chiavi<\/strong> e un oggetto con due campi come valore: <strong>lo stato dell&#8217;utente<\/strong> e il <strong>numero di tentativi di retry<\/strong> effettuati per quell&#8217;ID.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-come-funziona\"><strong>Come funziona?<\/strong><\/h3>\n\n\n\n<p>Utilizzando il metodo <strong>pushMessage<\/strong>, creiamo una funzione che gestisce questa mappa:<\/p>\n\n\n\n<p>1\ufe0f\u20e3 Per prima cosa, l&#8217;elemento viene inserito nella coda e si attende il risultato.<br>2\ufe0f\u20e3 Se l&#8217;operazione ha <strong>successo<\/strong>, l&#8217;elemento viene segnato come <strong>completato<\/strong> nella mappa.<br>3\ufe0f\u20e3 Se l&#8217;operazione <strong>fallisce<\/strong>, lo stato viene impostato su <strong>errore<\/strong>. Se il numero di retry \u00e8 <strong>inferiore a tre<\/strong>, il contatore viene aumentato e il <strong>pushMessage viene richiamato<\/strong> per riprovare l&#8217;elaborazione dell&#8217;elemento.<\/p>\n\n\n\n<p>\ud83d\udd0d <strong>Debugging extra<\/strong>: Ho anche aggiunto un <strong>hook prima della chiusura del processo<\/strong> per riepilogare i risultati dei task, utile per il debug.<\/p>\n\n\n\n<p>Ora puoi eseguire nuovamente <strong>npm run start<\/strong> e osservare i risultati: noterai che il programma tenta di elaborare nuovamente i task falliti prima di terminare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusioni\">Conclusioni<\/h2>\n\n\n\n<p>\u00c8 il momento di <strong>concludere questo articolo<\/strong>.<\/p>\n\n\n\n<p>In questo post hai imparato:<\/p>\n\n\n\n<p>\u2705 Come creare il tuo <strong>worker<\/strong><br>\u2705 Come creare una <strong>coda con fastq<\/strong> e associarla al worker<br>\u2705 Come <strong>inserire elementi nella coda<\/strong><br>\u2705 Come costruire una <strong>strategia di retry<\/strong> per gli elementi nella coda<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pro-e-contro\"><strong>Pro e Contro<\/strong><\/h3>\n\n\n\n<p>Questa soluzione \u00e8 utile in alcuni scenari ed \u00e8 molto semplice da implementare, ma presenta alcune sfide da gestire:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Strategia di retry<\/strong>: Se ne hai bisogno, devi implementarla manualmente.<\/li>\n\n\n\n<li><strong>Gestione della memoria<\/strong>: Tutto viene mantenuto in memoria, quindi devi trovare un modo per <strong>salvare lo stato<\/strong> della tua entit\u00e0. Altrimenti, se il processo si interrompe, <strong>perderai tutti i dati<\/strong> della tua coda.<\/li>\n<\/ul>\n\n\n\n<p>E con questo, abbiamo terminato! <strong>Spero che l\u2019articolo ti sia stato utile<\/strong> e ci vediamo presto per il prossimo capitolo.<\/p>\n\n\n\n<p>\ud83d\udd17<a href=\"https:\/\/github.com\/Puppo\/queueing-without-a-queue\/tree\/fastq-result\"> <strong>Qui trovi il risultato di questo post<\/strong><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quante volte hai avuto bisogno di disaccoppiare i processi utilizzando una coda, solo per scoprire che non ne avevi una a disposizione a causa di vincoli di risorse o dell\u2019impossibilit\u00e0 di installare software aggiuntivo? In questa serie, ti mostrer\u00f2 come risolvere questo problema utilizzando diverse librerie e strumenti, anche in assenza di una coda reale.&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\">Read more<\/a><\/p>\n","protected":false},"author":309,"featured_media":32404,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10269],"tags":[13222,10438],"collections":[11708],"class_list":{"0":"post-32444","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-architettura-del-software","8":"tag-node-js-it","9":"tag-sviluppo-software-it","10":"collections-dalla-community","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Gestire le code senza una coda: Scopri fastq<\/title>\n<meta name=\"description\" content=\"Scopri come disaccoppiare i processi utilizzando una coda tramite diverse librerie e strumenti, anche se non disponi di una coda reale.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gestire le code senza una coda: Scopri fastq\" \/>\n<meta property=\"og:description\" content=\"Scopri come disaccoppiare i processi utilizzando una coda tramite diverse librerie e strumenti, anche se non disponi di una coda reale.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-17T09:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Puppo92\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Puppo92\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\"},\"author\":{\"name\":\"Puppo92\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/59285912d17139a5023ec1bc0850571f\"},\"headline\":\"Gestire le code senza una coda: Scopri fastq\",\"datePublished\":\"2025-03-17T09:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\"},\"wordCount\":1264,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp\",\"keywords\":[\"Node.js\",\"sviluppo software\"],\"articleSection\":[\"Architettura del software\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\",\"name\":\"Gestire le code senza una coda: Scopri fastq\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp\",\"datePublished\":\"2025-03-17T09:00:00+00:00\",\"description\":\"Scopri come disaccoppiare i processi utilizzando una coda tramite diverse librerie e strumenti, anche se non disponi di una coda reale.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Architettura del software\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Gestire le code senza una coda: Scopri fastq\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/59285912d17139a5023ec1bc0850571f\",\"name\":\"Puppo92\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f53382233f04621eca9e506d7cc3bbed35855197ea72254ad3e31b9a0b6d39a8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f53382233f04621eca9e506d7cc3bbed35855197ea72254ad3e31b9a0b6d39a8?s=96&d=mm&r=g\",\"caption\":\"Puppo92\"},\"description\":\"I'm a Senior Software Developer, Microsoft MVP, Google Developer Expert Codemotion Ambassador and GitKraken Ambassador. I love JavaScript and TypeScript. In my free time, I love studying new technologies, improving myself, creating YouTube content or writing technical articles. I can\u2019t stay without trail running and love to do it in my love Dolomiti.\",\"sameAs\":[\"https:\/\/www.delpuppo.net\/\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/puppo92\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Gestire le code senza una coda: Scopri fastq","description":"Scopri come disaccoppiare i processi utilizzando una coda tramite diverse librerie e strumenti, anche se non disponi di una coda reale.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/","og_locale":"en_US","og_type":"article","og_title":"Gestire le code senza una coda: Scopri fastq","og_description":"Scopri come disaccoppiare i processi utilizzando una coda tramite diverse librerie e strumenti, anche se non disponi di una coda reale.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-03-17T09:00:00+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp","type":"image\/webp"}],"author":"Puppo92","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Puppo92","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/"},"author":{"name":"Puppo92","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/59285912d17139a5023ec1bc0850571f"},"headline":"Gestire le code senza una coda: Scopri fastq","datePublished":"2025-03-17T09:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/"},"wordCount":1264,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp","keywords":["Node.js","sviluppo software"],"articleSection":["Architettura del software"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/","name":"Gestire le code senza una coda: Scopri fastq","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp","datePublished":"2025-03-17T09:00:00+00:00","description":"Scopri come disaccoppiare i processi utilizzando una coda tramite diverse librerie e strumenti, anche se non disponi di una coda reale.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/gestire-le-code-senza-una-coda-scopri-fastq\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/"},{"@type":"ListItem","position":3,"name":"Architettura del software","item":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/"},{"@type":"ListItem","position":4,"name":"Gestire le code senza una coda: Scopri fastq"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/59285912d17139a5023ec1bc0850571f","name":"Puppo92","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f53382233f04621eca9e506d7cc3bbed35855197ea72254ad3e31b9a0b6d39a8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f53382233f04621eca9e506d7cc3bbed35855197ea72254ad3e31b9a0b6d39a8?s=96&d=mm&r=g","caption":"Puppo92"},"description":"I'm a Senior Software Developer, Microsoft MVP, Google Developer Expert Codemotion Ambassador and GitKraken Ambassador. I love JavaScript and TypeScript. In my free time, I love studying new technologies, improving myself, creating YouTube content or writing technical articles. I can\u2019t stay without trail running and love to do it in my love Dolomiti.","sameAs":["https:\/\/www.delpuppo.net\/"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/puppo92\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-600x600.webp","author_info":{"display_name":"Puppo92","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/puppo92\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/DALL\u00b7E-2025-03-11-09.28.39-A-futuristic-workspace-with-a-developer-creating-a-Design-System-from-scratch-using-native-CSS-and-TypeScript.-The-setup-includes-multiple-screens-dis-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Puppo92","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/puppo92\/"},"uagb_comment_info":0,"uagb_excerpt":"Quante volte hai avuto bisogno di disaccoppiare i processi utilizzando una coda, solo per scoprire che non ne avevi una a disposizione a causa di vincoli di risorse o dell\u2019impossibilit\u00e0 di installare software aggiuntivo? In questa serie, ti mostrer\u00f2 come risolvere questo problema utilizzando diverse librerie e strumenti, anche in assenza di una coda reale.&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/32444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/309"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=32444"}],"version-history":[{"count":1,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/32444\/revisions"}],"predecessor-version":[{"id":32447,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/32444\/revisions\/32447"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/32404"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=32444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=32444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=32444"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=32444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}