AMQP-RabbitMQ详解

RabbitMQ是的一个实现了高级队列协议(AMQP)的消息代理软件,也称为面向消息的中间件,由美国微处理器厂商Rabbit公司开源。RabbitMQ服务器是用Erlang语言编写的。

我们以RabbitMQ为例总结AMQP的实现。

一、AMQP定义

AMQP定义了网络协议和代理服务:

  • 高级消息交换协议模型:一套确定的消息交换功能,必须有三个部分:
    • 交换器(exchange):生产者把消息发到交换器上
    • 队列(queue):消息到达队列,等待消费者接收
    • 绑定(binding):决定了消息如何从交换器到指定的队列
  • 一个网络线级协议(数据传输格式),客户端应用可以通过这个协议与消息代理和它实现的AMQP模型进行交互通信
  • 可以只实现AMQP协议规范中的的部分语义,但是我们相信明确的描述这些语义有助于理解这个协议

AMQP使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能。

二、队列的基本动作

队列(queue)是消息的载体,每个消息都会被投到一个或多个队列,而queue拥有自己的erlang进程。

  • basic.consume:订阅消息,将信道设置为接收模式,知道取消对队列的订阅为止。订阅模式下,在接收完成上一条消息之后,会自动接收下一条消息
  • basic.get:获取消息,与订阅不同,只向队列获取一条消息。大致上讲,获取消息会先订阅消息,获取单条消息,再取消订阅,所以不要循环basic.get去代替basic.consume,性能极差
  • basic.ack:确认接收,消费者对消息进行确认,告知客户端已经消费完成。订阅模式下,在ack之后会接收下一条消息。对RabbitMQ来说,他不关注消费者是否将消息消费完成,只在意消费者的ack确认,在ack之后才会将消息从队列删除;
    • auto-ack参数:是否自动确认,为true时,一旦消费者接收消息,RabbitMQ会自动视其为已ack
  • basic.reject:拒绝接收,消费者拒绝RabbitMQ发送的消息。附带参数requeue,如果为true,则将消息重新发送给下一个订阅者;如果为false,就会将消息从队列移除,如果RabbitMQ版本支持死信队列(DLX,dead letter exchange),则会将消息发布到DLX中
  • queue.declare:创建队列,生产者消费者都可以使用该命令,但如果消费者在同一信道上订阅了另一个队列的话,必须先取消订阅,设置信道为传输模式,才能创建。
    • exclusive参数:是否私有,为true时将队列变为私有,只有你的应用程序才能消费队列消息;
    • auto-delete参数:是否自动删除,为true时,当最后一个消费者取消订阅时,自动移除队列。

三、交换器与绑定

上述队列的基本操作可以看出消费者是如何从队列中获取消息的,而交换器与绑定的组合,完成了消息到队列的投递。

通过交换器与绑定,发布者不需要关注服务器的另一端的逻辑,通过交换器与绑定的配置,就能够完成例如发布-订阅和多播等复杂的案例。

投递到RabbitMQ的消息会附带一个路由键(routing key),队列通过路由绑定到交换器,从而完成消息从交换器到队列的分发。路由键一般使用多个单词,以 . 进行单词之间的分隔

AMQP定义了四种不同类型的交换器发挥的作用:

  1. direct:匹配路由键,需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。例如:路由键 abc 只能匹配到名称为 abc 的队列
  2. fanout:不处理路由键,消息会发送到所有与交换器绑定的队列上
  3. topic:将路由键进行模式匹配,将消息发送到匹配的队列上。# 代表匹配 n 个词,n > 0,* 则匹配一个词。例如:abc.* 匹配 abc.d,不匹配 abc.d.e,单独的#匹配所有队列。在不使用匹配符的情况下,topic与direct相同
  4. headers:允许匹配消息的header,其他方面跟direct交换器完全一致,相较其他三种性能偏低,也不怎么实用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值