消息队列
消息队列
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(交换机需要知道将消息推送给特定队列、多个队列或是丢弃—由交换机类型决定)
队列:
队列 —–> 一个大的消息缓冲区
多个生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据
消费者:
等待接收消息的程序
rebbitmq服务的使用:
1 | brew services start rabbitmq //开启服务 |
Hello World
引入依赖:
1 | <build> |
消息生产者发送消息到队列,消费者从队列中取出消息
Work Queues
使用场景: