RebbitMQ学习
RebbitMQ是什么?
RebbitMQ是消息队列,消息中间件,
RebbitMQ使用场景
服务解耦
假设有这样一个场景,服务A产生数据,而服务B,C,D需要这些数据,那么我们可以在A服务中直接调用B,C,D服务,把数据传递到下游服务即可。
,但是随着我们的应用规模不断扩大,会有更多的服务需要A的数据,如果服务过多维护会很困难。这是由于服务之间耦合度过于紧密。
这时候用到rabbitMQ,作为一个消息中间接件,来达到服务解耦的效果。
流量削峰
假设我们有一个应用,平均访问量是每秒300请求,那么一台服务器可以轻松应对,而在高峰期,访问量翻了10倍,达到每秒30000次请求,那么单台服务器 无法应对,这时增加服务器,但是会浪费服务器。
这种情况,我们就可以使用RabbitMQ来进行流量削峰。
异步调用
考虑订外卖支付情况。
支付后要发送支付成功的通知,在寻找外卖小哥来进行配送,而寻找外卖小哥的过程非常耗时,尤其是高峰期,客户要等待好久
这种情况,我们可以使用 RabbitMQ来进行流量削峰,高峰情况下,瞬间出现的大量数据请求数据,先发送到消息队列服务器,排队等待处理,
rabbitmq
RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中,接收端可以根据RabbitMQ配置的转发机制接收服务器发来的消息。RabbitMQ依据指定的转发规则进行消息的转发,缓冲,和持久化操作。主要用在多服务器间或但服务器的子系统间进行通信,是分布式系统标准的配置。
Exchange
接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列,ExchangeType决定了Exchange路由消息的行为。在RebbitMQ中,ExchangeType常用的direct,Fanout和Topic
Message Queue
消息队列。我们发送给RabbitMQ消息最后都会到达各种queue,并且存储在其中
Binding Key
它表示的是Exchange与Message Queue是通过binding key进行联系的,这个关系是固定的
Routing Key
生产者在将消息发送给Exchange的时候,一定会指定一个routing key,来指定这个消息的路由规则。
RabbitMQ安装
Docker 启动RabbitMQ
下载镜像,
关闭防火墙
systemctl stop firewalld
启动docker系统服务
systemctl restart docker
RabbitMQ六种工作模式
简单模式
简单模式,只有一个消费者
RabbitMQ是一个消息中间件,你可以想象它是一个邮局,一个邮箱,一个邮递员。
生产者发送消息
package rabbitmq.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Test1 {
public static void main(String[] args) throws Exception {
//创建连接工厂,并设置连接信息
ConnectionFactory f = new ConnectionFactory();
f.setHost("192.168.64.140");
f.setPort(5672);//可选,5672是默认端口
f.setUsername("admin");
f.setPassword("admin");
/*
* 与rabbitmq服务器建立连接,
* rabbitmq服务器端使用的是nio,会复用tcp连接,
* 并开辟多个信道与客户端通信
* 以减轻服务器端建立连接的开销
*/
Connection c = f.newConnection();
//建立信道
Channel ch = c.createChannel();
/*
* 声明队列,会在rabbitmq中创建一个队列
* 如果已经创建过该队列,就不能再使用其他参数来创建
*
* 参数含义:
* -queue: 队列名称
* -durable: 队列持久化,true表示RabbitMQ重启后队列仍存在
* -exclusive: 排他,true表示限制仅当前连接可用
* -autoDelete: 当最后一个消费者断开后,是否删除队列
* -arguments: 其他参数
*/
ch.queueDeclare("helloworld", false,false,false,null);
/*
* 发布消息
* 这里把消息向默认交换机发送.
* 默认交换机隐含与所有队列绑定,routing key即为队列名称
*
* 参数含义:
* -exchange: 交换机名称,空串表示默认交换机"(AMQP defaul