RabbitMQ: Topic Exchange 的积分微服务和工程要点

【Java 微服务中间件】RabbitMQ 全方位解析:同步异步对比、SpringAMQT基础入门、实战、交换机类型及消息处理详解 文档全面解析 RabbitMQ,涵盖同步异步对比、基础入门、Java 实战、交换机类型、队列交换机声明及消息转换器等内容,为 RabbitMQ 学习与应用提供指导。 阅读详情

Topic Exchange 核心机制回顾


RabbitMQ 的 Topic Exchange 通过 routingKey 和通配规则实现消息路由,关键规则如下:

  1. 全匹配规则:当 routingKey 与 bindingKey 完全一致时直接转发(与 Direct Exchange 相同)。
  2. # 规则:bindingKey 中的 # 匹配任意数量单词(例如 order.# 匹配 order.reward、order.payment 等)。
  3. * 规则:bindingKey 中的 * 匹配单个单词(例如 order.* 匹配 order.reward 但不匹配 order.reward.point)。

路由示例:

  • Exchange:drink
  • Binding:drink.# → 队列 Q1,drink.*.cold → 队列 Q2
  • 消息 drink.coffee 路由到 Q1,drink.tea.cold 路由到 Q1 和 Q2。

积分微服务业务流程分析


系统交互流程:

  1. 订单微服务收到结算微服务的完成消息(含 settlementId)。
  2. 订单状态更新为 SETTLEMENT_CONFIRMED(结算已确认)。
  3. 向积分微服务发送消息,触发积分计算。
  4. 积分微服务处理完成后,回调订单微服务更新状态为 ORDER_CREATED(订单完成)。

关键状态机:

订单状态流:  
PAID → DELIVERY_CONFIRMED → SETTLEMENT_CONFIRMED → ORDER_CREATED  

订单微服务消息发送实现(NestJS)


当订单状态变为 SETTLEMENT_CONFIRMED 时,发送积分消息:

// order.service.ts  
import { Inject, Injectable } from '@nestjs/common';  
import { RabbitMQService } from '@golevelup/nestjs-rabbitmq';  
 
@Injectable()  
export class OrderService {  
  constructor(private readonly rmqService: RabbitMQService) {}  
 
  async handleSettlementConfirmed(settlementData: SettlementDTO) {  
    // 1. 更新订单状态  
    const order = await this.orderRepo.updateStatus(  
      settlementData.orderId,  
      OrderStatus.SETTLEMENT_CONFIRMED  
    );  
 
    // 2. 发送积分消息(使用 Topic Exchange)  
    await this.rmqService.publish('exchange.order.reward', 'reward.calculate', {  
      orderId: order.id,  
      amount: order.totalAmount, // 积分 = 订单金额(1元=1积分)  
    });  
  }  
}  

RabbitMQ 配置:

// rabbitmq.module.ts  
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';  
 
@Module({  
  imports: [  
    RabbitMQModule.forRoot(RabbitMQModule, {  
      exchanges: [  
        {  
          name: 'exchange.order.reward',  
          type: 'topic', // 指定 Topic 类型  
        },  
      ],  
      uri: 'amqp://localhost:5672',  
    }),  
  ],  
})  
export class RabbitMQConfigModule {}  

积分微服务实现


1 ) 数据库与消息监听

数据库实体:

// reward.entity.ts  
@Entity()  
export class Reward {  
  @PrimaryGeneratedColumn()  
  id: number;  
 
  @Column()  
  orderId: string;  
 
  @Column()  
  amount: number; // 积分数量  
 
  @Column({ type: 'enum', enum: RewardStatus })  
  status: RewardStatus; // SUCCESS 或 FAILED  
}  
 
// 枚举定义  
export enum RewardStatus {  
  SUCCESS = 'SUCCESS',  
  FAILED = 'FAILED',  
}  

消息监听与处理:

// reward.service.ts  
import { RabbitRPC } from '@golevelup/nestjs-rabbitmq';  
 
@Injectable()  
export class RewardService {  
  constructor(private rewardRepo: Repository<Reward>) {}  
 
  @RabbitRPC({  
    exchange: 'exchange.order.reward',  
    routingKey: 'reward.calculate',  
    queue: 'queue.reward',  
  })  
  async handleRewardCalculation(msg: { orderId: string; amount: number }) {  
    try {  
      // 1. 创建积分记录  
      const reward = this.rewardRepo.create({  
        orderId: msg.orderId,  
        amount: msg.amount,  
        status: RewardStatus.SUCCESS,  
      });  
      await this.rewardRepo.save(reward);  
 
      // 2. 回调订单微服务  
      return {  
        rewardId: reward.id,  
        status: 'SUCCESS',  
      };  
    } catch (error) {  
      return { status: 'FAILED' };  
    }  
  }  
}  

2 ) 队列绑定配置

// reward.module.ts  
@Module({  
  imports: [  
    RabbitMQModule.registerAsync({  
      useFactory: () => ({  
        uri: 'amqp://localhost:5672',  
        exchanges: [{ name: 'exchange.order.reward', type: 'topic' }],  
        channels: {  
          'channel-1': {  
            prefetchCount: 1,  
            default: true,  
          },  
        },  
        queues: [  
          {  
            name: 'queue.reward',  
            exchange: 'exchange.order.reward',  
            routingKey: 'reward.#', // 绑定所有 reward 开头的路由键  
          },  
        ],  
      }),  
    }),  
  ],  
})  
export class RewardModule {}  

调试与问题排查


关键断点验证:

  1. 订单微服务:

    • 确认收到结算消息后状态更新为 SETTLEMENT_CONFIRMED
    • 检查发送的积分消息路由键为 reward.calculate
  2. 积分微服务:

    • 监听 queue.reward 并解析消息内容
    • 确保数据库生成积分记录后回调 rewardId

常见问题:

  • 消息丢失:检查 Exchange 和 Queue 的绑定关系(reward.# 需匹配 reward.calculate)。
  • 回调失败:在订单微服务中验证 rewardId 是否成功接收:
    // 订单微服务回调处理  
    if (rewardResponse.status === 'SUCCESS') {  
      order.status = OrderStatus.ORDER_CREATED;  
      order.rewardId = rewardResponse.rewardId; // 存储积分记录ID  
    }  
    

消息可靠性保障机制深度解析


核心问题与解决方案全链路拆解

1 )生产者端可靠性风险及应对策略

  1. 消息投递不确定性

    • 问题本质:生产者发送消息后,无法确认 RabbitMQ Broker 是否成功接收。若网络中断或 Broker 宕机,消息将永久丢失。
    • 解决方案:生产者确认机制(Publisher Confirms)
      • Broker 接收消息后发送 basic.ack 回执
      • 未收到回执时可触发重发或告警
  2. 路由失效风险

    • 问题本质:使用 Topic/Direct 交换机时,若无匹配的 Binding Key,消息会被静默丢弃,生产消费双方均无感知。
    • 解决方案:消息返回机制(Mandatory Flag)
      // NestJS 生产者配置示例 
      import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
      
      await this.amqpConnection.publish('order_exchange', 'order.create', 
        { orderId: 123 }, 
        { mandatory: true } // 启用返回机制
      );
      
      // 注册返回监听器
      channel.on('return', (msg) => {
        console.error(`消息路由失败: ${msg.content.toString()}`);
      });
      

2 )消费者端可靠性保障体系

  1. 消费端过载防护

    • 风险场景:突发流量导致消费者资源耗尽,引发服务雪崩。
    • 解决方案:消费端限流(QoS Prefetch)
      # RabbitMQ 控制台命令 
      rabbitmqctl set_qos -p /vhost --prefetch-count 10 
      
      // NestJS 消费者配置
      @RabbitSubscribe({
        exchange: 'order_exchange',
        routingKey: 'order.*',
        queue: 'order_queue',
        queueOptions: {
          prefetchCount: 10 // 每次最多投递10条
        }
      })
      
  2. 异常处理机制

    • 风险场景:自动ACK模式下,消费者崩溃将导致消息永久丢失。
    • 解决方案:手动确认机制(Manual Acknowledgement)
      @RabbitHandler()
      async handleOrder(msg: {}, amqpMsg: ConsumeMessage) {
        try {
          await processOrder(msg);
          this.channel.ack(amqpMsg); // 显式确认
        } catch (e) {
          this.channel.nack(amqpMsg, false, true); // 消息重入队列
        }
      }
      

3 )队列级防护机制

  1. 消息积压防护

    • 风险场景:队列无限堆积导致 Broker 内存溢出。
    • 解决方案:消息TTL(Time-To-Live)
      // 声明队列时设置TTL
      await channel.assertQueue('order_queue', {
        messageTtl: 600000 // 10分钟过期
      });
      
  2. 死信队列(DLX)容灾设计

    • 核心价值:捕获过期/拒收消息,避免业务异常无感知。
    • 配置实现:
      # RabbitMQ 命令行配置
      rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"order_dlx"}' --apply-to queues 
      
      // NestJS 死信队列绑定 
      await channel.assertExchange('order_dlx', 'fanout');
      await channel.assertQueue('order_dlx_queue');
      await channel.bindQueue('order_dlx_queue', 'order_dlx', '#');
      

工程示例:1


1 ) RabbitMQ 部署与管理命令

启动 RabbitMQ 容器  
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management  
 
创建 Exchange(命令行工具)  
rabbitmqadmin declare exchange name=exchange.order.reward type=topic  
 
查看绑定关系  
rabbitmqadmin list bindings  

2 ) NestJS 微服务集成要点

依赖安装:

npm install @golevelup/nestjs-rabbitmq amqplib  

全局异常处理(确保消息重试):

// reward.controller.ts  
@Controller()  
export class RewardController {  
  @RabbitRPC({ /* ... */ })  
  async handleMessage(msg: any) {  
    try {  
      return await this.rewardService.handleRewardCalculation(msg);  
    } catch (error) {  
      // 记录日志并触发重试机制  
      throw new RpcException('REWARD_PROCESSING_FAILED');  
    }  
  }  
}  

消息持久化配置:

// RabbitMQ 模块配置  
Queues: [  
  {  
    name: 'queue.reward',  
    options: { durable: true }, // 持久化队列  
  },  
],  
PublishOptions: {  
  deliveryMode: 2, // 持久化消息  
},  

工程示例:2


1 ) 生产者端完整配置

// src/mq/producer.service.ts
import { Injectable } from '@nestjs/common';
import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class OrderProducer {
  constructor(private readonly amqpConnection: AmqpConnection) {}
 
  async publishOrder(orderData: object) {
    // 1. 启用生产者确认
    await this.amqpConnection.channel.assertExchange('order_exchange', 'topic', {
      durable: true,
      confirm: true // 开启确认模式 
    });
 
    // 2. 发送消息(启用Mandatory机制)
    return this.amqpConnection.publish(
      'order_exchange',
      'order.create',
      orderData,
      {
        mandatory: true,
        persistent: true // 消息持久化 
      }
    );
  }
}

2 ) 消费者端健壮实现

// src/mq/consumer.service.ts
import { RabbitRPC } from '@golevelup/nestjs-rabbitmq';
import { Injectable } from '@nestjs/common';
 
@Injectable()
export class OrderConsumer {
  private readonly MAX_RETRIES = 3;
 
  @RabbitRPC({
    exchange: 'order_exchange',
    routingKey: 'order.*',
    queue: 'order_queue',
    queueOptions: {
      deadLetterExchange: 'order_dlx', // 绑定死信交换机 
      messageTtl: 300000, // 5分钟TTL
    },
    prefetchCount: 5 // 消费端限流
  })
  async processOrder(msg: any, ctx) {
    const { channel, deliveryTag } = ctx;
 
    try {
      await this.validateOrder(msg);
      await this.saveOrder(msg);
      channel.ack(deliveryTag); // 手动ACK 
    } catch (error) {
      if (msg.retryCount < this.MAX_RETRIES) {
        msg.retryCount = (msg.retryCount || 0) + 1;
        // 重试延迟策略 
        channel.nack(deliveryTag, false, false); 
      } else {
        channel.reject(deliveryTag, false); // 转入死信队列 
      }
    }
  }
}

3 ) 死信队列监控处理

// src/mq/dlx.service.ts
import { RabbitSubscribe } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class DlqMonitor {
  @RabbitSubscribe({
    exchange: 'order_dlx',
    queue: 'order_dlx_queue'
  })
  async handleDeadLetter(msg: any) {
    // 1. 持久化异常消息 
    await this.logRepository.saveError(msg);
 
    // 2. 触发告警通知 
    this.alertService.notify({
      type: 'RABBITMQ_DLQ',
      data: msg 
    });
  }
}

4 ) 关键RabbitMQ运维命令

查看未确认消息 
rabbitmqctl list_queues name messages_unacknowledged
 
监控死信队列 
rabbitmqctl list_queue dead_letter_queue messages 
 
设置队列溢出行为(拒绝新消息)
rabbitmqctl set_policy overflow_policy ".*" '{"overflow":"reject-publish"}' --apply-to queues

开发规范与工程实践要点


1 ) 资源管理铁律

  • 线程/连接池化:使用 amqp-connection-manager 管理连接池
import { AmqpConnectionManager } from 'amqp-connection-manager';

const connection = AmqpConnectionManager.create({
  heartbeat: 30,
  connectionOptions: { maxChannels: 100 } // 通道池上限 
});
  1. 数据传输对象规范

    对象类型职责范围使用场景
    DTO服务间传输数据结构Controller入参/返回值
    Entity数据库持久化映射ORM模型定义
    VO前端交互数据结构HTTP响应体封装
  2. 开发效率工具链

    • IDEA高效操作:
      • Ctrl+Alt+L:代码格式化
      • Ctrl+Alt+V:提取局部变量
      • Ctrl+Shift+F:全局文本搜索
      • Ctrl+B:跳转到接口实现

总结


本文完整实现了基于 RabbitMQ Topic Exchange 的积分微服务,核心要点包括:

  1. 通配符路由机制:通过 # 和 * 实现灵活消息分发。
  2. 状态驱动流程:订单状态机控制微服务间协作时序。
  3. NestJS 最佳实践:
    • 使用 @golevelup/nestjs-rabbitmq 简化消息处理。
    • 实体映射与数据库操作(TypeORM)。
  4. 容错设计:消息持久化、异常重试、回调验证。

调试建议:

  • 使用 RabbitMQ Management UI(http://localhost:15672)监控消息流。
  • 通过 Postman 模拟订单创建请求,验证全链路状态变更。

消息中间件可靠性设计维度

  1. 传输保障维度
    • 生产者确认 → Broker接收确认
    • 消息路由保障 → 返回监听机制
  2. 消费稳定性维度
    • 限流控制 → prefetchCount参数
    • 异常恢复 → 手动ACK/NACK
  3. 系统抗压维度
    • 积压防御 → TTL+死信队列
    • 资源隔离 → 连接池/线程池

架构启示:RabbitMQ不仅是消息管道,更是具备完整业务状态机特性的可靠性中间件。通过组合使用确认机制、死信队列、延迟重试等模式,可构建从订单系统到物联网通信的全场景可靠消息架构,通过本实现,订单系统可扩展为松耦合的微服务架构,后续可轻松接入通知、数据分析等模块。

robomimic实验复现全流程:从数据集下载到训练视频生成 本文详细介绍了机器人模仿学习项目RoboMimic的完整实验复现流程。内容涵盖从使用Conda创建Python 3.8隔离环境、安装RoboSuite仿真器和MuJoCo物理引擎,到下载并探索数据集、配置与启动模型训练,最后进行模型评估和生成策略执行视频。该指南旨在帮助研究者和开发者高效搭建实战环境,规避常见问题,快速验证算法或应用于实际场景。 阅读详情

相关推荐

ICM42670-P嵌入式开发实战:从寄存器配置到姿态解算全解析

本文全面解析ICM42670-P高性能6轴MEMS运动传感器的嵌入式开发实战,涵盖寄存器配置、数据采集滤波、低功耗优化及姿态解算算法。通过详细代码示例和应用案例,帮助开发者快速掌握从硬件对接到姿态跟踪系统的完整开发流程,适用于可穿戴设备和智能家居等低功耗应用场景。

gold的博客 1071

Java-200 RabbitMQ 架构与 Exchange 路由:fanout/direct/topic/headers

Exchange → Binding → Queue → Consumer 的链路讲清消息如何被投递与为什么会“投递不到”。重点拆解四类交换器:fanout(广播)、direct(精确路由键匹配)、topic(通配符 * / # 的多段路由)、headers(基于消息头的多条件匹配),并给出工程侧高频踩坑与定位手法:路由键不匹配导致丢消息、未绑定队列导致无消费、广播导致消息倍增与吞吐下降、headers 规则复杂导致 CPU 压力。版本层面补齐 2025 的关键变化:经典镜像队列(Classic Mirro

谢谢你的喜欢 我们一起无限进步 1676

baostock实战:如何用Python批量下载多只股票的历史数据(含常见错误排查)

本文详细介绍了如何使用Python和baostock库批量下载多只股票的历史数据。内容涵盖从环境搭建、代码标准化到构建稳健的批量下载框架的全过程,并重点提供了高级错误处理、网络重试、数据验证及内存管理等实战解决方案,帮助用户高效构建股票数据处理流水线。

nice1的博客 1083

全网最全RabbitMQ笔记 | 万字长文爆肝RabbitMQ基础

本文基于黑马程序员2023版RabbitMQ教程,系统梳理了消息队列的核心知识体系。首先通过同步调用与异步调用的对比分析,指出同步通讯存在的拓展性差、性能下降、级联失败等问题,进而引出异步通信的优势。随后介绍了RabbitMQ的基本概念、Docker安装方式及管理控制台功能,详细解析了生产者、消费者、队列等核心组件在消息队列架构中的角色定位。文章内容涵盖技术选型依据、异步调用实现原理、RabbitMQ特点等关键知识点,强调了解耦服务、提升性能、故障隔离等实际应用价值,为开发者构建高可靠分布式系统提供了实践指

qq_45832461的博客 1510

【操作系统】实验楼操作系统实验三——系统调用

操作系统实验3——系统调用 环境配置 ​ 首先同样是配置环境 cd /home/shiyanlou/oslab tar -zxvf hit-oslab-linux-20110823.tar.gz -C /home/shiyanlou 实验步骤 添加函数声明 cd ~/oslab/linux-0.11/include/linux gedit sys.h //添加内容: extern int sys_whoami(); extern int sys_iam(); fn_ptr_sys_call_table

qq_46612803的博客 6359

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 305

RabbitMQ 入门篇总结(黑马微服务课day10)(包含黑马商城业务改造)

本文总结了RabbitMQ在微服务架构中的核心应用。首先对比了同步调用与异步调用(消息队列)的优缺点,指出异步调用能有效解耦服务、提高性能和可用性。接着详细介绍了RabbitMQ的基本组件和工作原理,包括生产者、消费者、队列、交换机等核心概念。文章还通过SpringAMQP示例演示了消息收发步骤,并讲解了消费者推送机制、Work模型、交换机类型等关键特性。最后以黑马商城业务为例,展示了如何将同步调用改造为异步消息队列模式,提升系统稳定性和扩展性。全文150字。

yyzytx5201314的博客 1367

EXCEL实现分层自定义比例随机抽样(图+文教程)

EXCEL实现分层自定义比例随机抽样(图+文教程) 单一字段分层自定义比例随机抽样 多字段分层自定义比例随机抽样 单一字段分层自定义比例随机抽样 首先数据源如下,我们想随机抽张三的金额数据10%、李四金额20%、王五5%、哈哈15%、李六10% 首先第一步,添加辅助列,随机数 =RAND() 对数据进行高级排序 升序、降序都可以 添加辅助列...

可乐联盟 2万+

RabbitMQ快速入门

多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定BindingKey的时候使用通配符!

weixin_62286800的博客 1060

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 234

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

从零开始学 RabbitMQ:小白也能懂的消息队列实战指南

本文面向编程零基础读者,用通俗语言+分步实操带你彻底搞懂 RabbitMQ 是什么、为什么用、怎么装、怎么写代码发消息收消息,以及如何在真实项目中安全可靠地使用它。含完整 Spring Boot 集成 Demo 和避坑指南。

qq5621的博客 593

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8529

RabbitMQ

介绍 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展 性、高可用性等方面表现不俗。 端口号:15672 账密:guest 具体特点包括:(远不止这些) 可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。 消息确认(需要开启):MQ将消息发送给消费者,MQ并没有将消息删除,MQ把这条消息锁定,消息消费者用完这条消息之后,消费者会给M

梦想是很难很难的,所以先勇敢一点 946

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度学习工具包 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】RabbitMQ的核心概念与七大工作模式

在现代分布式系统和微服务架构中,消息队列(Message Queue) 是解决服务间通信、系统解耦和流量削峰的关键技术之一。而 RabbitMQ 作为一款开源的消息中间件,凭借其高可靠性、灵活性和易用性,成为开发者最常用的工具之一。 MQ (Message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是消息 (message) 而已。消息可以非常简单,比如只包含文本字符串,JSON 等,也可以很复杂,比如内嵌对象。MQ多用于分布式系统之间的通信。

2302_79806056的博客 1759

IEM模型,地表粗糙度模拟

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

从零开始学 RabbitMQ:编程小白也能懂的消息队列实战指南

本文面向零基础开发者,用通俗语言+分阶段实操,带你彻底搞懂 RabbitMQ 是什么、怎么装、怎么写代码发消息、怎么保证可靠传输,最后还能对比 Kafka 做技术选型。附完整 Spring Boot Demo!

qq5621的博客 316

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RabbitMQ入门

ActiveMQ:基于JMS,java语言实现,万级数据吞吐量,处理速度ms级,主从架构,成熟度高ZeroMQ:基于C语言开发RabbitMQ: erlang语言实现,万级数据吞吐量,处理速度us级,主从架构,RocketMQ: 基于AMQP协议,erlang语言开发,稳定性好,java语言实现,十万级数据吞吐量,处理速度ms级,分布式架构,功能强大,扩展性强kafka: scala语言实现,十万级数据吞吐量,处理速度ms级,分布式架构,功能较少,应用于大数据较多RocketMQ。

jinying_51eqhappy的博客 486

RabbitMQ讲解-基础篇

上面讲解中都是直接通过可视化界面来定义队列、交换机,并实现绑定但实际使用中肯定是要用代码来实现的,这就对应两种方式:通过配置文件对应三个类Queue:声明队列Exchange:声明交换机Binding:声明队列和交换机的绑定关系// 定义广播交换机@Bean// 定义路由交换机@Bean// 定义主题交换机@Bean// 定义队列@Bean// 绑定队列到广播交换机(通过参数绑定)@Bean// 绑定队列到路由交换机(通过参数绑定)@Bean。

weixin_74399364的博客 1135

RabbitMQ详细使用教程

RabbitMQ是一款高性能的异步通讯组件,支持同步和异步两种通讯方式。同步通讯需等待返回结果,实时性高但拓展性差;异步通讯无需等待,吞吐量高但时效性差。RabbitMQ架构包含生产者、交换机、队列和消费者,通过Virtual Host实现数据隔离。安装RabbitMQ需搭配Erlang环境,启动后可通过管理后台插件进行配置。消息消费采用ACK确认机制,确保消息处理完成后再删除,提高可靠性。相比其他MQ(如Kafka、RocketMQ),RabbitMQ以高可靠性和功能完善著称,适合中小型业务系统。异步调用

weixin_45616758的博客 424

零基础入门 RabbitMQ:从消息队列是什么到 Spring Boot 实战收发消息

本文面向编程小白,用通俗语言讲透 RabbitMQ 是什么、为什么用、怎么装、怎么写代码,手把手带你用 Spring Boot 快速实现消息发送与消费,涵盖安装踩坑、核心概念图解、完整可运行 Demo、交换机/队列原理、以及技术选型对比。

qq5621的博客 296

rabbitMQ基础与发布/订阅模型

本文介绍了RabbitMQ消息队列的核心概念与应用场景,包括系统解耦、异步处理、流量削峰等典型使用场景。详细讲解了RabbitMQ的安装配置方法,并通过Python代码示例展示了生产者和消费者的基础实现。重点分析了消息确认机制(ACK)和持久化设置,确保消息可靠传递。文章强调在实际开发中需要根据业务需求合理选择消息队列,避免过度设计,同时注意处理幂等性和数据一致性等问题。

weixin_52185313的博客 635

RabbitMQ 基础篇:从零开始掌握消息队列核心概念

虚拟主机,起到数据隔离的作用(类似 MySQL 的 database);publisher:消息发送者;consumer:消息的消费者;queue:队列,用于存储消息;exchange:交换机,负责路由消息。publisher 把消息发给 exchange,exchange 按规则路由到一个或多个 queue,最后由 consumer 消费。每个 VirtualHost 是一个独立的小型 RabbitMQ 实例。

weixin_42927227的博客 929

Rabbit MQ 入门学习

本文全面介绍了RabbitMQ消息队列的核心概念与应用。重点讲解了RabbitMQ的四大核心组件(生产者/消费者/队列/交换机)及其协作关系。详细阐述了三种常用交换机模式(Fanout/Direct/Topic)的工作原理和应用场景,给出SpringBoot整合RabbitMQ的完整配置示例。并针对消息可靠性问题,从生产者确认机制、Broker持久化策略到消费者ACK机制进行多维度保障方案设计,特别强调了幂等性处理的重要性。最后通过死信队列机制实现延时消息功能,为异步消息处理提供完整解决方案。

m0_70325779的博客 366

SpringBoot系列12:整合RabbitMQ消息队列,异步解耦、死信队列完整业务案例

本文介绍了SpringBoot整合RabbitMQ的实战指南,包含核心概念、生产级配置、四大交换机场景实现以及可靠性保障方案。主要内容包括: RabbitMQ核心价值:异步解耦、流量削峰、事件驱动、延时任务四大生产场景 核心组件详解:生产者、消费者、交换机、队列等概念 SpringBoot生产级配置:持久化、确认机制、重试策略、序列化优化 四大交换机实战:Direct直连、Topic主题、Fanout广播、Headers匹配 消息可靠性方案:确认机制、退回机制、持久化、消费者重试 生产避坑指南:重复消费、消

深耕 Java 后端与企业级软件架构设计,专注微服务、分布式系统、大模型 AI 应用架构落地。 334

RabbitMQ学习自用笔记

publisher发送消息后,exchange就根据配好的规则,路由转发消息给queue,consumer则在queue中获取到消息。因为rabbitMQ的性能很好,所以有时候是多个项目一同使用,这个时候为了放置交换机或队列冲突,就用一个虚拟注解virtual-host将每个项目的交换机和队列隔离开来,相当于mysql中database的功能。

xxyxxxqqq的博客 930
上一篇: RabbitMQ: 订单→餐厅→骑手→结算的消息驱动架构设计
下一篇: 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、付费专栏及课程。

余额充值