【MQ】RabbitMQ 交换器与队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【MQ】RabbitMQ 交换器与队列相关的知识,希望对你有一定的参考价值。

参考技术A

生产者将消息投递到交换器,然后交换器再将消息路由到一个或者多个队列中。
RabbitMQ 定义了4种类型的交换器:

在使用交换器之前,需要先创建交换器,RabbitMQ 的 Java 客户端提供了 exchangeDeclare() 方法来声明交换器。

参数说明:

返回值:

方法重载:

有创建就会有删除,RabbitMQ 的 Java 客户端提供了 exchangeDelete() 方法来删除交换器。

参数说明:

返回值:

exchangeDeclarePassive() 方法用来检测交换器是否存在。如果存在,则正常返回;如果不存在,则抛出异常 404 channel exception

队列在 RabbitMQ 中用来存储消息,队列通过 BindingKey 与 交换器相互绑定。

与 exchangeDeclare() 方法相比, queueDeclare() 的重载方法少很多,只有两个重载方法:

参数说明:

返回值:

与交换器一样,队列也可以删除

参数说明:

返回值:

RabbitMQ学习总结

一、基础概念

1、理解消息通信

  • AMQP定义,高级消息队列协议。

  • 优点。可靠性、解耦(请求和操作)以及实时消息通信。

  • 消费者、生产者和代理。

  • 消息持久化策略。通过配置项选择是否持久化的到磁盘,性能与可靠性的权衡,发送方确认。

  • 消息的生命周期

生产者:

  1. 连接到MQ
  2. 获取信道
  3. 声明交换器(交换器类型,路由键)
  4. 创建消息
  5. 发布消息
  6. 关闭信道、关闭连接

消费者:

  1. 连接到MQ
  2. 获取信道
  3. 声明交换器(交换器类型)
  4. 声明队列
  5. 绑定(把队列与交换器进行绑定)
  6. (接收消息)消费消息
  7. 关闭信道、关闭连接

技术分享图片

2、AMQP关键组件

交换器队列绑定

各个组件之间的联系是:

  1. 根据绑定规则将队列绑定到交换器。
  2. 消息发布到交换器。
  3. 基于消息的路由键和交换类型,服务器将消息投递到对应的队列。

发布与订阅

basic.consume命令订阅,信道置为接收模式。

basic.publish命令发布,信道设置为接收模式。

3、消息分发

交换器类型

  1. direct
  2. fanout
  3. topic

消息分发机制

  1. direct交换器的消息分发,是以队列名作为路由键。生产者与队列之间是一对一的消息分发模式。

技术分享图片

  1. fanout交换器的消息分发,一对多的广播消息。

技术分享图片

  1. topic交换器的消息分发,通过路由键进行正则匹配进而分发消息。可以实现多对多的消息分发。

技术分享图片

事实上,由于topic交换器的匹配规则囊括了一对一、一对多、多对多的消息派发机制,我们在进行消息通信时,几乎全部使用的是这种交换器。

二、解耦,解耦,解耦

1、分离请求和动作

2、自动轮询

配置更为复杂的路由方案,实现轮询负载均衡。

通过简单的增加消费者实现弹性伸缩。

3、语言无关

三、Rpc模式的使用

使用reply_to实现Rpc

私有队列:exclusive、auto_delete

流程图

技术分享图片

关键点

  1. 幂等性。
  2. 响应队列的复用。
  3. 异常处理。主要包括请求超时、连接不到服务器等异常情况的处理。

框架选型

我使用的.net core编写的测试。

在开始的时候参考官方API,通过覆写SimpleRpcClient和SimpleServer实现了Rpc调用。

但是很快我发现像快速实现一个包含异常处理、日记记录、消息确保、支持发布/订阅以及Rpc的框架,对我来说还是很困难的。

大概比较了现在成熟的消息队列框架,最后选择MassTransit。

理由如下
  1. 开源。不解释了
  2. 文档比较全、社区活跃。一般的使用方法和问题解答,看文档就可以解决,很适合快速上手开发;遇到问题一般提问或看以前的issues都会有解答,当然不行了咋还有源码不是。
  3. 扩展性好,很多功能都是以扩展包的形式提供。在不满足需求的情况下,可以自己写扩展实现。

我测试对比了手写rpc与框架的rpc方式,速度差不多都是只有第一次调用的时候用了大概几百毫秒,之后几毫秒。性能还是非常不错的。

以上是关于【MQ】RabbitMQ 交换器与队列的主要内容,如果未能解决你的问题,请参考以下文章

【MQ】RabbitMQ 交换器与队列

Rabbit MQ一些参数解释

01 Rabbit MQ 的初步使用

RABBIT MQ 消息队列的工作模式

Rabbit MQ 入门指南

具有单队列的 Rabbit MQ 中的多生产者、多消费者