rabbitmq 设计的概念介绍

本文详细介绍了消息队列的基本概念,包括Broker、Exchange、Queue等核心组件的功能与交互方式。同时,深入探讨了不同类型Exchange的工作原理及其应用场景,并讲解了如何实现消息持久化确保数据安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概念说明:

Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

消息队列的使用过程大概如下:

(1)客户端连接到消息队列服务器,打开一个channel。
(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
(5)客户端投递消息到exchange。

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换机,符 号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还 有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:
(1)exchange持久化,在声明时指定durable => 1
(2)queue持久化,在声明时指定durable => 1
(3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)

如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。


参考:http://zhanghua.1199.blog.163.com/blog/static/464498072012872341062/

         http://cloudfoundry-doc.youkuaiyun.com/services/rabbitmq/ruby-rabbitmq.html

       

### RabbitMQ设计模式及相关应用 #### 1. **RabbitMQ 中的设计模式** RabbitMQ 是一种基于 AMQP 协议的消息队列中间件,在其架构和功能实现中广泛采用了多种设计模式。其中最典型的当属模板方法设计模式。 在 Spring 框架中,`RabbitTemplate` 类作为与 RabbitMQ 进行交互的核心工具之一,正是模板方法设计模式的应用实例[^1]。它将通用的操作逻辑(如连接管理、消息序列化/反序列化等)封装在父类或核心组件中,而具体的消息生产者或消费者行为则由开发者自定义实现。这种分离方式显著提升了代码的复用性和扩展性。 --- #### 2. **RabbitMQ 的使用场景** 以下是 RabbitMQ 常见的一些使用场景: - **异步处理**: 当某些任务耗时较长或者不适合阻塞主线程执行时,可以通过 RabbitMQ 将这些任务放入队列并交由后台线程完成。 - **解耦系统模块**: 不同的服务之间可能需要通信但又不想直接依赖对方接口的情况下,可以借助 RabbitMQ 实现松散耦合的数据传递机制。 - **流量削峰填谷**: 面对突发高并发请求时,利用消息队列缓冲区来平滑负载压力是一种常见做法。 - **日志收集与分析**: 大规模分布式环境中产生的海量日志数据可通过 RabbitMQ 转发至集中存储平台以便后续查询统计。 上述每种场景都体现了 RabbitMQ 对于现代微服务架构的支持作用,并且在其内部实现了诸如绑定 (Binding) 关系建立这样的重要概念[^2]。 --- #### 3. **RabbitMQ 的最佳实践** 为了确保 RabbitMQ 在实际项目中的稳定运行以及高效性能表现,遵循一些推荐的最佳实践至关重要: - **可靠的消息交付保障**: - 使用消费方确认机制(Consumer Acknowledgements),仅当应用程序成功处理完一条消息后再向服务器发送 ACK 确认信号;反之,则返回 NACK 并决定是否重试或将失败项转移到专门设置好的死信交换机(DLX)[^3]. - **合理配置预取参数(Prefetch Count)**: 控制单个 worker 可同时拉取的最大未决数量以防止单节点过载崩溃. - **持久化选项的选择**: 根据业务需求权衡选择是否开启 message persistence 功能以平衡速度损失换取更高的可靠性等级. - **监控运维体系构建**: 定期审查集群状态指标比如内存占用率,磁盘空间剩余量等等;另外也要关注客户端连通状况及时发现潜在隐患提前介入修复. 下面是一个简单的例子展示如何通过 `rabbitTemplate` 发送消息[^4]: ```java // 生产者部分 rabbitTemplate.send("exchangeName", "routingKey", new Message("payload".getBytes())); // 消费者监听器示例 @Component public class MyListener { @RabbitListener(queues = {"queueName"}) public void handleMessage(String content){ System.out.println("Received:" +content); } } ``` --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值