消息队列

1.MQ的相关概念(message queue)

1.1什么是MQ:

  • ​ 本质是个队列,只不过队列中的内容是message而已!

  • ​ 用于上下游传递消息

1.2为什么要使用MQ

1.流量消峰:

​ 在用户访问系统前添加MQ,对访问的消息进行排队,虽然排队会消耗时间但不会出现流量过大导致服务器宕机的情况。

2.应用解耦:

​ 如果没有MQ,比如用户在订单系统下单后,订单系统会立即调用物流系统,如果物流系统暂时出故障了,那么下单操作就会异常。

​ 如果使用了MQ,用户在订单系统下单后,如果物流系统暂时出故障了,物流系统需要处理的消息会被缓存在MQ中,等到物流系统故障修复完成,就可以从MQ中取出待处理的信息。这个过程中,用户不会感受到物流系统的故障,因此提升了系统的可用性。

3.异步处理:

有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完。

以前一般有两种方式,A 过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callback api,B 执行完之后调用 api 通知 A 服务。这两种方式都不是很优雅。

使用消息队列可以很方便解决这个问题, A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api,也不用提供 callback api。同样 B 服务也不用做这些操作,A 服务还能及时的得到异步处理成功的消息。

2.RabbitMQ

2.1 RabbitMQ概念:

​ RabbitMQ是一个消息中间件,能够接收、存储并转发消息

2.2 四大核心概念:

生产者:

​ 产生数据,发送消息的程序成为生产者

交换机:

​ 接收来自生产者的消息,并将消息推送到队列中

​ 一个交换机可以与多个独立产生绑定关系binding(交换机需要知道将消息推送给特定队列、多个队列或是丢弃—由交换机类型决定)

队列:

​ 队列 —–> 一个大的消息缓冲区

​ 多个生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据

消费者:

​ 等待接收消息的程序

image-20230426204426849

rebbitmq服务的使用:

1
2
3
4
5
6
7
8
brew services start rabbitmq				//开启服务
brew services restart rabbitmq //重启服务
rabbitmqctl list_users //查看用户
rabbitmqctl add_user admin 123 //添加用户 用户名:admin 密码:123
rabbitmqctl set_user_tags admin administrator //将 admin 用户 设置为 administrator --> 超级管理员
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" //为admin用户设置权限

rabbitMQ可视化管理界面,即后台管理界面地址:localhost:15672 ip:15672

Hello World

引入依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>

消息生产者发送消息到队列,消费者从队列中取出消息

Work Queues

使用场景:

image-20230427223442104