RabbitMQ快速入门

0 RabbitMQ 解决的问题

(1)各个模块之间的消息通讯;
(2)降低各个模块之间的耦合性;
(3)实现模块间的消息负载均衡;
(4)解决不同消息的优先级;
RabbitMQ快速入门_第1张图片

1 RabbitMQ 中的常见概念

  • Broker: 简单来说就是消息队列服务器实体。
  • Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost: 每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queue,exchagne,和bings
  • rule等等。这保证了你可以在多个不同的application中使用RabbitMQ。
  • producer:消息生产者,消息发送程序(Client)。
  • consumer: 消息消费者,消息接收程序(Client)。
  • Connection:客户端程序与RabbitMQ服务端之间的TCP连接。
  • Channel:虚拟连接,建立在Connection之上,Client程序所有的操作都是基于Channel的。Channel理论上没有数量限制。

2 RabbitMQ 消息分发模式

  • 队列模式(Queue):
    发送者将消息发送到固定队列中,消费者来从该队列接收消息,队列采用 Round-robin 循环分发消息达到接收者。
    该模式不需要Exchange,直接发送消息到Queue。
    RabbitMQ快速入门_第2张图片
  • 订阅发布模式
    RabbitMQ快速入门_第3张图片

Exchange 有4种类型:(fanout,direct,topic,headers)

  • fanout: 它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
  • direct: 它会把消息路由到那些binding key与routing key完全匹配的Queue中。

  • topic: 它与direct类型的Exchage相似,也是将消息路由到binding key与routing
    key相匹配的Queue中,binding
    key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

  • headers: headers类型的Exchange不依赖于routingkey与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配,

注意: 对于订阅发布模式,由Consumer端来创建队列并bingding到对应的Exchange,如果Producer发送的消息到Exchange的消息没有客户端订阅,则该消息会被丢弃掉。

3 Queue 介绍

Queue(队列)是RabbitMQ的内部非常重要的对象,用于存储消息,满足FIFO模式,Queue有几个重要的概念:

  • Name: 队列名称,最大255个字符,”amp.”这个开头的队列名称不允许客户端创建。

  • Durable:队列消息持久化,在MQ重启前队列消息不会丢,但这个会造成队列消息堆积。对于实时性要求比较高的系统不太合适。监控显示“D”

  • Exclusive: 专用队列,只能被某个客户端使用,当客户端断开后队列会被删除。监控显示“Excl”

  • Auto-delete: 当该队列没有消费者时将会被自动删除。监控显示“AD”

  • Arguments:队列的一些可选参数设置,比如:消息的TTL,队列最大长度等。

  • 优先级:队列支持设置消息优先级,生产者在发送消息时指定优先级,高优先级的消息将优先被消费。建议优先级设置为0~10,
    优先级多的话会占用系统资源。

  • 监控:RabbitMQ提供了多个Queue的监控指标,比如队列长度,进出队列速率,队列消费者数量及各个消息的状态等,具体可以参考RabbitMQ ManagementUI

  • 消费者ACK:消费者告诉Broker消息是否被消费成功

ACK有两种模式:

  • auto-ack: 不需要Consumer发送,当Broker把消息发送到客户端时就自动触发的。
  • manual-ack: 当客户端收到消息时主动发送的ack消息,manual-ack 有三种类型的消息.

ack: 消息被正常接收并确认无误。
reject:拒绝消费某个消息同时可以要求Broker将该消息丢掉还是重新放到队列中,AMQP的标准接口,丢掉的消息会被放到 dead-letter队列中,便于监控发现问题。
nack: RabbitMQ 扩展接口,支持多条消息的Reject。
manual-ack 还提供了Prefetch(channel QoS)功能,每次消费的消息数量。

镜像和分布式队列:在MQ集群中支持队列镜像功能,可以将队列的数据在其他节点中复制,以保证当某个节点宕掉时其他节点上还保持的有数据,队列镜像要求队列的属性不能是Exclusive.

你可能感兴趣的:(RabbitMQ)