RabbitMQ:高效消息处理与资源管理实践

【RabbitMQ】什么是RabbitMQ?RabbitMQ有什么用?应用场景有那些? RabbitMQ简称MQ是一套实现了高级消息队列协议的开源消息代理软件,简单来说就是一个消息中间件。是一种程序对程序的通信方法。 阅读详情

NestJS 与 RabbitMQ 的高级集成


在分布式系统中,消息队列是实现服务解耦和异步通信的核心组件。RabbitMQ 作为主流消息代理,其原生 API 较为底层,需手动管理连接、通道及资源声明。NestJS 生态系统通过 @golevelup/nestjs-rabbitmq 等库提供高级抽象,显著简化开发流程。现深入剖析以下核心能力:

  1. 异步消息监听容器:自动管理线程池与消息回调
  2. RabbitMQ 模板(RabbitMQTemplate):简化消息收发逻辑
  3. 管理接口(RabbitMQAdmin):声明式管理交换机/队列/绑定
  4. 配置模块(ConfigModule):集中化连接与资源配置

关键优势:避免手动处理 Channel 生命周期、连接池优化、声明式资源管理,提升代码可维护性。

使用 RabbitMQAdmin 实现声明式资源管理


1 ) 问题背景

原始方案直接在业务代码中声明 RabbitMQ 资源(队列/交换机/绑定),导致业务逻辑与基础设施代码高度耦合:

// 旧方案:业务代码混杂资源声明 
class OrderMessageService {
  async handleMessage() {
    const channel = await connection.createChannel();
    await channel.assertExchange("order_exchange", "direct"); // 入侵业务逻辑 
    await processOrders(); // 真实业务逻辑
  }
}

重构方案:RabbitMQAdmin 声明式管理
通过 RabbitMQAdmin 将资源声明移至独立配置层:

// rabbitmq.config.ts 
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
 
@Module({
  imports: [
    RabbitMQModule.forRootAsync(RabbitMQModule, {
      useFactory: () => ({
        exchanges: [
          { 
            name: 'order_exchange', 
            type: 'direct', 
            options: { durable: true } // 持久化交换机 
          },
          { 
            name: 'delivery_exchange', 
            type: 'fanout',
            options: { durable: false } // 非持久化
          }
        ],
        queues: [
          { 
            name: 'order_queue', 
            options: { durable: true } 
          },
          { 
            name: 'delivery_queue', 
            options: { exclusive: true } // 独占队列 
          }
        ],
        bindings: [
          {
            exchange: 'order_exchange',
            target: 'order_queue',
            routingKey: 'order.create' // 路由键绑定 
          },
          {
            exchange: 'delivery_exchange',
            target: 'delivery_queue',
            routingKey: ''
          }
        ],
        uri: 'amqp://guest:guest@localhost:5672', // 连接配置 
      }),
    }),
  ],
})
export class RabbitMQConfigModule {}

核心操作方法与注意事项

方法作用使用建议
declareExchange()声明交换机✅ 生产环境必须配置持久化
declareQueue()声明队列✅ 明确队列特性(持久化/独占)
declareBinding()声明绑定关系✅ 路由键需与服务路由策略一致
deleteExchange()删除交换机❌ 禁止在生产代码调用
purgeQueue()清空队列❌ 仅限开发环境调试

关键原则:

  1. 生产环境仅使用声明方法(declare*),删除/清空操作由运维通过管控台执行
  2. 通过 RabbitMQModule 配置自动初始化资源,避免手动调用 API
  3. 绑定关系需与业务路由策略严格匹配(如 order.* 通配符匹配多路由)

工程示例:三种 NestJS-RabbitMQ 集成方案


1 ) 方案 1:基础生产者-消费者模型

// order.producer.ts 
import { RabbitRPC } from '@golevelup/nestjs-rabbitmq';
 
@Controller()
export class OrderProducer {
  constructor(private readonly rabbitmqService: RabbitMQService) {}
 
  @Post('orders')
  async createOrder() {
    await this.rabbitmqService.publish('order_exchange', 'order.create', {
      id: uuidv4(),
      amount: 100.0,
    });
  }
}
 
// order.consumer.ts
@Controller()
export class OrderConsumer {
  @RabbitSubscribe({
    exchange: 'order_exchange',
    routingKey: 'order.create',
    queue: 'order_queue',
    queueOptions: { durable: true },
  })
  async handleOrderCreated(msg: { id: string; amount: number }) {
    await saveOrderToDB(msg); // 业务处理 
  }
}

2 ) 方案 2:RPC 模式(请求-响应)

// payment.service.ts
@Injectable()
export class PaymentService {
  @RabbitRPC({
    exchange: 'payment_exchange',
    routingKey: 'payment.process',
    queue: 'payment_queue',
  })
  async processPayment(msg: PaymentRequest) {
    const result = await chargeCreditCard(msg.amount);
    return { success: result.status === 'charged' }; // 自动返回响应 
  }
}
 
// order.service.ts
class OrderService {
  async confirmOrder(orderId: string) {
    const response = await this.rabbitmqService.request<PaymentResponse>({
      exchange: 'payment_exchange',
      routingKey: 'payment.process',
      payload: { orderId, amount: 100.0 },
    });
    if (response.success) updateOrderStatus(orderId, 'confirmed');
  }
}

方案 3:死信队列(DLQ)实现容错

// rabbitmq.config.ts
RabbitMQModule.forRootAsync({
  useFactory: () => ({
    queues: [
      {
        name: 'order_queue',
        options: {
          durable: true,
          deadLetterExchange: 'dlx_exchange', // 死信交换机
          deadLetterRoutingKey: 'failed.orders', 
          messageTtl: 60000, // 消息 60 秒超时
        },
      },
      {
        name: 'dead_letter_queue',
        options: { durable: true },
      },
    ],
    bindings: [
      {
        exchange: 'dlx_exchange',
        target: 'dead_letter_queue',
        routingKey: 'failed.#', // 通配符匹配所有失败路由 
      },
    ],
  }),
})
 
// dlq.handler.ts 
@RabbitSubscribe({
  exchange: 'dlx_exchange',
  routingKey: 'failed.orders',
  queue: 'dead_letter_queue',
})
async handleFailedOrders(msg: any, headers: Record<string, any>) {
  await sendAlert(`Order processing failed: ${msg.orderId}`); // 告警
  logFailedAttempt(headers.xDeathCount); // 记录失败次数
}

关键配置与运维实践


  1. 连接管理与性能优化
// 高级连接配置
RabbitMQModule.forRootAsync({
  useFactory: () => ({
    uri: 'amqp://guest:guest@rabbitmq-host:5672/vhost1',
    connectionInitOptions: { wait: false }, // 非阻塞启动 
    connectionManagerOptions: {
      heartbeatIntervalInSeconds: 60, // 心跳间隔 
      reconnectTimeInSeconds: 5,      // 重连间隔 
    },
    channels: {
      default: { prefetchCount: 50 }, // 通道预取数量 
      transactional: { transactional: true } // 事务通道 
    }
  }),
})
  1. 消息序列化与拦截器
// 自定义序列化(支持 Protobuf/JSON)
@Injectable()
class ProtobufSerializer implements Serializer {
  serialize(value: any): Buffer {
    return PaymentMessage.encode(value).finish(); 
  }
}
 
// 全局消息拦截器 
@Injectable()
class LoggingInterceptor implements RabbitHandlerInterceptor {
  beforeHandle(context: HandlerContext) {
    log(`Received message: ${context.message}`);
  }
}
 
// 模块注册
RabbitMQModule.forRootAsync({
  serializers: [ProtobufSerializer],
  interceptors: [LoggingInterceptor],
})
  1. 健康检查与监控集成
RabbitMQ 管控台命令
rabbitmqctl list_queues name messages_ready # 查看队列积压
rabbitmqctl node_health_check                # 节点健康检查 
// NestJS 健康检查模块 
import { HealthCheckService, HealthCheck } from '@nestjs/terminus';
 
@Controller('health')
export class HealthController {
  constructor(
    private health: HealthCheckService,
    private rabbitmqHealth: RabbitMQHealthIndicator,
  ) {}
 
  @Get()
  @HealthCheck()
  check() {
    return this.health.check([
      () => this.rabbitmqHealth.pingCheck('rabbitmq'),
    ]);
  }
}

常见问题与解决方案


  1. 连接初始化失败
  • 错误现象:Authentication Failure 或 Connection Refused
  • 排查步骤:
    1. 验证 uri 格式:amqp://{user}:{pass}@{host}:{port}/{vhost}
    2. 检查 RabbitMQ 日志:tail -f /var/log/rabbitmq/rabbit@localhost.log
    3. 确认防火墙开放端口:5672(AMQP)和 15672(管控台)
  1. 消息堆积(Consumer 滞后)
  • 优化策略:
    • 增加消费者数量:调整 prefetchCount(默认为 1)
      @RabbitSubscribe({ queueOptions: { prefetchCount: 20 } })
      
    • 启用多通道并行:
      channels: { 
        channel1: { prefetchCount: 10 },
        channel2: { prefetchCount: 10 }
      }
      
    • 动态扩缩容:结合 Kubernetes HPA 基于队列长度自动伸缩
  1. 消息丢失防护
  • 保障机制:
    • 生产者确认模式(Publisher Confirms):
      publish('exchange', 'routingKey', msg, { confirm: true });
      
    • 消息持久化:
      publish(..., { persistent: true }); // 消息持久化 
      queues: [{ options: { durable: true } }] // 队列持久化 
      
    • 事务支持(性能损耗较大):
      withTransaction((channel) => {
        channel.publish(...);
        channel.publish(...);
      });
      

结语

通过 NestJS 的声明式集成方案,开发者能够:

  1. 解耦基础设施与业务代码 - 通过 RabbitMQAdmin 集中管理资源
  2. 提升消息处理效率 - 异步监听容器自动优化线程池与并发
  3. 降低运维复杂度 - 配置驱动连接管理/序列化/容错机制
  4. 强化可观测性 - 深度集成健康检查与监控

最佳实践建议:

  • 生产环境启用消息持久化 + 生产者确认
  • 使用 DLQ 处理异常消息避免阻塞主流程
  • 通过 prefetchCount 平衡吞吐量与系统负载

流程:生产者 → RabbitMQ Exchange → 绑定队列 → 消费者微服务集群

RabbitMQ性能调优:关键技术、技巧与最佳实践 按需选择持久化:仅在必要时启用消息和队列持久化,避免过度写入磁盘。横向扩展优先:通过集群扩展处理能力,而非过度提升单节点配置。动态调整参数:基于实时监控数据调整、内存阈值等参数。定期维护:清理无用队列,避免元数据膨胀;定期检查集群分区风险。 阅读详情

相关推荐

RabbitMQ消息堆积导致服务崩溃的急救手册:三步止血法+根治方案

凌晨3点,RabbitMQ队列飙到100万条,服务直接瘫痪!”——这是某电商平台技术负责人上周的真实经历。消息堆积引发的雪崩效应,轻则业务卡顿,重则数据丢失。今天这篇实战指南,手把手教你从。:你经历过最惨烈的消息堆积事故是什么?:关注博主并私信“MQ急救包”,免费领取《RabbitMQ高可用配置模板》+《清队列脚本合集》!消息堆积不是技术问题,而是资源管理问题。,让崩溃的MQ服务快速“起死回生”!止血只是权宜之计,根治需从。

m0_57948571的博客 1700

rabbitMQ的详细介绍

rabbitMQ的详细介绍

wang20010104的博客 7万+

RabbitMQ在Golang中的高效应用:消息队列最佳实践

在分布式系统架构中,消息队列作为异步通信的核心组件,承担着解耦服务、削峰填谷、异步处理的重要角色。RabbitMQ作为开源消息中间件的代表,以其强大的路由能力、灵活的协议支持和生态兼容性被广泛应用。Golang(简称Go)凭借高效的并发模型、简洁的语法和原生支持高性能网络IO的优势,成为构建RabbitMQ客户端的理想选择。本文聚焦RabbitMQ在Go语言环境中的工程化实践,涵盖核心概念解析、协议适配、性能优化、异常处理、实战案例等完整技术链路。

AI Agent Harness Engineering 1454

【RabbitMQ】MQ的基本概念、RabbitMQ简介及安装

本文涉及MQ的基本概念、RabbitMQ简介、RabbitMQ的安装等内容

十八岁讨厌编程的博客 2万+

大数据系统优化:RabbitMQ连接池配置

在大数据系统中,消息队列作为关键组件承担着解耦、缓冲和异步通信的重要职责。RabbitMQ作为最流行的开源消息代理之一,其性能直接影响整个系统的吞吐量和响应时间。理解RabbitMQ连接管理机制掌握连接池配置的核心参数实现高性能、高可用的消息处理系统避免常见的连接管理陷阱首先介绍RabbitMQ和连接池的基本原理然后详细分析连接池的核心配置参数接着提供实际的代码实现和优化示例最后讨论实际应用场景和最佳实践RabbitMQ:开源消息代理软件,实现了高级消息队列协议(AMQP)

2502_91592937的博客 452

C#与RabbitMQ实现消息传递的简单示例

在RabbitMQ中,消息由字节流组成。在C#中发送消息之前,我们需要定义消息内容。通常,我们将消息体序列化为字节数组或字符串,以便通过网络传输。

weixin_29138345的博客 1460

RabbitMQ介绍以及基本使用

消息队列是一种用于在分布式系统中进行通信的技术。它是一种存储和转发消息的中间件,可以用于将应用程序之间的通信解耦,从而实现高效的异步通信。消息队列允许发送者将消息发送到队列中,而接收者则可以从队列中获取消息并进行处理。这种方式可以帮助系统实现高可用性、高性能、松耦合和可伸缩性。消息队列通常包括生产者(发送消息的应用程序)、消费者(接收消息的应用程序)和队列(存储消息的缓冲区)。RabbitMQ:是由erlang语言开发,基于AMQP(高级消息队列协议)协议实现的一种消息队列。市面上还有很多消息队列,比如Ka

qq_40950398的博客 2万+

别让IO口保护二极管坑了你!实测讲解单片机电流倒灌的三种典型症状与防护

本文深入解析单片机电流倒灌的三大典型症状与防护方案,重点分析STM32等单片机在ADC采样异常、系统假死和通信速率异常中的表现。通过实测数据和电路设计建议,提供从基础二极管隔离到专业隔离器件的分级防护策略,帮助工程师有效预防和解决电流倒灌问题。

weixin_29280219的博客 348

RabbitMQ详解

1.1 什么是MQ MQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。 1.2 MQ有哪些 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka

1万+

Foxglove 介绍以及入门使用教程

Foxglove 是由Foxglove 工作室开发的一套工具集,包括和等组件。跨平台支持:可以在 Windows、macOS 和 Linux 上运行。多协议兼容:支持 ROS、ROS 2、CAN 数据以及其他自定义协议。丰富的可视化功能:可以绘制点云、轨迹、激光雷达数据、IMU 数据等。实时与离线模式:既可以实时监控机器人状态,也可以加载和回放记录的数据文件。Foxglove 的 3D 视图允许你以三维方式查看机器人的运动轨迹、传感器数据和其他几何信息。你可以旋转、缩放和平移视图以获得更好的观察角度。

zolty 1万+

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

RabbitMQ批量消息处理实战指南:提高系统吞吐量的终极技巧

RabbitMQ作为企业级消息中间件,在**批量消息处理**和**提高系统吞吐量**方面有着卓越表现。本指南将为您揭示如何通过批量处理技术大幅提升消息处理效率。🚀 ## 🔥 批量消息处理的核心优势 **批量消息处理**能够显著减少网络开销和系统调用次数。通过将多条消息合并为一次操作,系统吞吐量可提升3-5倍!RabbitMQ提供了多种批量处理机制,让您的应用性能得到质的飞跃。 ## 📊

gitblog_07096的博客 956

SIwave:在 SIwave 中释放计算频率扫描的强大功能

AEDT 的电路工具允许注入正确的电压和电流。要使用电路工具,SIwave 必须首先使用 PI 求解器求解结构的 S 参数。

jkh920184196的博客 1479

接收rabbitmq消息

修改连接参数自定义消息处理修改// 示例:解析JSON消息// System.out.println("收到订单: " + json.getString("orderId"));// 你的实际业务逻辑配置调整修改调整预取数量修改basicNack的requeue参数控制是否重新入队添加交换机绑定逻辑(如果需要)手动消息确认公平分发(QoS设置)连接和通道的异常处理资源清理优雅关闭机制如果需要处理更复杂的场景(如多个队列、消息持久化、死信队列等),可以在和。

qq_37533306的博客 878

Yakit实战:利用验证码识别插件突破Webfuzzer自动化测试瓶颈

本文详细介绍了如何利用Yakit的Webfuzzer模块结合验证码识别插件,突破自动化安全测试中的验证码瓶颈。通过实战演示,讲解了如何部署本地OCR服务、编写热加载脚本,实现从获取验证码到自动识别并替换的全流程自动化,从而让Webfuzzer能够高效、无人值守地进行大规模密码喷洒等测试。

weixin_29323493的博客 284

ABAP 7.40 新语法介绍系列之六:使用 FILTER 关键字对 ABAP 内表进行过滤

笔者之前写过的关于 ABAP 740 新语法的文章:本文介绍另一个新的关键字:FILTER.FILTER 是 ABAP 740 中引入的一个关键字,用于简化数据操作,它能够将内部表(Internal Table)中的数据按特定的条件进行过滤,并生成一个新的内部表。FILTER 的引入旨在使代码更加现代化和高效,尤其是在面对大量数据需要过滤的情况下。传统上,开发人员可能需要使用 LOOP AT 结合条件判断来实现,但使用 FILTER 关键字后,代码显得更加简洁且易于维护。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1176

windows下RabbitMQ的使用(1)——下载与安装

RabbitMQ是一款基于AMQP协议的开源消息队列中间件,采用Erlang语言开发。本文首先介绍了RabbitMQ的核心组件(生产者、交换机、队列、消费者等)及其工作流程,并详细阐述了其高可靠性、灵活路由等特性。随后提供了Windows环境下Erlang和RabbitMQ的完整安装指南,包括下载地址、安装步骤和环境变量配置方法。安装完成后,可通过任务管理器验证RabbitMQ服务是否正常运行。该消息队列适用于分布式系统中的异步通信、应用解耦、流量削峰等场景。

城南蝈蝈 2611

学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真

本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时

xiaoheshang_123的博客 168

RabbitMQ 匿名队列详解

匿名队列是一种特殊的临时队列,在消息传递过程中有着独特的用途,匿名队列也被称为临时队列,它没有固定的名称,其名称由RabbitMQ服务器自动生成,一般是类似 amq.gen-xxxxxxxxxxxx 的随机字符串。一旦消费者与队列的连接断开,该队列会自动被删除。当只需要临时接收少量消息时,使用匿名队列可以避免手动管理队列的生命周期。

青灯文案的博客 1325

K8s(十二):监控与报警(163邮箱+钉钉)-Prometheus + Grafana + Alertmanager(超详细)

🔴 K8s(十二):监控与报警(163邮箱+钉钉)-Prometheus + Grafana + Alertmanager(超详细)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

04 RabbitMQ进阶2之集群和延迟投递

目录 Pt2 集群与高可用 Pt2.1 普通集群模式 Pt2.2 镜像队列模式 Pt3 Spring AMQP使用 Pt3.1 Spring RabbitMQ (1) 代码案例 (2) 核心对象 Pt3.2 SpringBoot RabbitMQ (1) 代码案例 (2) 参数说明 Pt4 使用规范 Pt4.1 资源管理 Pt4.2 命名规范 Pt4.3 消息持久化 Pt4.4 连接数控制 Pt5 延迟投递实现 Pt5.1 基于死信队列 Pt5.2 基于延迟插件 Pt5

Java是世界上最好的语言 1696

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

rabbitmq实战系列4--springboot整合rabbitmq实现限流与并发

tytui

zisuu的博客 1279

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ACE Framework:构建100%本地化自主认知实体的技术实践指南

在当今AI技术快速发展的时代,如何构建既智能又安全的自主系统成为开发者面临的核心挑战。ACE Framework(Autonomous Cognitive Entities)作为一个100%本地化开源框架,为开发者提供了构建自主认知实体的完整解决方案。本文将深入探讨ACE Framework的核心功能、技术架构和实际应用,帮助您快速掌握这一强大的自主代理开发工具。 ## 为什么需要自主认知实体框

gitblog_00512的博客 657

rabbitmq 学习 之 队列和消息ttl 设置(15)

RabbitMQ allows you to set TTL (time to live) for both messages and queues. This can be done usingoptional queue argumentsorpolicies(the latter option is recommended). 从队列维度设置消息超时时间: Message...

xiaoliuliu2050的专栏 1340

RabbitMQ面试精讲 Day 24:消费者限流与批量处理

今天我们深入学习了RabbitMQ中消费者限流与批量处理的核心机制。消费者限流通过实现,基于信用机制控制消息推送节奏。批量处理可显著提升吞吐,但需防范重复消费与内存风险。生产实践中应结合手动ACK、幂等设计、合理预取值来保障可靠性与性能。面试中需能清晰阐述原理、权衡利弊,并给出可落地的解决方案。异常处理与重试机制,讲解如何构建健壮的消息消费流程,敬请期待!

在未来等你的专栏 1370

RabbitMQ - 资源控制与流控机制:防止消费者过载与内存爆炸

RabbitMQ 资源控制与流控机制摘要 RabbitMQ作为分布式系统的核心消息中间件,其稳定性直接影响整个系统的可靠性。本文深入探讨了RabbitMQ的资源控制与流控机制,重点解决以下关键问题: 流控触发条件:当内存使用超过40%阈值或磁盘空间不足时,RabbitMQ会主动限制消息流入,保护系统稳定。 QoS机制:通过设置prefetch count控制消费者拉取速率,防止消费者过载。Java示例展示了如何实现单条消息确认模式。 监控与配置:详细介绍了内存和磁盘阈值的查看与调整方法,以及流控触发后的系统

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: RabbitMQ: 消息监听机制深度解析之从 SimpleMessageListenerContainer 到工程实现
下一篇: RabbitMQ: 高级特性实战优化和经验小结
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值