文章目录

  • 前言
  • 一、消息队列是什么
  • 二、为什么使用消息队列
  • 三、使用消息队列的好处
  • 四、消息队列的流派
  • 总结



前言

消息队列(Message Queue)是当今市面上非常流行的中间件技术,使用消息队列可以帮助我们解决通信问题。同时,消息队列的流派也非常丰富,可以满足不同场景下的需要。本章主要介绍一下什么是消息队列以及为什么使用消息队列,在以后的文章中将会着重介绍kafka供参考学习。



一、消息队列是什么

消息队列:字面意思就是存放消息的队列,简称MQ(message queue)。

最简单的消息队列模型包括3个角色:

  • 消息队列:存储和管理消息,也被称为消息代理(Message Broker)。
  • 生产者:发送消息到消息队列。
  • 消费者:从消息队列获取消息并处理消息。

二、为什么使用消息队列

以电商场景为例,我们要下一个订单需要以下几步:

shmop 消息队列 消息队列使用_java

在这几步操作中,又有很多操作是要去操作数据库的,而且还是一个线程串行执行, 整个过程是一个同步的,这样就会导致我们的程序执行的很慢,用户的体验差。

所以我们需要异步程序执行,那么如何加速呢?

核心思路:比如我只要确定他能做这件事,然后我后边慢慢做就可以了,我并不需要他一口气做完这件事,所以我们应当采用消息队列的方式来完成我们的需求,这个过程是异步的。

shmop 消息队列 消息队列使用_消息队列_02

针对于同步的通信方式来说,异步的方式,可以让上游(用户)快速成功,极大提高了系统的吞吐量。⽽且在分布式系统中,通过下游多个服务的分布式事务的保障,也能保障业务执⾏之后的最终⼀致性。

小结:消息队列解决具体的是什么问题——通信问题。


三、使用消息队列的好处

  1. 解耦:举一个生活中的例子就是:快递员(生产者)把快递放到快递柜里边(MQ)去,我们(消费者)从快递柜里边去拿东西,这就是一个异步;如果耦合,那么这个快递员相当于直接把快递交给你,这事固然好,但是万一你不在家,那么快递员就会一直等你,这就浪费了快递员的时间。所以解耦这种思想在我们日常开发中,是非常有必要的。
  2. 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,消息队列在中间可以起到⼀个缓冲的作用,把消息暂存在消息队列中,下游服务就可以按照自己的节奏进行慢慢处理。
  3. 异步通信:很多时候,用户不想也不需要立即处理消息。 消息队列提供了异步处理机制,允许用户把⼀个消息放⼊队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
  4. 冗余:可以采用一对多的方式,⼀个生产者发布消息,可以被多个订阅 topic 的服务消费到,供多个毫无关联的业务使用。

四、消息队列的流派

目前消息队列的中间件选型有很多种:

  1. rabbitMQ:内部的可玩性(功能性)非常强。
  2. rocketMQ: 阿里内部⼀个大神,根据kafka的内部执行原理,手写的⼀个消息队列中间件。性能是与Kafka相比肩,除此之外,在功能上封装了更多的功能。
  3. kafka:全球消息处理性能最快的⼀款MQ。
  4. zeroMQ: 直接使用socket进行通信。

这些消息队列中间件有什么区别?

一、有broker

  1. 重topic:Kafka、RocketMQ、ActiveMQ ,整个broker,依据topic来进行消息的中转。在重topic的消息队列里必然需要topic的存在。
  2. 轻topic:RabbitMQ ,topic只是⼀种中转模式。

二、无broker

在生产者和消费者之间没有使用broker,例如zeroMQ,直接使用socket进行通信。


总结

本篇文章主要简单介绍了一下消息的基本概念以及使用消息队列的优点和消息队列的流派。当然使用消息队列也会带来一系列问题,增加了系统的复杂性,以及带来消息丢失和重复消费等一系列问题。在以后的文章中将介绍kafka这款消息队列,同时对这些可能出现的问题提出解决方案。