消息队列 | 青训营

38 阅读5分钟

消息队列

一、消息队列的概念

消息队列一般简称为 MQ (Messges Queue),是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,是在消息的传输过程中保存消息的容器。消息队列本质上是一个队列,而队列中存放的是一个个消息。

队列是一个数据结构,具有先进先出的特点。而消息队列就是将消息放到队列里,用队列做存储消息的介质。消息的发送放称为生产者,消息的接收方称为消费者。

消息队列由 Broker(消息服务器,核心部分)、Producer(消息生产者)、Consumer(消息消费者)、Topic(主题)、Queue(队列)和Message(消息体)组成。

二、消息队列的特点

消息队列有三个作用,分别是削峰、解耦和异步。

流量削峰:主要用于在高并发情况下,业务异步处理,提供高峰期业务处理能力,避免系统瘫痪。

应用解耦:主要用于当一个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理时,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合。

异步通信:主业务执行结束后从属业务通过MQ,异步执行,减低业务的响应时间,提高用户体验。

三、常用的消息队列

1. ActiveMQ:是Apache下的一个子项目。

优点:单机吞吐量每秒万级,时效性毫秒级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据。支持多种语言、支持Spring2.0的特性、支持多种传送协议、支持通过JDBC和journal提供高速的消息持久化。

缺点:官方社区现在的维护越来越少;社区活跃度不高。

2. Kafka:是一个分布式消息发布订阅系统。为大数据而生的消息中间件,大数据的杀手锏

  • Topic:主题,就是一个消息队列,一个Kafka集群上运行者多个主题,也就是多个消息队列
  • Partition:分区,为了增强可扩展性,提高吞吐量,引入了分区,一个主题可以被分成多个分区,每个分区运行在集群的一个节点上
  • leader:每个节点可能同时存在多个主题的分区,为了增强集群的高可用,为每个主题的分区都提供了副本,一个分区可以有多个副本,但只有一个能被选为leader,被选为leader的分区对外提供服务,即生产者只将数据存放在leader中,消费者只从leader中获取数据
  • follew:leader的副本,一般情况下只将leader中的数据进行同步,当leader挂掉了,有重新选择一个副本作为leader,对外服务,目的提高系统的可用性
  • CG:消费者组,逻辑意义上的消费者,一个消费者组中有多个消费者,这些消费者订阅了同一个主题,也可能订阅不同的主题,每个消费者消费不同分区的数据,一个分区只能被一个消费者消费,消费者组之间互不影响

3. RocketMQ:阿里系下开源的一款分布式、队列模型的消息中间件,3.0版本名称改为RocketMQ,是阿里参照 kafka 设计思想使用 java 实现的一套消息队列。

  1. 灵活可扩展性:RocketMQ 天然支持集群,其核心四组件(Name Server、Broker、Producer、Consumer)每一个都可以在没有单点故障的情况下进行水平扩展。

  2. 海量消息堆积能力:RocketMQ 采用零拷贝原理实现超大的消息的堆积能力,据说单机已可以支持亿级消息堆积,而且在堆积了这么多消息后依然保持写入低延迟。

  3. 支持顺序消息:可以保证消息消费者按照消息发送的顺序对消息进行消费。顺序消息分为全局有序和局部有序,一般推荐使用局部有序,即生产者通过将某一类消息按顺序发送至同一个队列来实现。

  4. 多种消息过滤方式:消息过滤分为在服务器端过滤和在消费端过滤。服务器端过滤时可以按照消息消费者的要求做过滤,优点是减少不必要消息传输,缺点是增加了消息服务器的负担,实现相对复杂。消费端过滤则完全由具体应用自定义实现,这种方式更加灵活,缺点是很多无用的消息会传输给消息消费者。

  5. 支持事务消息:RocketMQ 除了支持普通消息,顺序消息之外还支持事务消息,这个特性对于分布式事务来说提供了又一种解决思路。

  6. 回溯消费:回溯消费是指消费者已经消费成功的消息,由于业务上需求需要重新消费,RocketMQ 支持按照时间回溯消费,时间维度精确到毫秒,可以向前回溯,也可以向后回溯。