Nestjs框架: nestjs-bull的使用与相关queue的规划

Nest.js实战——扫描application下的所有metadata 背景 最近项目需要到一个基于事件驱动的一些业务模块,就封装一下类似@nestjs/bull一样的API去进行事件注册和触发,减少了一定的代码量。 通过Nest Core的功能去完成全局扫描metadata 通过@nestjs/core,我们可以找到相应框架实现的功能和工具,去完成我们需要写业务逻辑前的工作 DiscoveryService —— 扫描所有app module注册到的controllers和services 首先我们需要扫描所有的controller和service,通过DiscoverySe 阅读详情

概述

  • 在使用定时任务时,发现其只能处理简单任务,且由于定时任务是在 NestJS 运行过程中创建的
  • 大量不同定时任务创建时可能会占用 NestJS 服务的内存
  • 针对大量高并发任务场景和秒级任务应用场景,需要使用队列来创建此类任务
  • NestJS 官网提供了一个队列的官方应用方案叫做 nestjs-bull
  • 它使用 Redis 作为存储方案来存储消息队列的数据,封装了生产者、消费者和监听者等好用的接口

规划的目录结构

  • conditional
    • queue
      • queue.module.ts
      • services
        • tomic.consumer.ts
        • scheduled-tasks.consumer.ts
        • index.ts

1 ) 安装

  • $ npm i --save @nestjs/bull bull

2 ) 配置

# BULL任务队列
QUEUE_ON=false
QUEUE_REDIS_HOST=localhost
QUEUE_REDIS_PORT=6379
QUEUE_REDIS_PASSWORD=exmaple
  • 注意,这里的 redis 只支持哨兵模式 和 单节点模式,
  • 没有 cluster 的配置方式
  • 但是 bull 本身对接的是 ioredis
  • 可以使用 Connector 实现 redis 的 cluster 模式
  • cluster 是分布式的应用场景,绝大多数用单机或哨兵这样的高可用即可
  • 参考官方配置文档
  • 看下面的 defaultJobOptions 配置任务的选项
  • 没有用到 就不必动这些配置项目
    interface JobOpts {
      priority: number; // 优先级  从 1 (最高优先级) to MAX_INT  (最低优先级).
    
      delay: number; // 任务的延迟执行时间
    
      attempts: number; // 任务的尝试次数
    
      repeat: RepeatOpts; // 重复选项
    
      backoff: number | BackoffOpts; // 任务失败的 自动重试策略
    
      lifo: boolean; // 如果设置为 true, 则是后进先出的队列
      timeout: number; // 超时时间
    
      jobId: number | string; // 给任务设置一个具体的 id 默认是一个唯一的整数
    
    
      removeOnComplete: boolean | number; // 如果设置 true 成功之后删除
      // completes. A number specified the amount of jobs to keep. Default behavior is to keep the job in the completed set.
    
      removeOnFail: boolean | number; // 如果设置 true 则失败之后 删除
    
      stackTraceLimit: number; // 限制 记录 在堆栈中追踪的行数
    }
    

3 )创建模块,这是一个可选模块,所以

  • $ nest g mo conditional/queue --no-spec

  • conditional/queue/queue.module.ts

    import { Module } from '@nestjs/common';
    import { BullModule } from '@nestjs/bull';
    import { QueueConsumers } from './services';
    import { ConfigService } from '@nestjs/config';
    import { getEnvs } from '@/utils/get-envs';
    import { MailModule } from '../mail/mail.module';
    import { toBoolean } from '@utils/format';
    
    @Module({})
    export class QueueModule {
    	static register(): DynamicModule {
    		const parsedConfig = getEnvs(); // 获取配置的方法
    		const mailOn = parsedConfig['MAIL_ON'];
    		const conditionalModuleImports = [];
    
    		if (toBoolean(mailOn)) {
    			conditionalModuleImports.push(MailModule);
    		}
    
    		return {
    			module: QueueModule,
    			imports: [
    				...conditionalModuleImports,
    				BullModule.forRootAsync({
    					inject: [ConfigService],
    					useFactory: (configService: ConfigService) => {
    						const redisHost = configService.get('QUEUE_REDIS_HOST');
    						const redisPort = configService.get('QUEUE_REDIS_PORT');
    						const redisPassword = configService.get('QUEUE_REDIS_PASSWORD');
    						return {
    							redis: {
    								host: redisHost,
    								port: redisPort,
    								password: redisPassword,
    							},
    							defaultJobOptions: {
    								removeOnComplete: true,
    								// 默认成功失败都删除
    								// 如果,Fail了需要重试逻辑的话,这里设置为 false
    								removeOnFail: false,
    							}
    						}
    					}
    				}),
    				// 注册的时候,使用
    				BullModule.registerQueue(
    					{ name: 'tomic' }, 
    					// {  name: 'email' }, // 邮件相关
    					// { name: 'data-processing' }, // 数据处理
    					// { name: 'real-time-messages' }, // 实时消息
    					// { name: 'image-processing' }, // 图片上传、压缩
    					{ name: 'scheduled-tasks' }, // 计划任务
    					// { name: 'order-processing' }, //  订单处理,比如信用卡账单经过一个月才会入账
    				),
    			],
    			providers: [QueueConsumers],
    			exports: [BullModule],
    		}
    	}
    }
    

4 ) 在一个测试模块中导入 QueueModule

	import { Module } from '@nestjs/common';
	import { BullModule } from '@nestjs/bull';
	
	@Module({
		imports: [
			QueueModule.register(),
		],
		controllers: [AuthController],
	})
	
	export class AuthModule {}
  • 之后在测试模块的控制器下使用,如下
    import { InjectQueue } from '@nestjs/bull';
    import { Queue } from 'bull';
    import { diffNow } from '../utils/time';
    
    @Controller('auth')
    export class AuthController {
    	constructor(
    		@InjectQueue('tomic') private queue: Queue,
    		@InjectQueue('scheduled-tasks') private queue2: Queue,
    	){}
    	// 这里是 模拟 创建
    	@Get('test')
    	addQueue() {
    		this.queue.add({
    			foo: '123',
    		});
    		return 'ok';
    	}
    	@Get('test2')
    	addQueue2() {
    		// 选项版本
    		this.queue2.add('sendMail', {}, {
    			delay: diffNow('2025-07-01 00:00:05'), // 从当前时间来计算,需要延迟多久,单位 秒
    		});
    		return 'ok';
    	}
    }
    

这里 utils/time.ts 需要安装dayjs, $ pnpm install dayjs

import dayjs, { UnitType } from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);

export function diffNow (
	dateString: string,
	offset: number = 0,
	unit: UnitType = 'millisecond',
) {
	const now = dayjs().utc().add(offset, 'hour');
	const targetDate = dayjs(dateString).utc();

	const diff = targetDate.diff(now, unit);
	return diff;
}

5 ) 这里是模拟 消费 服务 tomic.consumer.ts

import { Processor, Process } from '@nestjs/bull';
import { Job } from 'bull';

@Processor('tomic')
export class TomicConsumer {
	@Process()
	async transcode(job: Job<unknown>) {
		let progress = 0;
		for (let i= 0; i < 10; i+) {
			console.log(`job data ${job.data} progress ${progress}`);
			progress += 1;
			await job.progress(progress);
		}
		return {};
	}
}
  • 更多 process 方法 查看
  • 除了 process 方法,官方文档中还有很多 job 实例暴露出来的方法
  • 如 log、getdate、update、remove、retry 等

7 )queue/services/scheduled-tasks.consumer.ts

import { ISendMailOptions, MailerService } from '@nestjs-modules/mailer';
import { Processor, Process } from '@nestjs/bull';
import { Logger, Optional } from '@nestjs/common';
import { Job } from 'bull';

@Processor('scheduled-tasks')
export class ScheduledTasksConsumer{
	logger = new Logger('ScheduledTasksConsumer');
	// 这里注入 邮件服务 和 短信服务 TODO
	constructor(@Optional() private mailerService: MailerService) {}
	
	// 发送邮件单个任务
	@Process('sendMail')
	async sendMail(job: Job<ISendMailOptions>) {
		// 这里可以临时设置为 Job<unknown> 测试
		const { data } = job;
		if (!this.mailerService) {
			this.logger.warn('Mail配置异常,请检查配置文件!');
			return;
		}
		const res = await this.mailerService.sendMail(data);
		// TODO写到数据库
		console. log('~ScheduledTasksConsumer ~ sendMail ~ res:', res);
	}
	
	// 
	//发送短信单个任务
	@Process('sendSms')
	async sendSms(job: Job<unknown>) {
		console.log'~ScheduledTasksConsumer~ sendSms~job:';
	}
}

6 )queue/services/index.ts

import { Provider } from '@nestjs/common';
import { ToimcConsumer } from './tomic.consumer';
import { ScheduledTasksConsumer } from './scheduled-tasks.consumer';

export const QueueConsumers: Provider[] = [
	ToimcConsumer,
	ScheduledTasksConsumer,
];

其他 queue 的 消费模块都注入到这里

关于 defaultJobOptions.removeOnFail

  • 上面 queue.module中的 defaultJobOptions 的配置项 removeOnFail 设置为 false
  • 这里,引入 生命周期方法 event-listeners-1

Local event listeners 和 Global event listeners 之间的区别

  • 如果有多个 处理进程,就需要用 Global event listeners

  • 如果只是使用默认的处理进程,那么就可以使用 Local event listeners

  • 因为我们的 ScheduledTasksConsumer 中有多个处理器,所以我们需要用到全局的

  • 创建 conditional/queue/services/scheduled-tasks-events.service.ts 文件

    import {
            OnGlobalQueueActive,
            OnGlobalQueueCleaned,
            OnGlobalQueueCompleted,
            OnGlobalQueueDrained,
            OnGlobalQueueError,
            OnGlobalQueueFailed,
            OnGlobalQueuePaused,
            OnGlobalQueueProgress,
            OnGlobalQueueRemoved,
            OnGlobalQueueResumed,
            OnGlobalQueueStalled,
            OnGlobalQueueWaiting,
            Processor,
            InjectQueue
        } from '@nestjs/bull';
        import { Job, Queue } from 'bull';
    
        @Processor('scheduled-tasks') // 这个名称 要和上面的保持一致
        export class ScheduledTasksEventsService {
    		constructor(@InjectQueue('scheduled-tasks') private queue: Queue) {}
            @OnGlobalQueueError()
            handleGlobalError(error: Error){
                console.error(`Global Error:${error.message}`);
            }
            @OnGlobalQueueWaiting()
            handleGlobalWaiting(jobId: number | string) {
                console.log(`Job with ID ${jobId} is waiting.`);
            }
            @OnGlobalQueueActive()
            handleGlobalActive(job:Job) {
            	// 拿到下面的 失败job 列表后,可以调用 job 的 retry 逻辑
            	// 或者 moveToCompleted 或 moveToFailed
            	// 参考:https://github.com/OptimalBits/bull/blob/master/REFERENCE.md#job
                this.queue.getFailed().then((fails) => {
                	console.log(fails); // 这里是 失败 job 的列表
                });
                console.log('------);
                console.log(`Job ${job.id} is now active.`);
            }
            @OnGlobalQueueStalled()
            handleGlobalStalled(job: Job) {
                console.log(`Job ${job.id} has stalled.`);
            }
            @OnGlobalQueueProgress()
            handleGlobalProgress(job: Job, progress: number) {
                console.log(`Job ${job.id} progress: ${progress}`);
            }
            @OnGlobalQueueCompleted()
            handleGlobalCompleted(job: Job, result: any) {
                console.log(`Job ${job.id} completed with result: ${result}`);
            }
            @OnGlobalQueueFailed()
            handleGlobalFailed(job: Job, err: Error) {
                console.error(`Job ${job.id} failed with error: ${err.message}`);
            }
            @OnGlobalQueuePaused()
            handleGlobalPaused() {
                console.log(`The queue has been paused.`);
            }
            @OnGlobalQueueResumed()
            handleGlobalResumed() {
                console.log(`The queue has been resumed.`);
            }
            @OnGlobalQueueCleaned()
                handleGlobalCleaned(jobs: Job[], type: string) {
                console.log(`Jobs cleaned of type ${type}: ${jobs. length}`);
            }
            @OnGlobalQueueDrained()
            handleGlobalDrained() {
                console.log(`All waiting jobs have been processed.`);
            }
            @OnGlobalQueueRemoved()
            handleGlobalRemoved(job:Job){
                console.log(`Job ${job.id} was removed.`);
            }
    }
    
    • 注意,怎样在 上面 拿到 执行失败的 任务,来了解具体的详情呢?
    • 关注上面的 constructor 以及 handleGlobalActive 也就是通过注入 queue 的实例
    • 关注相关注释,这里可以做一些事情, 不做过多阐述
  • 找到 queue/services/index.ts 在后面添加

    import { Provider } from '@nestjs/common';
    import { ScheduledTasksConsumer } from'./scheduled-tasks.consumer';
    import { ScheduledTasksEventsService } from'./scheduled-tasks-events.service';
    
    export const QueueConsumers: Provider[] = [
    	ScheduledTasksConsumer,
    	ScheduledTasksEventsService, // 添加
    }
    
数学建模论文智能评阅系统:从算法设计到工程实现 自动化评阅系统是教育技术领域的重要应用,其核心原理在于将主观评价标准转化为可计算的客观指标,通过自然语言处理、文本相似度分析等算法实现智能化处理。这类系统的技术价值在于显著提升评阅效率与一致性,尤其适用于处理大量非结构化文档的场景,如学术论文、竞赛作品评审。数学建模论文作为典型的综合性研究报告,其评价涉及模型构建、求解过程、写作规范等多维度分析,传统人工方式面临工作量大、标准不统一等挑战。因此,构建一个融合算法分析与工程实践的智能评阅系统,能够有效辅助评委进行结构化评价与深度分析。本文聚焦于如何设计并实现这 阅读详情

相关推荐

AiToEarn 项目实战:搭建 AI 内容营销智能体平台,吃透架构、打通商业变现 (上篇)

本文深度解析开源项目 AiToEarn —— 一个覆盖全球10+主流平台的 AI 内容营销智能体平台。从系统架构、技术栈选型(Next.js + MongoDB + Redis)、四大核心 Agent 模块到 Docker 部署、MCP 协议集成、内容变现实战,全链路拆解 技术内幕。提供从零上手的5种使用方式、平台授权流程、AI 视频图文批量生成、自动化互动运营及 CPS/CPE/CPM 三种结算模式详解,助力创作者实现内容全自动商业化闭环。

program哲学 704

【nest】bull的基本使用

前言 这玩意用redis做队列的,nest教程写的有点乱,重新写一下。 https://github.com/OptimalBits/bull nest官网队列部分 nest中文官网队列部分 安装 $ npm install --save @nestjs/bull bull $ npm install --save-dev @types/bull 使用 本次demo制作一个接口进行增加队列,一个接口显示队列任务,一个接口可以暂停或者恢复队列,一个接口可以清空老队列。 实际上Processor那个相当

不忘初心,坚定道路! 4370

nestjs-bullmq:NestJS的BullMQ模块

NestJS BullMQ 目录 描述 将BullMQ与Nest集成 安装 npm install nestjs-bullmq bullmq 您也可以使用交互式CLI npx nestjs-modules 例子 BullMQModule.forRoot(选项,连接?) import { Module } from '@nestjs/common' ; import { BullMQModule } from 'nestjs-bullmq' ; import { AppController } from './app.controller' ; @ Module ( { imports : [ BullMQModule . forRoot ( { name : 'QueueName' , config : { // url: 'red

nest框架的bull队列的基本使用

@nestjs/bull是一个用于处理队列的Nest.js模块。它基于Bull库,提供了在Nest框架中使用队列的功能,这个模块要跟redis联合起来使用

qq_26112725的博客 1554

bull:Nest框架(node.js)的Bull模块

一个渐进式的框架,用于构建高效且可扩展的服务器端应用程序。 描述 模块。 安装 $ npm i --save @nestjs/bull bull $ npm i --save-dev @types/bull 快速开始 支持 Nest是MIT许可的开源项目。 得益于赞助商和出色支持者的支持,它可以发展壮大。 如果您想加入他们,请。 人 作者 维护者和 网站-https: 执照 Nest已。

UMI刷盘机器人代码实战:从SLAM到Diffusion Policy的完整部署流程

本文详细解析了UMI(Universal Manipulation Interface)刷盘机器人从数据准备到真实部署的完整实战流程。通过SLAM处理视频数据生成三维轨迹,并训练Diffusion Policy模型,最终将策略部署到UR5机械臂与WSG50夹爪上,实现从模仿学习到物理执行的闭环。

weixin_29042035的博客 462

从监控到优化:Bull队列生态系统的全方位工具链指南

作为Node.js生态中最受欢迎的分布式任务队列解决方案,Bull凭借其基于Redis的高性能设计,已成为处理异步任务的首选工具。但在生产环境中,仅依靠核心库往往无法满足复杂的监控、调试和优化需求。本文将系统介绍Bull生态系统中的第三方工具链,帮助运营和开发人员构建可视化、可观测、可扩展的任务处理系统。 ## 生态系统概览:工具矩阵与应用场景 Bull的生态系统围绕核心队列功能形成了完整的工...

gitblog_00557的博客 699

AI智能体安全沙箱agentguard:为LLM代码执行筑起防火墙

在AI应用开发领域,大语言模型(LLM)驱动的智能体(Agent)能够自动生成并执行代码,极大地提升了自动化能力。然而,赋予AI直接执行系统命令的权限也带来了显著的安全风险,如恶意代码注入、敏感数据泄露和系统资源滥用。为了解决这一核心矛盾,安全沙箱技术应运而生,它通过在不可信代码与宿主系统之间建立隔离层,实现"默认拒绝、最小权限"的安全原则。agentguard项目正是这一理念的工程实践,它结合白名单机制与容器化隔离,为AI智能体提供了可配置、可审计的安全执行环境。该方案不仅适用于内部自动化工具开发,也为构

weixin_28695537的博客 298

基于NestJS与LangChain构建智能体驱动的自动化任务系统

在软件开发中,定时任务(Cron Job)是处理周期性后台作业的经典方案,它通过在预设时间点触发固定操作序列来执行数据同步、报表生成等任务。其核心原理是基于时间调度器执行预定义脚本。然而,随着业务复杂度提升,传统定时任务在应对动态数据抓取、条件触发工作流和自适应运维等场景时显得力不从心,其静态、固化的执行模式难以满足动态决策需求。这催生了智能体(Agent)技术的应用价值,智能体能够感知环境、进行逻辑判断并执行行动,从而实现更灵活、自适应的自动化。结合NestJS的模块化架构与依赖注入能力,以及LangCh

weixin_30606461的博客 380

STM32外围电路硬件解析

复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.上电复位(上电的时候需要复位) 复位方式: 1.上电复位: --- 一定要有 MCU的Reset是复位引脚,当这个引脚为低电平时,

qq_39577221的博客 1万+

slam_toolbox 简介和使用

专为移动机器人在未知环境中实时构建地图和定位设计。它适用于2D和3D环境,支持多种机器人平台和传感器配置。

weixin_74808846的博客 3307

Agentic Plugin Marketplace 的 backend-architect 智能体:可复用的后端系统与 API 架构设计专家

> 本文面向希望在 Claude Code、Codex、Cursor、OpenCode、Antigravity 与 Copilot 等 Agent 环境中按需调用"后端架构师"能力的开发者,系统拆解 `api-scaffolding` 插件中 `backend-architect` 智能体的能力边界、职责编排与响应规范。读完本文,你将掌握如何利用这一专家 Agent 完成从 REST/GraphQ

gitblog_00746的博客 228

宜搭,高级认证实操2,FaaS连接器指导教程

找到FaasEntry.java将如下代码整体替换,注意引包。如图所示在util下新建EDSUtil.java代码如下。回到连接器界面点击右上角测试-->测试。连接器工厂-->新建FaaS连接器。保存-->前往云IDE开发。返回如图所示代码,部署成功。

2301_80286061的博客 3343

agents24 后端系统架构 Agent 全解析:backend-architect 的可扩展 API 设计与微服务架构能力手册

> 本文深度剖析多 Harness Agent 插件市场中 `backend-development` 插件内置的 **backend-architect** 专用 Agent:从其在 [plugins/backend-development/agents/backend-architect.md](https://link.gitcode.com/i/777cf8087cc82b29695731

gitblog_00992的博客 611

用74LS194和555定时器DIY流水灯:一个经典的数字电路课程设计复盘(附Multisim仿真文件)

本文详细介绍了使用74LS194移位寄存器和555定时器搭建八路彩灯控制器的完整过程,包括硬件选型、电路设计、调试技巧及常见问题解决方案。作为经典的数字电路课程设计,该项目涵盖了EDA工具应用、电路原理图设计和Multisim仿真等核心技能,适合电子工程学习者实践参考。

weixin_29185199的博客 428

Protege新手入门:5分钟搞定本体建模基础(附实战案例)

本文为Protege本体建模新手提供了一份快速入门指南。通过构建一个关于“披萨”的实战案例,详细讲解了从环境准备、定义核心类(Classes)、建立对象属性(Object Properties)到设置数据属性(Data Properties)和创建个体的完整流程。文章旨在帮助读者绕过复杂理论,在5分钟内直观掌握本体建模的基础操作,快速建立知识图谱构建的信心。

weixin_28335283的博客 285

data-engineering 插件 backend-architect Agent 深度解析:数据领域可扩展 API、微服务与事件驱动架构设计

本技术指南以仓库插件 [data-engineering](https://link.gitcode.com/i/ec6abc26b7ef726f24a8906702c58acd) 中 [backend-architect Agent 定义文件](https://link.gitcode.com/i/ae09456ddf782b2a62c1122b9716a19b) 为骨架,系统讲解该"数据后端架

gitblog_01155的博客 928

FISCO BCOS平台的用户权限控制与分类管理

在区块链技术日益广泛应用的今天,如何管理与控制不同用户的权限,确保系统的安全性与高效性,成为了区块链平台不可忽视的一部分。FISCO BCOS作为一款高效的联盟链平台,通过细粒度的权限控制机制,提供了对不同用户权限的有效管理。本文将深入探讨FISCO BCOS如何实现用户的权限控制,并对不同用户进行分类与权限管理。FISCO BCOS平台通过精密的权限控制机制,不仅提供了对用户表和系统表的细粒度权限管理,还通过工具与接口为开发者和管理员提供了便捷的权限配置与查询功能。

2201_75798391的博客 1062

agents24 多平台应用插件中的后端架构师 Agent:从 API 契约设计到可观测性架构的完整能力解析

本文聚焦于 agents24 仓库中 `multi-platform-apps` 插件内的 [backend-architect.md](https://link.gitcode.com/i/1a73221b8c6e229f1d5177dbd2d53a94) 智能体定义,系统解析这位"后端系统架构师"的核心能力图谱、行为准则与工作流定位。该 Agent 专精于可扩展 API 设计、微服务架构与分布

gitblog_00668的博客 174

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据科学家技能树:从SQL查询到机器学习建模的完整能力图谱(含10段Python实战)

本文系统化梳理 IT 开发者从"码农"到"超能力者"的完整技能树,覆盖基础层(思维+工具)、核心层(语言+架构+算法)、进阶层(框架+数据库+调试)、高阶层(分布式+性能+安全)、大师层(领导力+影响力+终身学习)共 **5 大层级 20+ 关键能力**,并附 **10+ 段可运行 Python 代码**、**6 张能力对比表**、**6 个常见误区 FAQ**、**21 天修炼计划**与**5 篇精选参考文献**。无论你是刚入门的编程新手、迷茫的初中级工程师,还是寻求突破的高级开发者,都能从本文获得清晰的

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 246

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

装修竣工交付数字化:从工地进度到电子报告的系统实现

工程交付管理正从纸质签字走向数字化协同,其背后核心是项目管理软件对流程的标准化与透明化。将施工进度、验收清单、影像留痕和整改任务纳入统一平台,通过RESTful API与批量任务调度,实现从开工交底到竣工报告的系统化管控。这种方案不仅帮助装修公司降低沟通成本,也让业主随时掌握工地动态,最终在交付现场生成可追溯的电子竣工报告。本文从数字化交付的概念与原理出发,结合实际工程落地,设计了一套轻量级家装SaaS系统,覆盖节点验收自动提醒、报告批量生成、售后质保跟踪等典型场景,为工程交付SaaS产品与内部管理系统的建

weixin_30047059的博客 298

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

探索 NestJS + Bull:强大的任务队列处理解决方案

是一个由 [NestJS](https://nestjs.com/) 提供支持的、基于 [Bull](https://github.com/OptimalBits/bull) 的任务队列处理库。它允许开发者在 Node.js 应用程序中创建、管理和处理复杂的后台作业,如批量数据处理、定时任务或异步操作。通过将这些耗时的操作放在队列中,你可以优化应用程序的性能并确保关键业务逻辑的可靠性。 ## 技

gitblog_00047的博客 1081

NestJS Bull 项目教程

NestJS Bull 项目的目录结构遵循典型的 NestJS 应用程序结构,并添加了与 Bull 队列管理相关的特定文件和目录。以下是主要目录和文件的介绍: ``` /src ├── app.module.ts ├── main.ts ├── config │ └── bull-config.ts ├── queues │ ├── create-user.que

gitblog_01082的博客 491

NestJS Bull 和 BullMQ 模块:高效、可扩展的后端应用框架

NestJS 是一个基于 Node.js 的渐进式框架,专为构建高效且可扩展的服务器端应用程序而设计。NestJS Bull 和 BullMQ 模块是其生态系统中的重要组成部分,提供了对 Bull 和 BullMQ 队列管理包的集成支持。这些模块使得开发者能够轻松地在 NestJS 应用中实现任务队列和消息处理,从而提高应用的性能和可维护性。 ## 项目技术分析 NestJS Bull 和 B

gitblog_01104的博客 1633

基于nest框架的redis streams实现mq(bullmq)

队列是一种强大的设计模式,可以帮助您处理常见的应用程序扩展和性能挑战。队列可以帮助您解决的一些问题示例如下:(1)平滑处理峰。例如,如果用户可以在任意时间启动资源密集型任务,则可以将这些任务添加到队列中,而不是同步执行它们。然后,您可以让工作进程以受控的方式从队列中提取任务。随着应用程序的扩展,您可以轻松地添加新的Queue消费者来扩展后端任务处理。(2)分解单体任务,否则可能会阻塞Node.js事件循环。

qq_43457850的博客 2020

Nestjs的专属队列:BullMQ

BullMQ 是一个基于 Redis 的后台任务处理库,实现了快速且健壮的队列系统。Nestjs 官方推荐使用 BullMQ,并为集成提供了包。

weixin_65964507的博客 791
上一篇: Nestjs框架: nestjs-schedule模块中的三类定时任务
下一篇: Nestjs框架: NestJS项目数据库迁移与版本控制实践指南
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值