rabbitMq学习
- 可靠性: RabbitMQ 使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等。
- 灵活的路由 : 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能, RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起, 也可以通过插件机制来实现自己的交换器。
- 扩展性: 多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展 集群中节点。
- 高可用性 : 队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队 列仍然可用。
- 多种协议: RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP, MQTT 等多种消息 中间件协议。
- 多语言客户端 :RabbitMQ 几乎支持所有常用语言,比如 Java、 Python、 Ruby、 PHP、 C#、 JavaScript 等。
- 管理界面 : RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集 群中的节点等。
- 插件机制 : RabbitMQ 提供了许多插件 , 以实现从多方面进行扩展,当然也可以编写自 己的插件。
- RoutingKey 是生产者在发送消息时指定的,用于匹配队列的绑定键。
- 交换器类型 决定了消息的路由方式,包括
Direct
、Fanout
、Topic
和Headers
。 - BindingKey 是队列与交换器绑定时指定的,用于与
RoutingKey
进行匹配,决定消息是否路由到队列。
- 交换器类型:配置,决定消息的路由方式。
- BindingKey:配置,绑定队列和交换器时使用的键。
- RoutingKey:消息的属性,由生产者在发送消息时指定,用来匹配
BindingKey
。
RabbitMQ 中消息只能存储在 队列 中,这一点和 Kafka 这种消息中间件相反。Kafka 将消息存储在 topic(主题) 这个逻辑层面,而相对应的队列逻辑只是 topic 实际存储文件中的位移标识。 RabbitMQ 的生产者生产消息并最终投递到队列中,消费者可以从队列中获取消息并消费。
AMQP 模型的三大组件:
- 交换器 (Exchange):消息代理服务器中用于把消息路由到队列的组件。
- 队列 (Queue):用来存储消息的数据结构,位于硬盘或内存中。
- 绑定 (Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。
. 配置消息丢弃策略
RabbitMQ 默认会在达到队列限制时丢弃最早的消息(先进先出),但你也可以指定其他策略(如拒绝新消息)。要实现这一点,可以使用 x-overflow
参数。它支持三种策略:
drop-head
:丢弃最早的消息(默认)。reject-publish
:拒绝新发布的消息。reject-publish-dlx
:拒绝新消息并将其发送到死信队列(Dead Letter Queue, DLQ)。
示例:
Map<String, Object> args = new HashMap<>(); args.put("x-max-length", 1000);
// 限制最大消息数为 1000
args.put("x-overflow", "reject-publish");
// 超过限制时拒绝发布新消息
channel.queueDeclare("my_queue", true, false, false, args);
在这个例子中,队列被限制为存储 1000 条消息,当超过时,新消息将被拒绝而不会丢弃旧消息。
使用场景
x-max-length
:当你希望控制队列中的消息数量时使用,比如对高频产生的消息进行限流。x-max-length-bytes
:当你希望控制队列的总内存使用时使用,比如避免队列占用过多的内存或磁盘空间。x-overflow
:用来控制队列满时的行为,根据业务场景选择是丢弃旧消息还是拒绝新消息。
x-max-length
限制队列的消息数量。x-max-length-bytes
限制队列的总字节数。x-overflow
控制当队列满时的处理方式(丢弃消息或拒绝新消息)。
通过这些参数,可以确保 RabbitMQ 的队列不会无限增长,从而保护系统资源。
导致的死信的几种原因:
- 消息被拒(
Basic.Reject /Basic.Nack
) 且requeue = false
。 - 消息 TTL 过期。
- 队列满了,无法再添加
消息到 MQ 的过程中搞丢,MQ 自己搞丢,MQ 到消费过程中搞丢。
- 生产者到 RabbitMQ:事务机制和 Confirm 机制,注意:事务机制和 Confirm 机制是互斥的,两者不能共存,会导致 RabbitMQ 报错。
- RabbitMQ 自身:持久化、集群、普通模式、镜像模式。
- RabbitMQ 到消费者:basicAck 机制、死信队列、消息补偿机制
RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。