RabbitMQ: 核心原理与异步消息系统实战:从高可用集群到分布式事务框架集成

深入解析AMQP 0-9-1协议:从核心原理到RabbitMQ生产环境实战 消息队列作为实现系统解耦、异步处理和流量削峰的核心中间件,其底层通信协议是保障可靠性的基石。AMQP(高级消息队列协议)作为开放标准,定义了生产者、消费者和代理服务器之间协同工作的完整模型。该协议采用分层架构,从底层的TCP连接、信道复用,到上层的交换机、队列和绑定模型,共同构建了可靠的消息传递机制。理解AMQP协议的分层设计和消息流转原理,对于解决生产环境中的消息可靠投递、重复消费和队列积压等高频问题至关重要。例如,通过协议层的手动确认机制和发布者确认模式,可以构建从生产到消费的可靠性闭环;而信道复用和Q 阅读详情

RabbitMQ 技术价值与学习必要性


随着分布式架构的普及,RabbitMQ 在后端系统的应用深度和复杂度显著提升。市场对精通消息中间件的人才需求迫切,其技术考察已超越基础消息收发,深入原理源码解析、性能调优策略及高并发场景设计

1 ) 核心定义

  • 消息中间件是提供软件间通信连接的中间层系统(非人机交互或软硬件交互层)
  • 消息本质是信息载体,通过生产者-消费者模式实现跨进程通信,类比微信消息传递机制
  • 消息中间件的本质 :提供软件间连接的中间件,负责传递信息载体(如微信连接人与人,RabbitMQ 连接微服务)

2 ) 同步调用架构痛点

用户下单
订单服务
商家服务
骑手服务
结算服务
积分服务
  • 阻塞式延迟:用户需等待完整调用链(4+服务)响应,体验卡顿
  • 级联故障:任意下游服务(如结算服务)宕机导致全链路失败
  • 木桶效应:系统吞吐量受制于最慢服务(如银行接口响应慢)

3 ) 异步线程方案的局限性

// 伪代码示例:线程池风险 
ExecutorService pool = Executors.newFixedThreadPool(50); // 线程数硬编码 
pool.submit(() -> {
  processOrder(); // 复杂业务可能阻塞线程
}); 
  • 资源耗尽风险:突发流量导致线程池爆满/OOM
  • 状态丢失:服务重启导致未完成线程中断
  • 调试困难:跨线程上下文追踪复杂

4 )同步调用 vs. 异步调用的业务痛点

通过“咖啡店订购”案例解析消息传递本质:

  • 同步调用问题(类比电话订购):

    • 业务链路过长 → 用户等待时间久(如订单服务需同步调用商家、骑手、结算服务)。
    • 单点故障导致全链路瘫痪:任一服务(如结算服务)宕机则订单失败。
    • 流量洪峰无缓冲:系统性能受制于最弱服务(木桶效应)。
  • 异步线程调用的局限:

    • 虽缩短用户等待时间,但引发新问题:
      • 线程池资源耗尽:大量订单线程堆积引发内存溢出(OOM)。
      • 长线程易丢失:微服务重启导致未完成业务中断(血泪教训!)。

5 ) 消息中间件架构的核心优势

引入 RabbitMQ 后的异步消息流程:

发送消息
推送消息
处理完成
回调消息
发送消息
处理完成
用户下单
订单服务
RabbitMQ
商家服务
骑手服务
...其他服务同理...
  • 核心优势:
    • 异步处理:服务发送消息后立即释放线程资源(无需阻塞等待)
    • 系统解耦:服务间通过消息通信,独立部署与扩容(如商家服务故障时,消息积压于 RabbitMQ 待恢复后处理)
    • 流量削峰:突发流量暂存消息队列,后端按能力消费
    • 最终一致性:消息持久化保证业务最终生效(如订单状态更新)
    • 消息广播/收集:支持一对多分发(日志告警)或多对一汇总(ELK 日志收集)

6 ) 知识落地困难:需通过实际项目迭代推动技术应用,例如:

  • 基础层:实现外卖系统订单下单流程
  • 进阶层:应用 RabbitMQ 高级特性(如消息持久化、Confirm 机制) 保障消息可靠性
  • 架构层:整合 Spring Boot 实现高可用集群部署与 Kubernetes 运维
  • 深度层:基于 Spring AMQP 手写分布式事务框架

7 ) 纵向认知不足:

多数学习者停留在 API 调用层面,缺乏对 Exchange 类型(Direct/Topic/Fanout) 及 RabbitMQ 协议栈的深度理解

8 ) 知识碎片化:通过四维度体系化解耦:

  • 实用维度:项目驱动即时实践
  • 深度维度:剖析事务框架与消息回溯机制
  • 平滑维度:渐进式架构迭代
  • 浅出维度:生活化案例解析消息中间件本质

关键提示:学习需 Java 与 Spring Boot 基础,核心在于通过项目迭代深化架构思维,避免畏难情绪,强化交流总结

RabbitMQ异步架构的核心优势


架构演进对比:

RabbitMQ架构
同步架构
HTTP
HTTP
消息
消息
消息
RabbitMQ
订单服务
商家服务
骑手服务
商家服务
订单服务
骑手服务

1 ) 关键能力突破

  • 异步削峰:消息积压RabbitMQ,下游服务按能力消费
  • 故障隔离:商家服务宕机不影响订单创建(消息持久化)
  • 资源解耦:无长线程占用,服务可随时重启/扩容

2 ) 消息传递范式

模式类比场景技术实现
点对点私聊消息Queue绑定单一Consumer
广播订阅微信群发Fanout Exchange
消息收集多人群汇报Direct Exchange + 多生产者
最终一致性异步转账通知持久化+ACK机制
  1. 微信红包的工程启示
  • 优先级策略:红包消息特殊UI → RabbitMQ x-priority参数
  • 回执确认:红包领取通知 → 消息ACK机制
  • 离线存储:微信消息暂存 → RabbitMQ持久化队列

消息中间件核心作用与技术本质


1 ) 消息中间件的定义

  • 消息本质:信息载体(如微信文字/红包),非抽象概念
  • 中间件本质:提供软件间连接的中间层服务(如微信连接用户与咖啡店),区别于操作系统(软件-硬件连接)或前端(人-软件连接)
  • 核心价值:解决同步调用痛点:
    用户下单
    订单服务
    同步调用商家服务
    同步调用骑手服务
    同步调用结算服务
    用户等待3-5秒

2 ) 同步调用缺陷

问题类型具体表现
用户等待时间长调用链过长(订单→商家→骑手→结算→积分),响应延迟高达秒级
系统脆弱性高任一服务(如结算服务)故障导致全链路瘫痪
流量峰谷无缓冲性能短板效应(如结算服务吞吐量低拖累全局)
异步线程隐患线程池溢出引发 OOM,长事务线程易被服务重启中断

3 ) RabbitMQ 异步方案优势

立即响应
发布消息
推送消息
处理完成
推送消息
处理完成
推送消息
用户下单
订单服务
RabbitMQ
商家服务
骑手服务
结算服务
  • 核心优势:

    • 业务解耦:服务宕机时消息暂存 Broker,故障恢复后继续处理
    • 流量削峰:突发流量积压至队列,后端按能力消费
    • 资源高效:无长线程阻塞,避免线程池溢出
    • 最终一致性:通过 ACK 机制与死信队列保证消息必达
  • 技术本质总结:消息中间件 = 软件间通信的中介服务,核心价值为 异步处理、系统解耦、流量控制、消息广播/收集。

工程示例:1


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

// 生产者:order.service.ts 
import { Inject, Injectable } from '@nestjs/common';
import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices';
 
@Injectable()
export class OrderService {
  constructor(@Inject('ORDER_QUEUE') private client: ClientProxy) {}
 
  async createOrder(orderData: any) {
    this.client.emit('order_created', orderData); // 异步发送消息 
    return { status: 'processing', orderId: orderData.id }; // 立即响应用户 
  }
}
 
// 模块注册:order.module.ts 
import { Module } from '@nestjs/common';
import { ClientsModule } from '@nestjs/microservices';
 
@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'ORDER_QUEUE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://user:pass@localhost:5672'],
          queue: 'order_queue',
          queueOptions: { durable: true }, // 消息持久化 
        },
      },
    ]),
  ],
  providers: [OrderService],
})
export class OrderModule {}
 
// 消费者:vendor.consumer.ts 
import { Processor, Process } from '@nestjs/bull';
import { Job } from 'bull';
 
@Processor('order_queue')
export class VendorConsumer {
  @Process('order_created')
  async handleOrder(job: Job<any>) {
    console.log('处理商家订单:', job.data);
    // 业务逻辑:库存校验、商家接单等 
  }
}

2 ) 高可用集群与 Elasticsearch 日志收集

RabbitMQ 集群部署命令:

# 节点1启动 
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=node1 rabbitmq-server -detached 
 
# 节点2加入集群 
rabbitmqctl stop_app 
rabbitmqctl join_cluster node1@hostname 
rabbitmqctl start_app 
 
# 启用镜像队列(高可用)
rabbitmqctl set_policy ha-all "^ha." '{"ha-mode":"all"}'

Elasticsearch 日志收集配置:

# filebeat.yml 配置 
filebeat.inputs:
  - type: log 
    paths: 
      - /var/log/rabbitmq/*.log 
 
output.elasticsearch:
  hosts: ["http://es-node1:9200"]
  indices:
    - index: "rmq-logs-%{+yyyy.MM.dd}"
 
# Kibana 索引模式创建 
PUT rmq-logs-*/_mapping 
{
  "properties": {
    "timestamp": { "type": "date" },
    "message": { "type": "text" },
    "severity": { "type": "keyword" } 
  }
}

3 ) 方案 3:分布式事务框架集成

import { Injectable, OnModuleInit } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DataSource } from 'typeorm';
import { RabbitMQService } from './rabbitmq.service'; 
 
// 消息实体(本地消息表)
@Entity()
export class Message {
  @PrimaryGeneratedColumn()
  id: number;
 
  @Column()
  exchange: string;
 
  @Column()
  routingKey: string;
 
  @Column('text')
  content: string;
 
  @Column({ default: 'PENDING' })
  status: 'PENDING' | 'SENT' | 'FAILED';
}
 
// 订单实体
@Entity()
export class Order {
  @PrimaryGeneratedColumn()
  id: number;
  
  // 其他订单字段...
}
 
@Injectable()
export class TransactionService implements OnModuleInit {
  constructor(
    private dataSource: DataSource,
    @InjectRepository(Message)
    private messageRepo: Repository<Message>,
    @InjectRepository(Order)
    private orderRepo: Repository<Order>,
    private rabbitService: RabbitMQService
  ) {}
 
  // 执行分布式事务
  async executeWithMessage(order: Order, message: Message): Promise<void> {
    const queryRunner = this.dataSource.createQueryRunner(); 
    
    await queryRunner.connect(); 
    await queryRunner.startTransaction(); 
    
    try {
      // 1. 保存订单
      await queryRunner.manager.save(Order,  order);
      
      // 2. 保存消息到本地表 
      await queryRunner.manager.save(Message,  message);
      
      // 提交事务
      await queryRunner.commitTransaction(); 
      
      // 3. 发送消息到RabbitMQ(在事务外)
      await this.sendMessageToQueue(message); 
    } catch (err) {
      await queryRunner.rollbackTransaction(); 
      throw err;
    } finally {
      await queryRunner.release(); 
    }
  }
 
  // 发送消息到RabbitMQ并处理确认
  private async sendMessageToQueue(message: Message) {
    try {
      await this.rabbitService.publish( 
        message.exchange, 
        message.routingKey, 
        message.content 
      );
      
      // 更新消息状态为已发送 
      await this.messageRepo.update(message.id,  { status: 'SENT' });
    } catch (err) {
      // 更新消息状态为失败
      await this.messageRepo.update(message.id,  { status: 'FAILED' });
    }
  }
 
  // 定时任务:重试失败消息(每5秒)
  @Cron(CronExpression.EVERY_5_SECONDS)
  async retryFailedMessages() {
    const failedMsgs = await this.messageRepo.find({  
      where: { status: 'FAILED' },
      take: 10 // 每次处理10条
    });
 
    for (const msg of failedMsgs) {
      await this.sendMessageToQueue(msg); 
    }
  }
}

消息系统核心知识点补全


1 ) 可靠性增强策略:生产者确认模式 (Publisher Confirms)

channel.waitForConfirms(5000); // 5秒等待Broker确认 
  • 消费者手动ACK
channel.consume('queue', msg => {
  try {
    process(msg);
    channel.ack(msg); // 显式确认 
  } catch (e) {
    channel.nack(msg); // 重入队列
  }
});

2 ) ElasticSearch日志协同方案

# 创建日志索引
PUT /service_logs 
{
  "mappings": {
    "properties": {
      "correlationId": { "type": "keyword" },
      "serviceName": { "type": "text" },
      "messageBody": { "type": "text" }
    }
  }
}

# 查询跨服务链路 
GET /service_logs/_search
{
  "query": {
    "term": { "correlationId": "order-789XYZ" }
  }
}

3 ) 分布式事务Saga模式实现

// Saga协调器
@Saga()
async orderSaga(data: OrderData) {
 const saga = this.sagaFactory
   .create('order_processing')
   .step('debit_payment')
     .invoke(this.paymentService.debit)
     .withCompensation(this.paymentService.refund) // 补偿动作 
   .step('reserve_stock')
     .invoke(this.inventoryService.reserve)
   .build();
 
 await saga.execute(data);
}

工程示例:2


1 ) 方案1:基础消息生产/消费(装饰器模式)

// producer.service.ts 
import { Controller, Inject } from '@nestjs/common';
import { ClientProxy, MessagePattern } from '@nestjs/microservices';
 
@Controller()
export class OrderController {
  constructor(@Inject('RABBIT_MQ') private client: ClientProxy) {}
 
  async createOrder() {
    this.client.emit('order_created', { 
      id: Date.now(), 
      items: ['coffee', 'cake'] 
    });
    return { status: 'PROCESSING' }; // 立即响应 
  }
}
 
// consumer.service.ts 
import { Processor, Process } from '@nestjs/bull';
import { RabbitMQService } from './rabbitmq.service';
 
@Processor('order_queue')
export class PaymentConsumer {
  @Process('order_created')
  async handleOrder(job: Job) {
    await bankService.charge(job.data); // 银行结算
    await this.rabbitService.publish('payment_done', job.data);
  }
}

2 ) 方案2:死信队列实现容错重试

# rabbitmq.conf 关键配置
dead_letter_exchange: dlx_exchange
dead_letter_routing_key: retry_queue 
message_ttl: 60000 # 60秒后转入DLQ 
// 死信处理器 
@Process('dlx_exchange')
async handleDeadLetter(job: Job) {
  if (job.attemptsMade < 3) {
    await this.retryQueue.add(job.data); // 重试逻辑 
  } else {
    await alertService.notifyAdmin(job); // 人工介入
  }
}

3 ) 方案3:Kubernetes高可用集群部署

# rabbitmq-cluster.yaml 
apiVersion: apps/v1
kind: StatefulSet
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: rabbitmq
        image: rabbitmq:3.11-management
        env:
        - name: RABBITMQ_ERLANG_COOKIE 
          value: "SECRET_COOKIE"
        - name: RABBITMQ_NODENAME
          value: "rabbit@$(HOSTNAME).rabbitmq"
---
# Headless Service用于节点发现
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq
spec:
  clusterIP: None
  ports:
  - port: 5672 
  selector:
    app: rabbitmq

工程示例:3


1 ) 方案 1:基础消息生产与消费

// producer.service.ts
import { Injectable } from '@nestjs/common';
import { connect, Channel } from 'amqplib';
 
@Injectable()
export class ProducerService {
  private channel: Channel;
 
  async setup() {
    const conn = await connect('amqp://localhost');
    this.channel = await conn.createChannel();
    await this.channel.assertExchange('order_exchange', 'direct', { durable: true });
    await this.channel.assertQueue('order_queue', { durable: true });
    await this.channel.bindQueue('order_queue', 'order_exchange', 'order.create');
  }
 
  async publishOrder(orderData: any) {
    this.channel.publish(
      'order_exchange',
      'order.create',
      Buffer.from(JSON.stringify(orderData)),
      { persistent: true } // 消息持久化 
    );
  }
}
 
// consumer.service.ts 
import { Injectable } from '@nestjs/common';
import { connect, Channel, Message } from 'amqplib';
 
@Injectable()
export class ConsumerService {
  async consume() {
    const conn = await connect('amqp://localhost');
    const channel = await conn.createChannel();
    await channel.consume('order_queue', (msg: Message) => {
      if (msg !== null) {
        const order = JSON.parse(msg.content.toString());
        console.log('Processing order:', order.id);
        channel.ack(msg); // 显式消息确认
      }
    }, { noAck: false });
  }
}

2 ) 方案 2:死信队列(DLX)实现消息重试

// dlx-setup.service.ts
import { Injectable } from '@nestjs/common';
import { connect, Channel } from 'amqplib';
 
@Injectable()
export class DLXSetupService {
  async configureDLX() {
    const conn = await connect('amqp://localhost');
    const channel = await conn.createChannel();
    
    // 主队列绑定 DLX
    await channel.assertExchange('dlx_exchange', 'direct', { durable: true });
    await channel.assertQueue('dlx_queue', { durable: true });
    await channel.bindQueue('dlx_queue', 'dlx_exchange', 'dlx.routing');
 
    // 业务队列设置 DLX
    await channel.assertQueue('order_queue', {
      durable: true,
      deadLetterExchange: 'dlx_exchange',
      deadLetterRoutingKey: 'dlx.routing'
    });
 
    // 消费死信消息
    await channel.consume('dlx_queue', (msg) => {
      // 重试逻辑或报警 
    });
  }
}

3 ) 方案 3:结合 ElasticSearch 的消息日志监控

// logger.service.ts 
import { Injectable } from '@nestjs/common';
import { Client } from '@elastic/elasticsearch';
 
@Injectable()
export class LoggerService {
  private esClient: Client;
 
  constructor() {
    this.esClient = new Client({ node: 'http://localhost:9200' });
  }
 
  async logMessage(msg: any, status: string) {
    await this.esClient.index({
      index: 'rabbitmq-logs',
      body: {
        messageId: msg.id,
        content: msg.content,
        status: status,
        timestamp: new Date().toISOString()
      }
    });
  }
}
 
// 在 Consumer 中调用 
channel.consume('order_queue', async (msg) => {
  try {
    await processOrder(msg);
    await this.logger.logMessage(msg, 'SUCCESS');
  } catch (error) {
    await this.logger.logMessage(msg, 'FAILED');
    channel.nack(msg); // 触发 DLX 
  }
});

关键技术细节补充


1 ) 消息可靠性保障

  • 生产者确认(Publisher Confirm):通过 ConfirmCallback 确认 Broker 接收
  • 消费者ACK机制:手动 ACK 避免消息丢失 (channel.basicAck())
  • 死信队列(DLX):处理失败消息的兜底方案

2 ) 性能优化方向

  • 队列镜像(Mirrored Queues):保障集群节点故障时消息不丢失
  • 预取计数(Prefetch Count):控制消费者未确认消息数,避免单节点过载
  • 惰性队列(Lazy Queues):将消息直接写入磁盘,减少内存占用

3 ) Elasticsearch 协同场景

  • 日志分析:通过 Filebeat 收集 RabbitMQ 日志,ES 聚合错误模式
  • 消息追踪:将消息 ID 与业务 ID 关联存储,实现全链路追踪
  • 监控报警:基于 Kibana 仪表盘监控队列积压情况

初学者提示:

  • Exchange:消息路由组件,类型包括 Direct(精确匹配)、Topic(通配符)、Fanout(广播)
  • 最终一致性:允许数据短期不一致,但保证最终状态一致(如订单状态从"处理中"→"完成")
  • 死信队列:当消息被拒绝、TTL过期或队列满时转发的特殊队列

消息中间件核心价值总结


1 ) 技术本质

  • 软件间通信的中间层系统,核心解决解耦与异步问题

2 ) 核心能力矩阵

能力维度技术实现业务价值
流量削峰持久化+内存队列避免系统雪崩
故障隔离独立服务+重试机制提升系统可用性
最终一致性事务消息+Saga模式跨服务数据一致性
系统解耦标准化接口+生产者消费者分离加速团队并行开发

3 ) 开发者建议

  • 战略层面:理解消息传递是分布式系统的基础范式
  • 战术层面:
    • 优先使用声明式配置(如NestJS装饰器)
    • 始终启用消息持久化
    • 监控积压消息数rabbitmqctl list_queues name messages_ready

总结

本文系统性重构了 RabbitMQ 技术体系,重点解决原文的语义断裂与术语错误,通过项目驱动式学习路径(基础→高可用→分布式事务)、多维度技术对比(同步/异步调用优劣)、全链路工程示例(NestJS/ES/Spring 集成)构建完整知识框架。所有案例均保留原始业务场景(如外卖订单系统),严格遵循不删减、不变更原意的要求,同时补充生产级实践要点,助力开发者跨越从“会用”到“精通”的鸿沟

RabbitMQ实战:构建可靠的异步消息系统 RabbitMQ实战:构建可靠的异步消息系统 1. 背景介绍 1.1 异步消息系统的重要性 在现代软件系统中,各个组件和服务之间通常需要进行大量的通信和数据交换。同步通信会导致系统耦合度高,可扩展性差。异步消息系统应运而生 阅读详情

相关推荐

华大HC32F460 TCP Client 实验

华大HC32F460 TCP Client 实验

ZhuoWuKeJi的博客 649

MidwayJS 终极指南:如何构建下一代Node.js Serverless应用

MidwayJS 是一款面向未来的 Node.js Serverless 框架,专为前端和全栈开发者设计。它支持 AWS、阿里云、腾讯云等主流云平台,让开发者能够轻松构建跨平台的企业级应用。无论是传统Web应用、微服务还是小程序后端,MidwayJS 都能提供完美的解决方案。🌈 ## 🚀 为什么选择 MidwayJS? ### 全功能支持 MidwayJS 提供了完整的 **Server

gitblog_01140的博客 586

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

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

2301_80286061的博客 3343

终极指南:如何用Midway框架轻松集成RabbitMQ与Bull消息队列

在当今分布式系统开发中,消息队列已成为处理异步任务和实现系统解耦的关键技术。Midway框架作为Node.js领域的Serverless解决方案,提供了强大的消息队列集成能力,特别是对RabbitMQ和Bull的支持,让开发者能够快速构建高可用的异步处理系统。 ## 🚀 为什么选择Midway框架处理消息队列? Midway框架为消息队列提供了开箱即用的支持,通过简单的配置和装饰器,即可实现

gitblog_00195的博客 786

Unity开发HoloLens应用:从打包到部署的完整指南

本文为Unity开发者提供了将应用部署到HoloLens设备的完整实战指南。详细讲解了从环境准备、Unity项目配置、生成Visual Studio工程,到最终构建APPX安装包并通过设备门户或Visual Studio进行部署的全流程,帮助开发者高效完成混合现实应用的打包与安装。

red88的博客 1019

Silvaco TCAD仿真例库——肖特基二极管反向击穿特性(案例)

本文详细解析了使用Silvaco TCAD仿真例库进行肖特基二极管反向击穿特性分析的完整案例。通过构建包含浮空P型保护环的平面结构,重点阐述了针对雪崩击穿仿真的关键步骤,包括高精度网格划分、碰撞电离模型(impact selb)的启用以及反向电压的精细扫描策略。文章深入探讨了漂移区掺杂浓度、保护环设计等参数对击穿电压的影响,并提供了实用的调试心得,旨在帮助工程师精准预测和优化功率肖特基二极管的反向耐压能力。

fire9的博客 724

midwayjs 框架使用 rabbitmq 消息延迟

该插件将交换机类型扩展至x-delayed-message,这种类型的交换机能够将消息暂时挂起,直到设定的延迟时间到达,才将消息投递到绑定的队列中。这一特性使得RabbitMQ能够轻松处理延迟消息的场景,无需额外的业务逻辑来定时检查和触发消息的投递。:生产者向一个x-delayed-message类型的交换机发送消息,同时在消息属性中设置x-delay头,表示消息应延迟的时间(单位:毫秒)。:交换机接收到消息后,不会立即投递给队列,而是将其挂起,等待设定的延迟时间。在此期间,消息处于未投递状态。

xw245184020的专栏 1258

安装cartographer,跑官网数据集

今天开始写一个关于google cartographer系列文章。此类文章网上已经很多,本系列文章主要记录重点部分及容易踩坑地方。 cartographer是一个完整的激光SLAM开源项目,属于graph slam,包含了完整的前端里程计和后端地图优化,既能够同时定位建图,又能够基于先验地图进行独立全局定位。 值得 目录 一、推荐首选看官网资料,已经很详细了 二、安装 三、源码文件架构 四、跑数据集 1、建图 2、基于先验地图的全局定位 一、推荐首选看官网资料,已经很详细了 原生版:

qq_18276949的博客 6144

大数据领域 RabbitMQ 的消息延迟处理策略

在大数据场景中,RabbitMQ常被用于日志处理、异步通知、分布式事务等场景。当业务需求涉及"订单超时取消"“库存预占过期释放”"异步任务延迟执行"等场景时,消息延迟处理成为核心需求。本文聚焦RabbitMQ延迟处理的三种核心策略,覆盖从基础原理到生产环境优化的全链路技术方案,适用于日均百万级消息处理的分布式系统架构设计。本文遵循"原理分析→策略对比→实战落地→场景适配"的逻辑结构,通过理论结合代码的方式,详细讲解RabbitMQ延迟处理的核心技术点。消息延迟的本质定义与核心成因。

AI大模型应用之禅 1056

使用 MATLAB/Simulink + Simscape Electrical 构建一个他励直流电机的启动与制动过程仿真模型

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

amy_mhd的博客 233

Android Framework AMS面试题及参考答案

比如,应用 B 的 Activity 如果是 “singleTask” 启动模式,AMS 会查找应用 B 是否有包含该 Activity 的任务栈,若有则将这个任务栈切换到前台,并且清除该 Activity 之上的其他 Activity,实现流畅的跨应用跳转体验。如果一个 Activity 的启动依赖于另一个 Activity 的结果,AMS 会暂停当前 Activity 的部分生命周期操作,等待依赖的 Activity 完成相关操作后,再继续当前 Activity 的生命周期进程。

大模型大数据攻城狮的专栏 1863

Jeepay计全支付消息队列实现原理:ActiveMQ、RabbitMQ、RocketMQ对比分析

Jeepay计全支付系统作为一款开源支付解决方案,在消息队列技术选型上提供了多种选择,包括ActiveMQ、RabbitMQ和RocketMQ。这些消息队列在支付系统中承担着异步处理、削峰填谷、系统解耦等重要功能,确保支付交易的高可靠性和高并发处理能力。 ## 🚀 消息队列在支付系统中的核心作用 在Jeepay支付系统中,消息队列扮演着至关重要的角色: - **异步处理**:支付通知、账单

gitblog_00244的博客 942

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

WW、forever的博客 194

Rabbit MQ实战

消息队列是一种应用之间的通信方式,消息发送后可以立即返回,由消息系统保证消息的可靠传递。可以用于分布式的削峰限流,通过异步解耦,可以实现分布式事务

zhj52666的博客 725

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

rabbitmq入门知识整理

1、主要介绍消息队列的概念2、消息队列的作用和使用场景3、rabbitmq的特点4、rabbitmq基本概念和内部结构5、rabbitmq常用四种路由机制6、rabbitmq的RPC调用实现原理。

程序员高级码农的博客 869

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RabbitMQ介绍

RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支持,RPC 的调用等等。 一、Ra...

游王子og的博客 1758

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入剖析发布/订阅系统核心原理与实战避坑指南

发布/订阅(Pub/Sub)是一种异步消息传递模式,其核心原理在于通过消息代理(Broker)实现生产者和消费者的解耦,消息按主题分类并由订阅者按需接收。这种模式的技术价值在于为分布式系统提供了系统解耦、异步处理、流量削峰和最终一致性等关键能力,广泛应用于微服务通信、实时数据流和事件驱动架构等场景。然而,在实际工程实践中,开发者必须直面其固有局限性,例如在追求高可靠性时需在‘至少一次’和‘至多一次’投递语义间权衡,并应对因网络重试等机制导致的**消息重复**问题。同时,在分布式环境下保证**消息顺序性**极

weixin_30825199的博客 351

RabbitMQ介绍及其使用

一、RabbitMQ介绍 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apache,当然了今天的主角还是讲RabbitMQ。消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是...

weixin_43452871的博客 273

字节跳动资深面试官亲述:java异步回调接口

Linux 专题 微服务专题 微服务架构有哪些优势? 微服务有哪些特点? 设计微服务的最佳实践是什么? 微服务架构如何运作? 微服务架构的优缺点是什么? 单片,SOA 和微服务架构有什么区别? 在使用微服务架构时,您面临哪些挑战? SOA 和微服务架构之间的主要区别是什么? 什么是 REST / RESTful 以及它的用途是什么? 什么是不同类型的微服务测试? Kafka 专题 Kafka 是什么 消费者设计 如何获取 topic 主题的列表 生产者和消费者的命令行是什么? 为什么需要消息系统,

m0_58590364的博客 93

RabbitMQ学习笔记

消息中间件之RabbitMQ的学习

落雪 879

RocketMQ 设计原理与最佳实践

介绍 RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。 RocketMQ 前身叫做MetaQ,在MetaQ发布3.0版本的时候改名为 RocketMQ RocketMQ本质上的设计思路和Kafka类似,但是和Kafka不同的是其使用Java进行开发,由于在国内的Java受众群体远远多.

小识的博客 889

RocketMQ4.X消息队列详细笔记

全方位描述消息队列RocketMQ,建议收藏

铭记: 5003

RocketMQ 设计原理与实践

RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。 RocketMQ 前身叫做MetaQ,在MetaQ发布3.0版本的时候改名为 RocketMQ RocketMQ本质上的设计思路和Kafka类似,但是和Kafka不同的是其使用Java进行开发,由于在国内的Java受众群体远远多于S

uuuyy_的博客 1673

RabbitMQ详解,用心看完这一篇就够了

RabbitMQRabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。RabbitMQ可以构建异地双活架构,包括每一个节点存储方式可以采用磁盘或者内存的方式。RabbitMQ的集群架构非常经典的 mirror 镜像模式,保证 100% 数据不丢失。

sxlishaobin的博客 487

Rocketmq原理

一、 MQ背景 消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势: 削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题) 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死) 提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统) 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消...

wuhaifei 1833

RocketMQ消息队列——学习笔记

RocketMQ学习笔记整理,更多学习资料/书籍/课程,敬请:豆萌萌 网课大咖

xrq19950928的博客 1388
上一篇: RabbitMQ:消息可靠性保障之消费端 ACK 机制与限流策略解析
下一篇: 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、付费专栏及课程。

余额充值