RabbitMQ 作用及模式

RabbitMQ 作用

你好! 你知道RabbitMQ是什么吗,是干什么用的呢,就让我们来学习一下吧。

1.什么是RabbitMQ

RabbitMQ采用了AMQP高级信息消息队列协议的一种消息对列技术,特点就是消费并不需要确保提供方的存在,大大的实现了对服务之间的高度解耦

2.为什么要用RabbitMQ

1.在分布式系统下具备异步,削峰,负载均衡等一系列的功能。
2.拥有持久化的机制,进程信息,队列中的信息也可以保存下来。
3.实现消费者和生产者之间的解耦。
4.可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。
  • 3.使用场景
1. 服务见异步通信
2. 顺序消费
3. 定时任务
4. 请求削峰
  • 1
  • 2
  • 3
  • 4

4.如何确保消息正确地发送至RabbitMQ? 如何确保消息接收方消费了消息

发送方:
将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。
  • 1
  • 2

一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。
如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(not acknowledged,未确认)消息。
发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。
接受方:
接收方消息确认机制:消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长的时间来处理消息。保证数据的最终一致性;
下面罗列几种特殊情况:
如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会给该消费者分发更多的消息。

5.消息基于什么来传输

RabbitMQ使用的是信道的方式来传输数据,信道建立在真实的TCP连接内的虚拟连接中,而且每一条TCP 连接的信道数量都没有限制

6.工作模式

  • 简单的模式 HELLO WORLD
    在这里插入图片描述
    功能:一个生产者A给消息队列Q发信息,一个消费者B接受
    生产者的实现思路
    先创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口1103,设置用户名,密码,Virtual host, 从连接工厂中获取连接Connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel向队列中发送消息,然后关闭通道和连接。
    在这里插入图片描述

消费者实现思路
创建连接工厂ConnectionFactory, 设置服务地址127.0.0.1,端口号1103,设置用户名,密码,Virtual host, 从连接工厂中获取连接connection , 使用连接创建通道channel,使用通道channel创建队列queue,创建消费者并监听队列,从队列中读取信息,
在这里插入图片描述
2.工作队列模式Work Queue
在这里插入图片描述
功能:一个生产者,多个消费者,每个消费者获取的消息唯一,多个消费者只有一个队列
生产者实现思路:
创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号1103,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel向队列中发送消息,2条消息之间间隔一定时间,关闭通道和连接。
在这里插入图片描述
消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号1103,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,创建消费者C1并监听队列,获取消息并暂停10ms,另外一个消费者C2暂停1000ms,由于消费者C1消费速度快,所以C1可以执行更多的任务。
在这里插入图片描述
3.发布/订阅模式
在这里插入图片描述
功能:一个生产者发送的消息会被多个消费者获取。一个生产者,一个交换机,多个队列,多个消费者
生产者:可以把消息发送给队列或者是交换机
消费者:只能从队列中获取消息
如果消息没有发送到队列绑定的交换机上,那么消息将会丢失,交换机上是不会存储消息的,消息存储在消息队列中。
生产者思路:
创建链接工厂ConnectionFactory , 设置服务地址127.0.0.1,端口号1103,设置用户名,密码,Virtual host ,从连接工厂中获取连接connection,使用连接创建通道channel,只用通道channel创建队列queue,使用通道channel创建交换机并指向交换机行为为fanout,使用通道向交换机发送信息,并关闭通道的连接
在这里插入图片描述
消费着实现思路
创建连接工厂ConectionFactory,设置服务地址127.0.0.1,端口号: 1103,设置用户名,密钥,Virtual host 从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,绑定队列到交换机,设置Qos=1,创建消费者并监听队列,使用手动方式返回完成。可以有多个队列绑定到交换机,多个消费者进行监听。
在这里插入图片描述
4.路由模式Routing
在这里插入图片描述

生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel创建交换机并指定交换机类型为direct,使用通道向交换机发送消息并指定key=b,关闭通道和连接。

在这里插入图片描述
消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,绑定队列到交换机,设置Qos=1,创建消费者并监听队列,使用手动方式返回完成。可以有多个队列绑定到交换机,但只要绑定key=b的队列key接收到消息,多个消费者进行监听。在这里插入图片描述
5.通配符模式Topics
在这里插入图片描述
生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel创建交换机并指定交换机类型为topic,使用通道向交换机发送消息并指定key=key.1,关闭通道和连接。
在这里插入图片描述
消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,绑定队列到交换机,设置Qos=1,创建消费者并监听队列,使用手动方式返回完成。可以有多个队列绑定到交换机,凡是绑定规则符合通配符规则的队列均可以接收到消息,比如key.*,key.#,多个消费者进行监听。
在这里插入图片描述