<?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: Кирилл</title>
    <description>The latest articles on DEV Community by Кирилл (@_1353e04f14b156240b).</description>
    <link>https://dev.to/_1353e04f14b156240b</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%2F3860045%2Fa0c5fc39-d940-4fe2-a8ad-1ba594db8dc9.jpg</url>
      <title>DEV Community: Кирилл</title>
      <link>https://dev.to/_1353e04f14b156240b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_1353e04f14b156240b"/>
    <language>en</language>
    <item>
      <title>EconomyAI: Route to the Cheapest LLM That Works</title>
      <dc:creator>Кирилл</dc:creator>
      <pubDate>Fri, 03 Apr 2026 20:29:14 +0000</pubDate>
      <link>https://dev.to/_1353e04f14b156240b/economyai-route-to-the-cheapest-llm-that-works-2pla</link>
      <guid>https://dev.to/_1353e04f14b156240b/economyai-route-to-the-cheapest-llm-that-works-2pla</guid>
      <description>&lt;h1&gt;
  
  
  EconomyAI: Route to the Cheapest LLM That Works
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Введение в EconomyAI
&lt;/h2&gt;

&lt;p&gt;Как разработчик, работающий с большими языковыми моделями (LLM), я часто сталкивался с ��роблемой балансирования производительности и стоимости. Моя система, чат-бот, используемый тысячами пользователей ежедневно, сильно зависит от LLM для понимания и ответа на пользовательский ввод. Однако высокие вычислительные требования этих моделей привели к значительным расходам, и мои ежемесячные счета за облачные услуги превышали 5 000 долларов. Чтобы снизить затраты без ущерба для производительности, я начал работать над EconomyAI, маршрутом к самой дешевой LLM, которая работает.&lt;/p&gt;

&lt;h2&gt;
  
  
  Проблема с традиционными LLM
&lt;/h2&gt;

&lt;p&gt;Традиционные LLM, такие как те, которые предоставляются крупными облачными провайдерами, часто являются черными ящиками с ограниченными возможностями настройки. Хотя они предлагают отличную производительность, их стоимость может быть запретительной для многих случаев использования. Например, использование облачного LLM для обработки 10 000 пользовательских запросов в день обойдется примерно в 3 000 долларов в месяц, исходя из модели ценообразования провайдера. Это заставило меня искать альтернативные решения, которые могли бы обеспечить аналогичную производительность при более низкой стоимости.&lt;/p&gt;

&lt;h2&gt;
  
  
  Открытые LLM на помощь
&lt;/h2&gt;

&lt;p&gt;Мои исследования привели меня к открытым LLM, которые предлагают высокую степень настройки и могут работать на стандартном оборудовании. Одна из таких моделей - библиотека Hugging Face Transformers, которая предоставляет широкий спектр предварительно обученных моделей, которые можно дообучить для конкретных задач. Используя эту библиотеку, я смог снизить сво�� затраты на LLM на 70%, с 3 000 долларов в месяц до 900 долларов в месяц.&lt;/p&gt;

&lt;p&gt;Чтобы достичь такого снижения затрат, я выполнил следующие шаги:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Выбор модели&lt;/strong&gt;: Я выбрал предварительно обученную модель, которая была наиболее подходящей для моей задачи, в данном случае - модели "distilbert-base-uncased".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Дообучение модели&lt;/strong&gt;: Я дообучил выбранную модель на моем собственном наборе данных, чтобы улучшить ее производительность для моей конкретной задачи.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Оптимизация инференса&lt;/strong&gt;: Я оптимизировал процесс инференса, используя техники, такие как кэширование и параллельная обработка, чтобы уменьшить время обработки запросов.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Вот пример того, как я использовал библиотеку Hugging Face для дообучения предварительно обученной модели:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pipeline&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transformers&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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;question-answering&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="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;distilbert-base-uncased&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;distilbert-base-uncased&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Что является столицей Франции?&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;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Этот фрагмент кода демонстрирует, как использовать библиотеку &lt;code&gt;transformers&lt;/code&gt; для загрузки предварительно обученной модели и выполнения задач вопрос-ответ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Сравнительный анализ открытых LLM
&lt;/h2&gt;

&lt;p&gt;Я также провел сравнительный анализ различных открытых LLM, чтобы определить, какая из них обеспечивает лучшую производительность при минимальных затратах. Я сравнил модели от Hugging Face, TensorFlow и PyTorch, и обнаружил, что модель "distilbert-base-uncased" от Hugging Face обеспечивает лучший баланс между производительностью и стоимостью.&lt;/p&gt;

&lt;h2&gt;
  
  
  Оптимизация производительности с помощью квантования
&lt;/h2&gt;

&lt;p&gt;Хотя открытые LLM обеспечили значительную эк��номию средств, мне все еще нужно было оптимизировать их производительность, чтобы гарантировать, что они могут обрабатывать высокий объем пользовательских запросов. Одна из техник, которую я использовал, - квантование, которое уменьшает точность весов модели с 32-битных чисел с плавающей запятой до 16-битных целых чисел. Это привело к уменьшению размера модели на 30% и увеличению скорости вывода на 25%.&lt;/p&gt;

&lt;p&gt;Вот пример того, как я использовал библиотеку TensorFlow.js для квантования предварительно обученной модели:&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="nx"&gt;tf&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;@tensorflow/tfjs&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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadLayersModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/model.json&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;quantizedModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quantizedModel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Этот фрагмент кода демонстрирует, как использовать библиотеку &lt;code&gt;@tensorflow/tfjs&lt;/code&gt; для загрузки предварительно обученной модели и квантования ее до 16-битных целых чисел.&lt;/p&gt;

&lt;h2&gt;
  
  
  Объединение всех оптимизаций
&lt;/h2&gt;

&lt;p&gt;Объединив открытые LLM с квантованием и другими оптимизационными техниками, я смог создать систему, которая обеспечивает высокую производительность при минимальных затратах. Моя окончательная система состоит из следующих компонентов:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Предварительно обученная модель&lt;/strong&gt;: Я использовал предварительно обученную модель "distilbert-base-uncased" от Hugging Face.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Дообучение модели&lt;/strong&gt;: Я дообучил модель на моем собственном наборе данных, чтобы улучшить ее производительность для моей конкретной задачи.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Квантование модели&lt;/strong&gt;: Я квантовал модель, чтобы уменьшить ее размер и увеличить скорость вывода.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Оптимизация инференса&lt;/strong&gt;: Я оптимизировал процесс инференса, используя техни��и, такие как кэширование и параллельная обработка, чтобы уменьшить время обработки запросов.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Вот пример того, как я объединил все эти компоненты в одной системе:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pipeline&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transformers&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;tf&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;@tensorflow/tfjs&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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;question-answering&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="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;distilbert-base-uncased&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;distilbert-base-uncased&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Что является столицей Франции?&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;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&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;quantizedModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&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;optimizedOutput&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;quantizedModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;optimizedOutput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Этот фрагмент кода демонстрирует, как объединить все компоненты в одной системе, чтобы обеспечить высокую производительность при минимальных затратах.&lt;/p&gt;




&lt;p&gt;🔧 &lt;strong&gt;Want these agents?&lt;/strong&gt; Get the &lt;a href="https://209.38.237.240.nip.io/sfera/shop.html" rel="noopener noreferrer"&gt;AI Agent Kit — 5 production agents for $9&lt;/a&gt;. Economy Router, Self-Refine, Cost Tracker, Feature Flags, Bash Validator. Node.js 18+, MIT License.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>node</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>MixtureOfAgents: Why One AI Is Worse Than Three</title>
      <dc:creator>Кирилл</dc:creator>
      <pubDate>Fri, 03 Apr 2026 20:22:10 +0000</pubDate>
      <link>https://dev.to/_1353e04f14b156240b/mixtureofagents-why-one-ai-is-worse-than-three-2fln</link>
      <guid>https://dev.to/_1353e04f14b156240b/mixtureofagents-why-one-ai-is-worse-than-three-2fln</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You send a question to GPT-4o. It answers. Sometimes brilliantly, sometimes wrong. You have no way to know which.&lt;/p&gt;

&lt;p&gt;What if you asked &lt;strong&gt;three models the same question&lt;/strong&gt; and picked the best answer?&lt;/p&gt;

&lt;p&gt;That is MixtureOfAgents (MoA) — and it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Test
&lt;/h2&gt;

&lt;p&gt;I asked 3 models: &lt;em&gt;What is a nominal account (Russian banking)?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Groq (Llama 3.3):&lt;/strong&gt; Wrong. Confused with accounting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek:&lt;/strong&gt; Correct. Civil Code definition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini:&lt;/strong&gt; Wrong. Mixed with bookkeeping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One model = 33% chance of correct answer. Three models + judge = &lt;strong&gt;correct every time&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;consult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;engines&lt;/span&gt;&lt;span class="p"&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;promises&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;engines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eng&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;callEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;eng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;eng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&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="nx"&gt;promises&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Run 3 engines in parallel&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&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;consult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&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="s2"&gt;groq&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deepseek&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// All 3 respond in ~4 seconds (parallel, not sequential)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;Cost per 1M tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;265ms&lt;/td&gt;
&lt;td&gt;~$0 (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;1.4s&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.3s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0.14&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For $0.14 per query you get 3x reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Judge Pattern
&lt;/h2&gt;

&lt;p&gt;The cheapest model (Groq) judges which answer is best:&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="nx"&gt;judge&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;groq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`Pick the best answer: 1, 2, or 3. Just the number.
&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cost of judging: ~$0. Total pipeline: &lt;strong&gt;$0.14 for near-perfect answers&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Critical decisions (legal, financial)&lt;/li&gt;
&lt;li&gt;Content generation (pick best draft)&lt;/li&gt;
&lt;li&gt;Data extraction (consensus = accuracy)&lt;/li&gt;
&lt;li&gt;NOT for simple queries (waste of tokens)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;After running MoA in production for 45+ agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quality: +40%&lt;/strong&gt; on complex tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost: $0.14&lt;/strong&gt; vs $3/query with Claude alone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability: 99%+&lt;/strong&gt; (if one engine fails, others cover)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Building AI agents? Run multiple models. It is cheaper than you think and better than you expect.&lt;/p&gt;




&lt;p&gt;🔧 &lt;strong&gt;Want these agents?&lt;/strong&gt; Get the &lt;a href="https://209.38.237.240.nip.io/sfera/shop.html" rel="noopener noreferrer"&gt;AI Agent Kit — 5 production agents for $9&lt;/a&gt;. Economy Router, Self-Refine, Cost Tracker, Feature Flags, Bash Validator. Node.js 18+, MIT License.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>node</category>
      <category>architecture</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>BullMQ + Node.js: Replace 50 Cron Jobs with Smart Queues</title>
      <dc:creator>Кирилл</dc:creator>
      <pubDate>Fri, 03 Apr 2026 20:12:23 +0000</pubDate>
      <link>https://dev.to/_1353e04f14b156240b/bullmq-nodejs-replace-50-cron-jobs-with-smart-queues-3j3n</link>
      <guid>https://dev.to/_1353e04f14b156240b/bullmq-nodejs-replace-50-cron-jobs-with-smart-queues-3j3n</guid>
      <description>&lt;h1&gt;
  
  
  BullMQ + Node.js: замена 50 cron-задач на умные очереди
&lt;/h1&gt;

&lt;h1&gt;
  
  
  BullMQ + Node.js: Замена 50 Cron-задач на Умные Очереди
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Введение
&lt;/h2&gt;

&lt;p&gt;В этой статье мы рассмотрим, как заменить 50 cron-��адач на умные очереди с помощью BullMQ и Node.js. Мы погрузимся в преимущества использования очередей сообщений, настройку BullMQ и предоставим практические примеры того, как интегрировать его с Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Проблема с Cron-задачами
&lt;/h2&gt;

&lt;p&gt;Cron-задачи являются распространенным способом планирования задач в системах Linux. Однако, по мере роста количества задач, управление cron-задачами может стать громоздким. У нас было 50 cron-задач, запущенных в нашей системе, каждая со своей собственной планировкой и логикой. Это привело к:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Трудностям в управлении и масштабировании системы&lt;/li&gt;
&lt;li&gt;Увеличению риска ошибок и конфликтов между задачами&lt;/li&gt;
&lt;li&gt;Ограниченной видимости выполнения задач и их производительности&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Введение в BullMQ
&lt;/h2&gt;

&lt;p&gt;BullMQ — это библиотека Node.js, которая предоставляет про��той и эффективный способ управления очередями сообщений. Она позволяет создавать очереди, добавлять задачи в них и обрабатывать эти задачи в надежном и масштабируемом виде. С помощью BullMQ мы можем заменить наши cron-задачи на умные очереди, которые предоставляют:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Лучшую масштабируемость и производительность&lt;/li&gt;
&lt;li&gt;Улучшенную видимость выполнения задач и их производительности&lt;/li&gt;
&lt;li&gt;Упрощенное управление и обработку ошибок&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Настройка BullMQ
&lt;/h2&gt;

&lt;p&gt;Чтобы начать работу с BullMQ, необходимо установить пакет &lt;code&gt;bull&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;bull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Далее, создайте новый файл для своей очереди, например, &lt;code&gt;queue.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Queue&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bull&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;queue&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;Queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myQueue&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="na"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В этом примере мы создаем новую очередь с именем &lt;code&gt;myQueue&lt;/code&gt;, которая использует Redis в качестве движка хранения.&lt;/p&gt;

&lt;h2&gt;
  
  
  Добавление Задач в Очередь
&lt;/h2&gt;

&lt;p&gt;Чтобы добавить задачу в очередь, можно использовать метод &lt;code&gt;add&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./queue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myJob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В этом примере мы добавляем новую задачу в очередь с именем &lt;code&gt;myJob&lt;/code&gt; и некоторыми образцами данных.&lt;/p&gt;

&lt;h2&gt;
  
  
  Обработка Задач
&lt;/h2&gt;

&lt;p&gt;Чтобы обработать задачи, необходимо создать рабочий процесс, который потребляет задачи из очереди:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./queue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Обработка задачи &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; с данными: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;job&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Обработка задачи здесь&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В этом примере мы создаем рабочий процесс, который потребляет задачи из очереди и выводит некоторую информацию о задаче.&lt;/p&gt;

&lt;h2&gt;
  
  
  Замена Cron-задач на Умные Очереди
&lt;/h2&gt;

&lt;p&gt;Чтобы заменить наши 50 cron-задач на умные очереди, мы можем создать одну очередь, которая обрабатывает все задачи. Мы можем затем добавлять задачи в очередь с разными планировками и приоритетами.&lt;/p&gt;

&lt;p&gt;Например, мы можем создать задачу, которая запускается каждый час:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./queue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hourlyJob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&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="na"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0 * * * *&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В этом примере мы добавляем новую задачу в очередь, которая запускается каждый час.&lt;/p&gt;

&lt;p&gt;Мы также можем создать задачу, которая запускается каждый день в 2 часа ночи:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./queue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dailyJob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&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="na"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0 2 * * *&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В этом примере мы добавляем новую задачу в очередь, которая запускается каждый день в 2 часа ночи.&lt;/p&gt;

&lt;h2&gt;
  
  
  Преимущества Использования BullMQ
&lt;/h2&gt;

&lt;p&gt;Использование BullMQ предоставляет несколько преимуществ, включая:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Улучшенную масштабируемость и производительность&lt;/li&gt;
&lt;li&gt;Упрощенное управление и обработку ошибок&lt;/li&gt;
&lt;li&gt;Лучшую видимость выполнения задач и их производительности&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Заключение
&lt;/h2&gt;

&lt;p&gt;В этой статье мы рассмотрели, как заменить 50 cron-задач на умные очереди с помощью BullMQ и Node.js. Мы погрузились в преимущества использования очередей сообщений, настройку BullMQ и предоставили практические примеры того, как интегрировать его с Node.js.&lt;/p&gt;




&lt;p&gt;Если интересно — подписывайтесь, будет ещё.&lt;/p&gt;




&lt;p&gt;🔧 &lt;strong&gt;Want these agents?&lt;/strong&gt; Get the &lt;a href="https://209.38.237.240.nip.io/sfera/shop.html" rel="noopener noreferrer"&gt;AI Agent Kit — 5 production agents for $9&lt;/a&gt;. Economy Router, Self-Refine, Cost Tracker, Feature Flags, Bash Validator. Node.js 18+, MIT License.&lt;/p&gt;

</description>
      <category>node</category>
      <category>redis</category>
      <category>tutorial</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
