RabbitMQ消息队列(一)简单介绍

RabbitMQ的官网是http://www.rabbitmq.com

解决问题

  1. 维持信息的发送者和接收者之间的链接。
  2. 降低发送者和接收者间的耦合。
  3. 让Priority高的接收者先接收到数据。
  4. 有效均衡接收者的负载。
  5. 有效的将数据发送到相关接收者。
  6. 可扩展性。
  7. 保证接收者接收到完整正确的数据

基本概念

  • Message:消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)
  • Publisher:生产者,向交换机发布消息的主体
  • Exchange:交换机,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
  • Binding:绑定,用于给Exchange和Queue建立关系,就是我们熟知的配对的红娘
  • Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  • Connection:连接
  • Channel:通道,MQ与外部打交道都是通过Channel来的,发布消息、订阅队列还是接收消息,这些动作都是通过Channel完成;简单来说就是消息通过Channel塞进队列或者流出队列
  • Consumer:消费者,从消息队列中获取消息的主体
  • Virtual Host: 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
  • Broker:消息队列服务器实体

Exchange类型

生产者,将消息投递给Exchange,然后由Exchange将消息路由到对应的Queue上,供消费者消费,那么这个路由有哪些方式呢?

  1. Direct策略
    消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中

简单来讲,就是路由键与队列名完全匹配

如果一个队列绑定到交换机要求路由键为“dog”
只转发 routing key 标记为“dog”的消息,
不会转发“dog.puppy”,也不会转发“dog.guard”等等
它是完全匹配、单播的模式

  1. Fanout策略

这种策略,将忽略所谓的routing key,将消息分发到所有绑定的Queue上,更加类似我们理解的广播模式

  1. Topic策略

topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上

可以理解为直接策略的进阶版,直接策略是完全精确匹配,而topic则支持正则匹配,满足某类指定规则的(如以xxx开头的路由键),可以键消息分发过去

  • 匹配0个或多个单词
  • 匹配不多不少一个单词

Producer发送消息时需要设置routing_key,


运行原理

##原理简译
RabbitMQ运行原理图

Client A & B:

也叫Producer,数据的发送方。
一个Message有两个部分:
payload(有效载荷)和label(标签)。
payload就是传输的数据。
label是exchange的名字或者是一个tag,它描述了payload,RabbitMQ也是通过label决定吧这个Message发给哪个Consumer。

Client 1, 2, 3:

也叫Consumer,数据的接收方。
把queue比作一个有名字的邮箱。当有Message到达某个邮箱后,RabbitMQ把它发送给它的某个订阅者即Consumer。

对于一个数据从Producer到Consumer的正确传递,还有三个概念需要明确:
exchange, queue, bindings

   Exchanges are where producers publish their messages.
    Queuesare where the messages end up and are received by consumers
    Bindings are how the messages get routed from the exchange to particular queues.

对于OS来说,建立和关闭TCP连接是有代价的,频繁的简历关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。

确认正确传递

使用ack确认Message的正确传递
默认情况下,如果Message已经被某个Consumer正确的接收到了,那么该Message就会被从queue中一处。当大也可以让同一个Message发送到很多的Consumer。

如果一个queue没有被任何的Consumer订阅,那么如果这个quere有数据到达,这个数据会被cache,不会丢弃。当有Consumer时,这个数据会被立即发送到这个Consumer,被Consumer正确接收时。这个数据就被从quere中移除。
通过ack确认Consumer是否正确收到。每个Message都要被acknowledged(确认)。在Consumer处理完成数据后发送ack。
通过reject 让message发送给下一个consumer或立即从queue中移除。
Consumer和producer都可以通过queue.declare创建queue.
Producer 的Message进入了Exchange。通过routing keys ,RabbitMQ会找到对应的queue.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Justin-D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值