消息队列

介绍

消息队列,Message Queue,简称MQ

把消息队列比作是一个存放消息的容器,一个服务可以将数据放入消息队列中,另一个服务可以从消息队列中取出数据

消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

应用场景

消息队列

传统方式

服务之间直接调用

消息队列

A服务将 数据 放入到消息队列中。这类服务称之为 生产者
推送服务 从消息队列中取出数据,然后进行处理。这类服务称之为 消费者

日志处理

日志处理是指将消息队列 用在日志处理中,比如 Kafka ,解决大量日志传输的问题。

  1. 日志采集客户端:负责日志数据采集,定时写入Kafka队列;
  2. Kafka消息队列:负责日志数据的接收,存储和转发;
  3. 日志处理应用:订阅并消费kafka队列中的日志数据;

为什么要用消息队列

解耦

传统方式:服务之间直接调用,当一个服务接口改变时,另一个服务接口也需要改变

消息队列方式:应用只需关注于数据

削峰/限流

在高并发时,比如服务器只能承受每秒1000个请求,但实际发来2000个请求,多出来的请求会把服务器搞崩溃,此时就可以把请求数据放入到消息队列中

异步

像 点赞、发评论、私信,并不需要立即处理消息。(与即时通讯QQ、微信不同)
消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

消息传递模式

  • 点对点传递模式
  • 发布-订阅模式。大部分的消息系统选用发布-订阅模式

点对点消息传递模式

  1. 生产者发送一条数据,数据被持久化到一个队列中。
  2. 将有一个或多个消费者,消费队列中的数据。但是 一条消息只能被消费一次。(类似抢红包)
  3. 当一个消费者消费了队列中的某条数据之后,该数据则从消息队列中删除。

特点:

  • 消费者主动拉取数据
  • 生产者发送一条消息到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


原文出处:/show_1IXKq4Ohu1R.html