什么是消息队列?
-
消息(Message):传输的数据。
-
队列(Queue):队列是一种先进先出的数据结构。
-
消息队列从字面的含义来看就是一个存放消息的容器。
-
消息队列可以简单理解为:把要传输的数据放在队列中。
-
把数据放到消息队列叫做生产者
-
从消息队列里边取数据叫做消费者
消息队列是一种异步的服务间通信方式,是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。使用较多的消息队列有RocketMQ、RabbitMQ、Kafka等。
为什么使用消息队列?
使用消息队列有三个好处:
解耦
耦合性:后台各个系统相互依赖,如果一个系统挂掉了,其他也会导致无法运行
于是消息队列就进行解耦,加入了消息队列之后,不同的后台只需要将自己的数据写进消息队列即可,一个系统挂掉了,他在消息队列中的数据依旧存在,不用担心出现整体无法运行的情况
异步
异步提速:比如说我们原本有3个后台系统要向前端输出数据,每个后台都需要300ms,还要加上访问数据库的时间,如果一个用户访问的后台较多,那么访问的时间也会变得很久,用户体验较差
但如果使用了消息队列的话,不管要访问多少个后台数据,所有的后台只需要把数据都压进消息队列里面就可行了,如何用户再根据自己的需求从消息队列拿,大大减少所需时间
削峰
如果我们有一段时间的请求量非常大,就好比双11的时候,我们的后台只能接受1000个,但一下发过来3000个,这时候后台扛不住,就会崩溃
但是如果使用了消息队列,消息队列会把加载不了的信息丢到消息队列里面去,等后台持续性的加载,这样就不会出现系统崩溃的问题,顶多也只是慢一点
消息队列有什么优点和缺点?
优点就是上面所说的三个: 解耦,异步,削峰
缺点:
系统的可用性降低:我系统引入的外部依赖越多,消息队列就越容易挂掉,不加消息队列之前,我们虽然有耦合的问题,2个系统可能互相关联,一方挂掉导致其他一个也无法正常使用,但是如果加了消息队列,消息队列一旦挂掉,那么所有的系统都会挂掉
系统复杂性变高:硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么[处理消息丢失的情况]?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已
Kafka ,ActiveMQ ,RabbitMQ ,RocketMQ 都有什么优点和缺点?