介绍
消息队列,Message Queue,简称MQ
把消息队列比作是一个存放消息的容器,一个服务可以将数据放入消息队列中,另一个服务可以从消息队列中取出数据
消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。
应用场景
消息队列
传统方式
服务之间直接调用
消息队列
A服务将 数据 放入到消息队列中。这类服务称之为 生产者
推送服务 从消息队列中取出数据,然后进行处理。这类服务称之为 消费者
日志处理
日志处理是指将消息队列 用在日志处理中,比如 Kafka ,解决大量日志传输的问题。
- 日志采集客户端:负责日志数据采集,定时写入Kafka队列;
- Kafka消息队列:负责日志数据的接收,存储和转发;
- 日志处理应用:订阅并消费kafka队列中的日志数据;
为什么要用消息队列
解耦
传统方式:服务之间直接调用,当一个服务接口改变时,另一个服务接口也需要改变
消息队列方式:应用只需关注于数据
削峰/限流
在高并发时,比如服务器只能承受每秒1000个请求,但实际发来2000个请求,多出来的请求会把服务器搞崩溃,此时就可以把请求数据放入到消息队列中
异步
像 点赞、发评论、私信,并不需要立即处理消息。(与即时通讯QQ、微信不同)
消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
消息传递模式
- 点对点传递模式
- 发布-订阅模式。大部分的消息系统选用发布-订阅模式
点对点消息传递模式
- 生产者发送一条数据,数据被持久化到一个队列中。
- 将有一个或多个消费者,消费队列中的数据。但是 一条消息只能被消费一次。(类似抢红包)
- 当一个消费者消费了队列中的某条数据之后,该数据则从消息队列中删除。
特点:
- 消费者主动拉取数据
- 生产者发送一条消息到queue,只有一个消费者能收到
发布-订阅消息传递模式
生产者发送一条数据,数据被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据
同一条数据可以被多个消费者消费,数据被消费后不会立刻删除。
在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。
特点:
- 发布者发送到topic的消息,只有订阅了 topic(主题) 的订阅者才会收到消息。
常用消息队列
- ActiveMQ
- RabbitMQ(适合中小公司)
- Kafka(适用于大数据)
- RocketMQ(阿里巴巴开发,适合中大公司)
- redis也可实现简单消息队列
感谢:
https://www.cnblogs.com/qingyunzong/p/9004509.html
https://www.zhihu.com/question/54152397?sort=created
https://blog.csdn.net/acaoye/article/details/82967172





