RabbitMQ: 消息交换机制的核心原理与实践指南之基于 AMQP 协议的系统设计与工程实现

十年架构师一篇带你读懂 RabbitMQ——核心知识点详解 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。 阅读详情

AMQP 协议架构的核心地位


AMQP(Advanced Message Queuing Protocol)协议直接定义了 RabbitMQ 的内部结构与外部行为。其重要性体现在三方面:

  1. 协议标准化:AMQP 是 RabbitMQ 的底层基础,使用 RabbitMQ 本质上是应用 AMQP 协议规范。
  2. 跨平台兼容性:该协议被多种消息中间件(如 ActiveMQ、Qpid)支持,掌握后可举一反三适配其他消息系统。
  3. 解耦设计:生产者无需感知消费者或队列的存在,仅需与交换机交互,实现系统松耦合。

关键细节:AMQP 模型包含四个核心组件——生产者(Producer)、交换机(Exchange)、队列(Queue)、消费者(Consumer)。协议通过二进制帧格式保证高效传输,支持事务、确认机制等高级特性。

消息流转的核心流程

消息流转必须遵循 AMQP 的固定路径,流程如下(参考下图):

  1. 生产者发送消息:

    • 通过 Connection 建立与 RabbitMQ 的连接,在 Channel 上发布消息。

    • 消息仅发送至交换机(Exchange),而非直接投递队列或消费者。

    • 生产者完全无需知晓后端队列配置或消费者状态。

      建立
      发布消息
      路由规则
      生产者
      Connection
      Channel
      Exchange
      队列

      核心约束:生产者禁止直连队列,必须通过Exchange转发消息。生产者仅需知道:

      • 目标交换机名称
      • 消息路由键(Routing Key)
      • 消息负载内容
  2. 交换机路由消息:

    • 交换机根据 绑定规则(Binding) 和 路由键(Routing Key) 将消息转发至目标队列。
    • 路由逻辑由交换机类型(Direct/Topic/Fanout/Headers)决定。
  3. 消费者消费消息:

  • 消费者通过 Connection 从队列主动拉取(Pull)或被动接收(Push)消息。
  • 队列是消息的临时存储容器,确保消息不丢失。
  • 消费者通过Connection建立的Channel从队列主动拉取消息,完全无需感知交换机存在

技术要点:若生产者直接发送消息至队列,将破坏 AMQP 的解耦设计,导致系统扩展性下降。路由键(如 order.created)是交换机转发决策的核心依据。

设计本质:消息路由决策权完全由交换机类型+绑定规则控制,实现生产消费彻底解耦

交换机和队列的合理配置原则


1 ) 交换机设计规范

  • 数量控制:同一业务域(如订单系统)使用单一交换机,避免过度分散(如 20+ 交换机)。
  • 类型选择:
    类型适用场景风险提示
    Direct1:1 精确路由(如支付通知)灵活性低
    Topic多模式匹配(如日志分类)通配符易混淆(* 单词, # 多级)
    Fanout广播(如新闻推送)无法过滤消息

2 ) 队列设计规范

  • 微服务对齐:一个微服务监听一个队列,或一个业务模块监听独立队列。
  • 异常处理:若单个微服务监听超 10 个队列,需检查:
    • 业务是否过度耦合? → 服务拆分必要(如拆分为订单服务、支付服务)。
    • 架构是否合理? → 引入 DDD(领域驱动设计)重构边界。

3 ) 自动化配置实践

  • 声明策略:
    • 交换机由生产/消费方双方声明,确保参数一致(如 durable=true)。
    • 队列仅由消费者声明,绑定关系在消费者端配置。
  • 参数冲突预防:重复声明时属性不一致将抛出异常(如 PRECONDITION_FAILED)。

系统设计黄金法则


  1. 交换机规划原则

    • 业务隔离:同类业务使用单交换机(如订单业务order_exchange)

    • 类型选择:

      场景交换机类型路由键示例
      精准投递Directorder.paid
      多条件匹配Topicstock.*.alert
      全量广播Fanout(无需路由键)
  2. 队列设计规范

    • 微服务边界:单个微服务最多监听1-3个队列
      • 若需监听超5个队列,表明服务需拆分为更小颗粒度*
    • 队列声明方:由消息接收方声明队列,避免生产者耦合下游拓扑
  3. Topic模式风险防控
    使用*(单词)和#(多级)通配符时需严格验证:

    # 错误示例:误用通配符导致消息丢失 
    queue_bind queue=alerts exchange=sys_exchange routing_key="*.critical.#" 
    

工程示例:1


1 ) 方案 1:Direct 交换机实现订单支付通知

// order.service.ts (生产者)
import { Injectable } from '@nestjs/common';
import { ConnectRabbitMQ } from '@nestjs/microservices';
import { RabbitMQProducer } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class OrderService {
  constructor(private readonly producer: RabbitMQProducer) {}
 
  async createOrder() {
    await this.producer.publish('order_exchange', 'order.created', {
      orderId: '123',
      amount: 100,
    });
  }
}
 
// payment.consumer.ts (消费者)
import { RabbitSubscribe } from '@golevelup/nestjs-rabbitmq';
import { Controller } from '@nestjs/common';
 
@Controller()
export class PaymentConsumer {
  @RabbitSubscribe({
    exchange: 'order_exchange',
    routingKey: 'order.created',
    queue: 'payment_queue',
    createQueueIfNotExists: true,
    queueOptions: { durable: true },
  })
  async handleOrderCreated(msg: { orderId: string }) {
    console.log(`Processing payment for order ${msg.orderId}`);
  }
}

2 ) 方案 2:Topic 交换机实现日志分级路由

// logger.service.ts (生产者)
async sendLog(level: string, message: string) {
  await this.producer.publish('logs_exchange', `log.${level}`, { message });
}
 
// error.consumer.ts (消费者)
@RabbitSubscribe({
  exchange: 'logs_exchange',
  routingKey: 'log.error',
  queue: 'error_logs_queue',
})
handleErrorLog(msg: { message: string }) {
  // 存储错误日志到数据库
}
 
// debug.consumer.ts (消费者)
@RabbitSubscribe({
  exchange: 'logs_exchange',
  routingKey: 'log.*',  // 匹配 log.debug, log.info 等
  queue: 'debug_logs_queue',
})
handleDebugLog(msg: { message: string }) {
  // 输出到控制台
}

3 ) 方案 3:Fanout 交换机实现广播消息

// news.service.ts (生产者)
async broadcastNews() {
  await this.producer.publish('news_exchange', '', { 
    title: '重要更新', 
    content: '...' 
  });
}
 
// email.consumer.ts & sms.consumer.ts (多消费者)
@RabbitSubscribe({ exchange: 'news_exchange', queue: 'email_queue' })
sendEmailNotification(msg) { /* ... */ }
 
@RabbitSubscribe({ exchange: 'news_exchange', queue: 'sms_queue' })
sendSMSNotification(msg) { /* ... */ }

工程示例:2


基于NestJS的RabbitMQ实现与多方位配置方案

以下提供三种完整工程方案,使用NestJS框架实现RabbitMQ集成。方案覆盖交换机声明、队列绑定、消息生产和消费,并补充RabbitMQ周边配置(如Docker部署、管理命令)。

代码基于@nestjs/microservices和amqplib包,确保精准性。所有方案均包含完整import语句,并解释关键术语(如Connection、Channel),以对初学者友好。

1 ) 方案1: Direct Exchange实现精确路由
适用场景:消息需精确路由至特定队列(如订单状态更新)。

import { Controller, Injectable } from '@nestjs/common';
import { RabbitMQModule } from '@nestjs/microservices';
import * as amqp from 'amqplib';
 
// 配置RabbitMQ连接
@Injectable()
export class RabbitMQConfig {
  static createOptions() {
    return {
      transport: RabbitMQModule.RMQTransport,
      options: {
        urls: ['amqp://localhost:5672'],
        queue: 'order_queue',
        exchange: 'order_exchange',
        exchangeType: 'direct', // 交换机类型:direct
        routingKey: 'order.update', // 路由键精确匹配
        persistent: true, // 消息持久化 
      },
    };
  }
}
 
// 生产者服务
@Controller()
export class ProducerService {
  constructor(private readonly rmqConfig: RabbitMQConfig) {}
 
  async sendMessage(message: string) {
    const conn = await amqp.connect('amqp://localhost:5672');
    const channel = await conn.createChannel();
    await channel.assertExchange('order_exchange', 'direct', { durable: true });
    channel.publish('order_exchange', 'order.update', Buffer.from(message), { persistent: true });
    console.log(`Sent: ${message}`);
    await channel.close();
    await conn.close();
  }
}
 
// 消费者服务
@Injectable()
export class ConsumerService {
  constructor(private readonly rmqConfig: RabbitMQConfig) {}
 
  async startConsumer() {
    const conn = await amqp.connect('amqp://localhost:5672');
    const channel = await conn.createChannel();
    await channel.assertExchange('order_exchange', 'direct', { durable: true });
    await channel.assertQueue('order_queue', { durable: true });
    await channel.bindQueue('order_queue', 'order_exchange', 'order.update');
    channel.consume('order_queue', (msg) => {
      if (msg) {
        console.log(`Received: ${msg.content.toString()}`);
        channel.ack(msg);
      }
    });
  }
}

周边配置处理:

  • RabbitMQ命令:
    • 创建交换机:rabbitmqadmin declare exchange name=order_exchange type=direct durable=true
    • 绑定队列:rabbitmqadmin declare binding source=order_exchange destination=order_queue routing_key=order.update
  • Docker部署:docker run -d --name rabbitmq -p 5672:5672 rabbitmq:3-management
  • 监控:启用RabbitMQ Management Plugin(rabbitmq-plugins enable rabbitmq_management),通过http://localhost:15672访问。

2 ) 方案2: Topic Exchange实现通配符路由
适用场景:动态路由消息(如日志分级处理)。

import { Controller, Injectable } from '@nestjs/common';
import { RabbitMQModule } from '@nestjs/microservices';
import * as amqp from 'amqplib';
 
@Injectable()
export class RabbitMQConfig {
  static createOptions() {
    return {
      transport: RabbitMQModule.RMQTransport,
      options: {
        urls: ['amqp://localhost:5672'],
        queue: 'log_queue',
        exchange: 'log_exchange',
        exchangeType: 'topic', // 交换机类型:topic
        routingKey: 'log.#', // 路由键通配符(#匹配多级)
      },
    };
  }
}
 
// 生产者示例
@Controller()
export class ProducerService {
  async sendLog(level: string, message: string) {
    const conn = await amqp.connect('amqp://localhost:5672');
    const channel = await conn.createChannel();
    await channel.assertExchange('log_exchange', 'topic', { durable: true });
    const routingKey = `log.${level}`;
    channel.publish('log_exchange', routingKey, Buffer.from(message));
    console.log(`Log sent with key ${routingKey}`);
  }
}
 
// 消费者示例
@Injectable()
export class ConsumerService {
  async startConsumer() {
    const conn = await amqp.connect('amqp://localhost:5672');
    const channel = await conn.createChannel();
    await channel.assertExchange('log_exchange', 'topic', { durable: true });
    await channel.assertQueue('log_queue', { durable: true });
    await channel.bindQueue('log_queue', 'log_exchange', 'log.*'); // * 匹配单级
    channel.consume('log_queue', (msg) => {
      if (msg) {
        console.log(`Log received: ${msg.fields.routingKey} - ${msg.content.toString()}`);
        channel.ack(msg);
      }
    });
  }
}

周边配置处理:

  • 参数一致性检查:使用rabbitmqadmin list exchanges验证交换机参数。
  • 错误处理:在代码中添加重试逻辑(如channel.on('error', ...))。

3 ) 方案3: Fanout Exchange实现广播消息
适用场景:消息广播至所有队列(如通知系统)。

import { Controller, Injectable } from '@nestjs/common';
import { RabbitMQModule } from '@nestjs/microservices';
import * as amqp from 'amqplib';
 
@Injectable()
export class RabbitMQConfig {
  static createOptions() {
    return {
      transport: RabbitMQModule.RMQTransport,
      options: {
        urls: ['amqp://localhost:5672'],
        exchange: 'notification_exchange',
        exchangeType: 'fanout', // 交换机类型:fanout(忽略路由键)
      },
    };
  }
}
 
// 生产者示例
@Controller()
export class ProducerService {
  async broadcastNotification(message: string) {
    const conn = await amqp.connect('amqp://localhost:5672');
    const channel = await conn.createChannel();
    await channel.assertExchange('notification_exchange', 'fanout', { durable: true });
    channel.publish('notification_exchange', '', Buffer.from(message)); // 路由键为空
    console.log('Notification broadcasted');
  }
}
 
// 消费者示例(多个队列绑定同一交换机)
@Injectable()
export class ConsumerService {
  async startConsumer(queueName: string) {
    const conn = await amqp.connect('amqp://localhost:5672');
    const channel = await conn.createChannel();
    await channel.assertExchange('notification_exchange', 'fanout', { durable: true });
    await channel.assertQueue(queueName, { durable: true });
    await channel.bindQueue(queueName, 'notification_exchange', ''); // 绑定无需路由键 
    channel.consume(queueName, (msg) => {
      if (msg) {
        console.log(`${queueName} received: ${msg.content.toString()}`);
        channel.ack(msg);
      }
    });
  }
}

周边配置处理:

  • 资源清理:使用rabbitmqadmin delete exchange name=notification_exchange删除无用交换机。
  • 高可用:配置RabbitMQ集群(rabbitmqctl join_cluster rabbit@node1)。

工程示例:3


1 ) 方案1:标准声明式绑定(推荐)

// payment.module.ts
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
 
@Module({
  imports: [
    RabbitMQModule.forRootAsync(RabbitMQModule, {
      useFactory: () => ({
        uri: process.env.RABBITMQ_URI,
        exchanges: [
          { 
            name: 'payment_exchange', 
            type: 'direct',
            options: { alternateExchange: 'payment_dlx' } // 死信交换机 
          }
        ],
        channels: {
          'payment-channel': { prefetchCount: 10 } // QoS控制
        }
      })
    }),
  ]
})
export class PaymentModule {}

2 ) 方案2:动态队列绑定

// inventory.service.ts
import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class InventoryService {
  constructor(private readonly amqp: AmqpConnection) {}
 
  async setupQueues() {
    // 动态声明延迟队列
    await this.amqp.channel.assertQueue('inventory_hold_queue', {
      durable: true,
      arguments: {
        'x-message-ttl': 600000, // 10分钟TTL
        'x-dead-letter-exchange': 'inventory_dlx' // 过期转死信 
      }
    });
 
    // 绑定到交换机
    await this.amqp.channel.bindQueue(
      'inventory_hold_queue', 
      'order_exchange', 
      'inventory.reserve.*'
    );
  }
}

3 ) 方案3:混合协议适配

// adapter/mq-adapter.ts 
import * as amqplib from 'amqplib';
 
export class HybridMQAdapter {
  private connection: amqplib.Connection;
 
  constructor(private readonly config: MqConfig) {}
 
  async connect() {
    this.connection = await amqplib.connect(this.config.uri);
    return this.connection.createChannel();
  }
 
  async setupDeadLetterFlow(channel: amqplib.Channel) {
    // 创建死信交换机和队列
    await channel.assertExchange('global_dlx', 'fanout', { durable: true });
    await channel.assertQueue('dead_letter_queue', { 
      deadLetterExchange: '',
      messageTtl: 86400000 
    });
    await channel.bindQueue('dead_letter_queue', 'global_dlx', '');
  }
}

周边配置全流程


  1. 连接管理:
    // main.ts
    import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
    
    RabbitMQModule.forRoot(RabbitMQModule, {
      exchanges: [{ name: 'order_exchange', type: 'direct' }],
      uri: 'amqp://user:password@localhost:5672',
      connectionInitOptions: { wait: true },
    });
    
  2. 错误处理:
    • 启用 mandatory 标志捕获路由失败消息。
    • 使用死信队列(DLX)处理未消费消息:
      # RabbitMQ CLI 声明死信交换机 
      rabbitmqctl declare_exchange dlx_exchange direct 
      rabbitmqctl declare_queue dlx_queue
      rabbitmqctl bind_queue dlx_queue dlx_exchange ""
      
  3. 运维命令:
    # 查看交换机列表 
    rabbitmqctl list_exchanges name type 
    
    # 监控队列状态 
    rabbitmqctl list_queues name messages_ready
    

Exchange机制设计原理解析


核心价值:

  1. 动态路由

    routingKey=user.created
    routingKey=order.*
    routingKey=*.alert
    生产者
    Exchange
    队列A
    队列B
    队列C

    通过路由键实现消息动态分发,无需修改生产者代码即可新增消费者

  2. 流量治理

    • 单交换机支持多路由策略(Direct/Topic/Fanout/Headers)
    • 通过绑定关系(Binding)实现消息复制广播(Fanout类型)
  3. 失败隔离
    配合Dead Letter Exchange(DLX)实现异常消息隔离:

    # 声明队列时附加死信配置
    rabbitmqctl declare queue name=payment_queue \
      arguments='{"x-dead-letter-exchange":"payment_dlx"}'
    

AMQP 设计 Exchange 机制的深层原因


优势分析:

  1. 解耦生产者与消费者:生产者无需感知消费者拓扑变化,新增消费者只需绑定队列。
  2. 灵活路由策略:通过交换机类型支持多播(Fanout)、主题匹配(Topic)等场景。
  3. 负载均衡:单队列多消费者实现轮询分发(Work Queue 模式)。

潜在缺点与改进:

  • 缺点:增加路由跳转,轻微性能损耗(可忽略)。
  • 改进方向:
    • 高频场景用 Direct 交换机减少匹配开销。
    • 使用 Headers 交换机替代 Topic 避免通配符复杂度。

初学者提示:Exchange 如同邮局分拣中心,队列是收件箱。邮递员(生产者)只需投递到分拣中心,无需知道收件人(消费者)地址。

自动化配置实践


配置铁律:交换机和队列参数必须跨服务一致,重复声明时参数冲突将引发异常

NestJS 配置模板:

// order.module.ts
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
 
@Module({
  imports: [
    RabbitMQModule.forRoot(RabbitMQModule, {
      exchanges: [
        {
          name: 'order_exchange', 
          type: 'topic', // 交换机类型
          options: { durable: true } // 持久化配置
        }
      ],
      uri: 'amqp://user:password@localhost:5672',
      connectionInitOptions: { wait: false }
    }),
  ],
  providers: [OrderService],
})
export class OrderModule {}
 
// 消费者声明队列
@Controller()
export class OrderProcessor {
  constructor(private readonly rmqService: RabbitMQService) {}
 
  @RabbitSubscribe({
    exchange: 'order_exchange',
    routingKey: 'order.created.#',
    queue: 'order_created_queue', // 接收方声明队列
    queueOptions: { durable: true, autoDelete: false }
  })
  async handleOrderCreated(msg: {}) {
    console.log('Received order:', msg);
  }
}

附录:关键运维命令


查看交换机绑定关系
rabbitmqctl list_bindings -p /vhost 
 
监控消息堆积 
rabbitmqctl list_queues name messages_ready
 
创建延迟队列(需插件)
rabbitmq-plugins enable rabbitmq_delayed_message_exchange 

通过上述设计,RabbitMQ在复杂业务路由、系统解耦、失败重试场景展现不可替代性,但需平衡架构复杂度与业务需求。

总结

RabbitMQ 消息交换的核心在于 AMQP 协议规范、路由解耦设计 及 自动化配置。
遵循交换机/队列精简原则,结合 NestJS 的声明式编程,可构建高可维护的微服务系统。

云计算学习笔记3——分布式通信 分布式通信主要研究分布式系统中不同构件(子系统或者进程)之间的信息交换机制: 远程过程调用(RPC) 消息队列 多播通信 一、远程过程调用(RPC) 概念 许多分布式系统是在进程间显示地进行消息交换,RPC即可简化这一通信过程。 RPC允许调用位于网络中其他机器上的进程。 机器A上进程调用机器B上进程时,A上进程被挂起,B上被调用进程开始执行,调用方可以通过参数将信息传递给被调用方,然后通过B上的进程返回的结果得到所需的信息。 RPC就是要像调用本地的函数一样去调用远程函数。 RPC过程中 阅读详情

相关推荐

利用 RabbitMQ 优化大数据领域的数据存储架构

在大数据时代,数据量呈现爆炸式增长,数据的存储和处理面临着巨大的挑战。传统的数据存储架构在面对高并发、海量数据时,往往会出现性能瓶颈、数据丢失等问题。本文章的目的是探讨如何利用 RabbitMQ 这一强大的消息队列中间件来优化大数据领域的数据存储架构,提高数据存储的效率、可靠性和可扩展性。文章的范围涵盖了 RabbitMQ 的基本原理、与大数据存储架构的结合方式、具体的实现步骤、实际应用场景以及相关的工具和资源推荐等方面。本文将按照以下结构进行组织:首先介绍相关的背景知识,包括大数据存储架构的现状和问题;

AI天才研究院 1684

AMQP(Advanced Message Queuing Protocol)是一种用于消息传递的开放标准协议

AMQP(Advanced Message Queuing Protocol)是一种用于消息传递的开放标准协议。它提供了一种可靠的、异步的、跨平台的通信机制,用于在分布式系统中传递和接收消息。AMQP支持多种消息模式,包括点对点、发布/订阅和请求/响应模式。在连接到Azure的Service Bus时,可以使用AMQP端口进行配置。

[Blog][Domain] programb.blog.youkuaiyun.com 963

兼容AMQP的RabbitMQ JavaScript客户端:支持事务与日志记录

本文还有配套的精品资源,点击获取 简介:RabbitMQ是一个广泛使用的开源消息代理,实现了AMQP协议,支持异步通信。'rabbitmq-connector'是一个JavaScript库,提供AMQP兼容性、简便的API接口、事务处理、日志记录,并易于在Node.js和浏览器环境中使用。开发者可以通过npm安装并利用其最佳实践构建高效、健壮的分布式应用。 1. ...

weixin_32324637的博客 1277

RabbitMQ使用amqp实现实时推送功能

访问http://localhost:15672/#/ 登录 guest guest

尽力漂亮的博客 3719

RabbitMQ与Erlang安装教程及深入概念解析

高级消息队列协议(Advanced Message Queuing Protocol, AMQP)是一种网络协议,专为消息传递应用而设计,支持跨平台、跨语言的消息交互。AMQP协议起源于金融行业,旨在解决不同系统之间消息传递的标准化问题。在AMQP出现之前,消息中间件产品的实现和消息格式都是私有的,不同厂商之间的产品难以互通,这使得企业用户在使用消息中间件时受到限制。随着开源运动的兴起和企业对于异构系统间通信需求的增长,AMQP作为开放标准协议,开始受到广泛关注。

weixin_31163455的博客 1292

Qt图表库三选一:Qwt、QChart、QCustomPlot实战性能对比与避坑指南

本文深入对比了Qt开发中三大主流图表库Qwt、QChart和QCustomPlot的性能与适用场景。通过实测数据展示各库在渲染效率、内存占用和功能特性上的差异,并提供针对不同项目需求的选型建议和集成避坑指南,帮助开发者高效选择最适合的Qt图表解决方案。

weixin_33691700的博客 450

RabbitMQ——AMQP协议

本篇博文将会对RabbitMQ的基本知识进行介绍。主要包括以下几点的知识介绍: AMQP协议介绍 RabbitMQ中常用的基本术语 RabbitMQ的工作流程介绍 RabbitMQ是消息传输的中间者,可以把它当做是一个消息代理,你把消息传送给它,它再把消息发送给具体的接收人。 这就像是邮局一样,你把邮件放入邮箱当中,邮件员会把邮件发送给你的收件人。不同的是RabbitMQ是接受,存储和转发二进制数据块——消息。 一、 AMQP协议 RabbitMQ是Advanced Message Queuing Pr

qq_25933249的博客 2534

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 276

Advanced Message Queuing Protocol (AMQP) 简介

 Advanced Message Queuing Protocol高级消息队列协议 AMQP是一个开放的互联网协议,专用于商业消息服务。AMQP工作组(目前包括思科、高盛、微软等15家公司)合作致力于制定一套消息基础架构(message infrastructure)规范,从而提供一种简单、但是很强大的方法,来连接企业内部或者企业间的消息独立的应用程序。英文原版协议(含草

CsdnPlayer的专栏 2140

本地服务器搭建Uptime Kuma网站监控服务

本文主要介绍如何在Linux系统中一键部署Uptime Kuma运维监控服务,并将这个服务映射至公网实现随时随地远程访问。如果您像我一样在服务器上托管了多个网站,并且没有足够的时间来手动检查每个网站的在线状态,那么当出现问题时,您可能无法及时收到通知来处理这些问题。因此,搭建一个在线监控服务是很有必要的,它可以在状态异常时提醒您,以便您能够及时处理问题,确保网站的稳定性和可用性。监控服务有很多,我最终选择了Uptime Kuma,因为Uptime Kuma是开源免费的,

Tiam_cr的博客 1826

MediaCodec视频解码流程详解及参考demo

本文主要讲解mediacodec的视频解码流程,及demo参考例子。

分享音视频技术 7877

RabbitMQ —— 理解及应用场景

RabbitMQ —— 理解及应用场景

小蜜蜂vs码农 3915

unity打包流程整理-Windows/Mac/Linux平台

1.Platform(平台)功能: 选择目标构建的目标平台选项PC, Mac & Linux Standalone: 适用于 Windows、Mac 和 Linux 平台2.Target Platform(目标平台)功能: 选择具体的操作系统版本选项Windows: 针对 Windows 操作系统Mac: 针对 macOS 操作系统Linux: 针对 Linux 操作系统3.Architecture(架构)功能: 选择应用程序的目标处理器架构选项x86: 针对 32 位系统。

weixin_42333247的博客 5141

RabbitMQ的核心组件有哪些?

RabbitMQ的核心组件有哪些?

java1234的博客 987

sklearn2pmml xgboost缺失值(missing)处理的坑

sklearn2pmml xgboost缺失值(missing)如何处理 今天同事在部署xgboost pmml模型时遇到了大坑,线上spark预测和本地python预测结果怎么都不对应,记录一下处理过程。 看了下同事的代码,貌似也没有问题 from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml fro...

Skycrab 8971

【HALCON工业视觉应用探索】10. C#+Halcon 3D视觉实战:点云处理与三维测量工业指南(附完整代码与实操案例)

摘要:本文聚焦C#+Halcon在3D视觉领域的工业应用,从新手友好的“基础3D检测系统”切入,逐步深入“汽车铸件三维测量”等工业级场景。内容涵盖核心概念(点云数据结构、3D采集原理、坐标系统)、完整技术流程(数据采集→预处理→特征提取→三维测量→结果可视化)、工业级代码实现(多视角点云融合、微缺陷检测、高精度尺寸测量),以及现场落地关键技巧(硬件选型、标定流程、抗干扰优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2006

物联网消息中间件选型全攻略(Kafka vs MQTT vs RabbitMQ)

掌握物联网的消息处理关键选型方法,对比Kafka、MQTT与RabbitMQ在高并发、低延迟和设备接入等场景的核心优势。详解适用架构与部署策略,助力构建高效稳定的消息中间件体系,值得收藏。

LearnFlow的博客 1245

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 117

RabbitMQ:Exchange的介绍和分析操作

1.声明 当前内容用于本人学习和分析,当前内容主要是Exchange的基本介绍 由于前面分析了AMQP协议,发现了其中的内容:消息发送者,exchange,bind,queue,消息消费者,由于生产者、消费者还有queue都是比较简单的,所以难点在于exchange和bind,这里主要讨论exchange 2.Exchange的主要作用 交换是发送消息的AMQP 0-9-1实体。交换接收一条消息并将其路由到零个或多个队列中。使用的路由算法取决于 交换类型和称为绑定的规则 主要作用:接收消息并通过路由算法实现

编程学习者的博客 1253

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

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

消息中间件(Message Queue)简介

消息队列简介 1:简介 Message Queue(MQ),消息队列中间件。很多人都说:MQ通过将消息的发送和接受分离来实现应用程序的异步和解耦,这给人的直觉是:MQ是异步的,用来解耦的,但是MQ这个只是效果而不是目的。MQ真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。 传统系统中两个模块之间通讯要么是HTTP,要么是自己开发的TCP,这两种协议都是原始的协议,实现起来很困难。 MQ定义了两个对象:发送数据的叫生产者,接受数据的叫消费者。它提供一个SDK让我们可以定义

Oasis 680

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RabbitMQ学习(一)——初识RabbitMQ

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

why191314的博客 270

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

分布式与主流消息中间件总览

分布式系统的发展经历了从单体架构到分布式架构的演进过程。单体架构将所有功能集成在一个进程中,随着业务增长,其扩展性和维护性逐渐成为瓶颈。为了解决这些问题,垂直应用架构和分布式架构应运而生。垂直应用架构将不同功能模块分离到不同的服务中,而分布式架构则进一步将服务分布到多个节点,通过网络通信实现协同工作。消息中间件(Message Queue,简称MQ)是分布式系统中实现异步通信的重要工具。它允许应用程序之间通过消息传递进行解耦,提高系统的灵活性和可扩展性。

Nicky's blog 1043

RabbitMQ(三):AMQP协议

因为RabbitMQ是一种遵循AMQP协议的分布式消息中间件,RabbitMQ实现的AMQP版本是0.9.1,所以在此处简单了解一下AMQP-0-9-1 协议。

dl_11的博客 3840

AMQP(Advanced Message Queuing Protocol)是一种提供统一消息服务的应用层标准协议

AMQP(Advanced Message Queuing Protocol)是一种提供统一消息服务的应用层标准协议,用于面向消息的中间件。AMQP协议设计为与平台无关,支持多种编程语言,通过交换机(Exchange)实现复杂的消息路由机制。

[Blog][Domain] programb.blog.youkuaiyun.com 1384

AMQP协议详解

AMQP协议详解

骑个小蜗牛的博客 2万+
上一篇: RabbitMQ: 全面安装与运维指南之从基础部署到高级配置
下一篇: RabbitMQ: 高并发外卖系统的微服务架构设计与工程实现
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、付费专栏及课程。

余额充值