Rabbit MQ

原理:

  1. 核心组件:producer,broker(server),customer;broker包含exchange,和通过routingkey的规则绑定的queue
  2. 生产者通过发送消息给exchange,同时通过传入的routingkey,exchange把消息根据routingkey规则,将消息理由给指定的queue
  3. producer和customer注册相同的broker,消费者绑定对应需要消费的queue进行消费
  4. 队列queue是FIFO,消息先进先出
  5. 2.0后,开启自动ack,当customer-1 reject某条消息后,若设置了reject=true,那么消息会自动推送给下一个绑定的customer

发消息模式:

  1. direct:routingkey与队列名queue一致,一对一发送
  2. fanout:不管routingkey设置什么,都会给所有的queue发送
  3. topic:通配,根据通配符发送给通配的queue
  4. headers:很少用

丢消息

  1. producer
    confirm模式:异步处理,producer发送1个消息后,不等即使返回ack或回调nack接口,可以继续发送下一条消息
    1)producer设置一个时间没有收到ack默认失败,或者是收到nack失败接口,重复直到成功
    事务机制:同步调用
    1)customer开启channel.txSelect,然后发送消息,失败继续重复1次或多次,做异常处理

  2. MQ-server:开启持久化,只有持久化到磁盘,才通知producer成功
    同时设置queue持久化(server重启后,queue还在,不用重建)和消息持久化配置deliveryMode=2

  3. customer
    1)手动返回ack
    2)若处理失败,调用nack接口再尝试,若一直失败则进入死信队列,设置再尝试间隔时间和次数

重复消费

  1. producer
    MQ内部针对每条信息都有一个唯一的inner-msg-id,去重和幂等,避免重复入队列
  2. custoemr
    消息体必需有一个唯一的business-id, 用数据库唯一键或者redis的set去保存(接受消息时存入),存在就不重复消费(针对customer- server重启,ack通信中断)。但若此时消费失败且server重启,此时redis已经存在,则会丢消息。

消息堆积

  1. 配置和增加消费者的绑定数量
  2. 将消息先存入数据库,慢慢处理
  3. 增加prefetch-count值,一次发送多条消息给customer,加快消费

延迟队列

  1. 原理:
    1)设置message失效的TLL时间,到期后直接进入死信队列,由专门绑定死信队列的customer来消费
    2)消息被拒,消息过期,队列长度超过最大值,若死设置了死信队列就会进入死信队列,若没有设置死信队列,则消息会被直接删除;同时死信队列若没有绑定customer,死信队列的消息也会自动删除
  2. 应用场景:订单支付超时取消
    1)因为订单都是开始时间随机,所以定时任务不好设计,所以设置固定过期时间才好处理
    2)设置订单消息的过期时间,为这个消息设置死信交换机和死信routingkey,若订单支付,则对此消息做ack处理,若到时间为消费,则直接进入死信队列,由绑定死信队列的customer处理取消次订单

vhost
原理:
1)本质上MQ的mini版,拥有自己的队列,绑定关系,交换机和权限控制
2)若个实例提供逻辑上的分离,典型的例子,不同的应用跑在不同的vhost中

集群
自带集群,不需要其他的中间件
原理:镜像模式,依赖于erlang的集群,分内存节点和磁盘节点
1)磁盘节点将配置信息和元信息存入磁盘;内存节点存于内存
2)所有节点变化都会通知磁盘节点,防止磁盘节点宕机,集群中有2个磁盘节点
3)通过HAProxy统一对外提供服务,若HAProxy失效则集群失效,使用keeplived组件做HAProxy的集群监控,选择那个可用的HAProxy提供对外服务
4)producer发送消息,exchange和queue配置在那个节点就把完整数据保证在那个节点,通过元数据关联
5)customer任意链接某个节点,然后通过元数据转到完整数据节点获取数据,为了减轻节点压力,可使customer尽量链接所有节点
6)磁盘节点宕机,只是磁盘节点的完整数据不能用,其他节点可正常使用
7)为了每个节点高可用,对每个节点再做主从备份

<think>嗯,用户这次明确表示想要获取RabbitMQ的相关信息,包括使用指南、安装方法和配置等。用户还提供了站内引用作为背景参考,我需要仔细分析这些引用内容,从中提取有价值的信息点。 用户提供的引用[1]提到RabbitMQ是用Erlang开发的,适合中小型公司,在数据量和并发量不大的场景下表现优异。引用[2]展示了一个多节点配置的命令行示例,看起来是关于端口和节点名称的设置。引用[3]强调了RabbitMQ的轻量级特性和支持多种协议的特点,还提到AMQP协议。引用[4]说明了RabbitMQ在系统解耦和微服务架构中的作用。引用[5]虽然讲的是重试队列,但这是RocketMQ的特性,可能是个干扰信息。 用户可能是位开发人员或系统管理员,正在考虑采用RabbitMQ作为消息中间件。ta需要全面了解RabbitMQ的核心功能、如何部署以及典型应用场景。考虑到引用中出现了多节点配置命令,用户可能对集群部署也有兴趣。 在组织回答时,我决定分成RabbitMQ简介、核心功能、安装部署、配置管理和典型应用场景五个部分。特别注意要: 1. 突出其轻量级和AMQP协议支持的特点 2. 给出清晰的安装步骤示例(引用[2]的命令行很有参考价值) 3. 强调在微服务架构中的应用(引用[4]的内容) 4. 避免混淆其他MQ的特性(如引用[5]的RocketMQ内容) 对于命令行部分,准备把引用[2]的多节点启动命令整理成更易读的格式,并解释每个参数的含义。在应用场景部分,会重点描述系统解耦和事件驱动架构的实现方式。 </think>以下是对RabbitMQ的全面解析,整合了核心特性和应用指南: --- ### 🐇 **RabbitMQ 核心解析** 1. **基本概念** - **消息代理系统**:基于 AMQP 协议(Advanced Message Queuing Protocol),实现应用间异步通信 - **核心组件**:生产者(Producer)、交换机(Exchange)、队列(Queue)、消费者(Consumer) - **轻量级部署**:支持单机/集群部署,云环境兼容性强[^3] 2. **核心功能** - **消息路由**:通过四种交换机类型实现灵活路由(Direct/Topic/Fanout/Headers) - **持久化机制**:消息和队列可持久化到磁盘,防止服务重启丢失 - **高可用性**:镜像队列实现节点间数据同步(引用[2]示例为多节点部署命令) - **死信处理**:自动转移消费失败的消息到死信队列(类似引用[5]的重试逻辑) 3. **安装与配置** ```bash # Ubuntu 安装示例 sudo apt-get install erlang sudo apt-get install rabbitmq-server # 启动服务 sudo systemctl start rabbitmq-server # 启用管理插件 sudo rabbitmq-plugins enable rabbitmq_management ``` 4. **集群部署配置**(基于引用[2]优化) ```bash # 节点1(默认端口) RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached # 节点2(自定义端口) RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached ``` > 管理界面访问:`http://服务器IP:15672` 5. **应用场景** - **系统解耦**:电商订单系统与库存/物流服务异步通信[^4] - **流量削峰**:突发请求暂存队列,避免服务过载 - **微服务通信**:跨服务事件驱动架构(如订单创建触发通知) ```mermaid graph LR A[订单服务] -->|发布消息| B(Exchange) B --> C[库存队列] B --> D[支付队列] C --> E[库存服务] D --> F[支付服务] ``` --- ### 💡 **进阶配置技巧** - **消息确认机制**: - `手动ACK`:确保消息被成功处理后才从队列移除 - 配置方式:`channel.basicConsume(queue, false, consumer)` - **QoS控制**: `channel.basicQos(1)` 限制消费者每次只取一条消息,避免负载不均 - **插件扩展**: 安装 `rabbitmq_delayed_message_exchange` 支持延迟消息 --- ### 🌟 **典型使用流程** 1. 生产者声明交换机:`channel.exchangeDeclare("order_direct", "direct")` 2. 消费者声明队列并绑定:`channel.queueBind("stock_queue", "order_direct", "order.create")` 3. 发送消息:`channel.basicPublish("order_direct", "order.create", null, messageBytes)` 4. 消费处理:`channel.basicConsume("stock_queue", false, new CustomConsumer(channel))` > 📌 **最佳实践**:生产环境务必开启消息持久化(`delivery_mode=2`)和镜像队列策略,防止节点故障导致数据丢失[^3][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值