消息队列是什么?

消息队列概述

消息队列(Message Queue,简称 MQ)可以比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

为什么要用消息队列

消息队列的核心就是异步、消峰和解耦。当我们使用消息队列时,可以通过异步处理提高系统性能(削峰、减少响应所需时间),也能降低系统耦合性。

  • 异步(做完了后面的我不管了)
    上游发送消息后可以马上返回,下游可以异步处理消息。
  • 消峰(工作太多了,先放一放慢慢处理)
    消息队列扮演一个缓冲器的作用,保护下游使其可以根据实际的消费能力处理消息。
  • 解耦(怎么处理不管/怎么产生的不管)
    将一个流程的上游和下游拆开,上游专注生产消息,下游专注处理消息。


用户提交评论中, 写入数据库后,存在需要捕捉评论事件的多个逻辑步骤。如果在接口处理过程中,顺序的处理不同的步骤会非常繁琐。利用消息队列我们可以批量的通知各个步骤(异步),无需返回直接处理当次的其他逻辑(解耦)。

使用消息队列带来的一些问题

  • 系统可用性降低:在加入MQ之前,不用考虑消息丢失或MQ挂掉等情况,但引入MQ之后就需要去考虑,这导致系统可用性在某种程度上降低了。
  • 系统复杂性提高: 加入MQ后需要考虑消息被重复消费、消息丢失、消息传递的顺序性等问题。
  • 一致性问题: 消息队列带来的异步提高了系统响应速度,但当消息没有被正确的消费时,会导致数据不一致的情况。

常见的消息队列对比

目前使用较多的消息队列有ActiveMQ,RabbitMQ,RocketMQ,Kafka。

ActiveMQ

ActiveMQ是由Apache出品。它支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
选择建议
ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很慢,不推荐使用。

RabbitMQ

RabbitMQ是一套开源(MPL)的消息队列服务软件,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。

选择建议
RabbitMQ 在吞吐量方面虽然稍逊于 Kafka 和 RocketMQ ,但是由于它基于 erlang 开发,所以并发能力很强,性能极好,延时很低达到微秒级。

因为 RabbitMQ 基于 erlang 开发,所以国内很少有公司有实力做erlang源码级别的研究和定制,不利于二次维护和开发。

如果业务场景对并发量要求不是太高(十万级、百万级),那这四种消息队列中RabbitMQ 一定是首选。

RocketMQ

RocketMQ出自阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。

RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。

选择建议
天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。

RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验。

Kafka

Apache Kafka它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。


一个Kafka集群由多个Broker和一个ZooKeeper集群组成,Broker作为Kafka节点的服务器。同一个消息主题Topic可以由多个分区Partition组成,分区物理存储在Broker上。负载均衡考虑,同一个Topic的多个分区存储在多个不同的Broker上,为了提高可靠性,每个分区在不同的Broker会存在副本。

Kafka号称大数据的杀手锏,谈到大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件拥有百万级TPS的吞吐量,在数据采集、传输、存储的过程中发挥着举足轻重的作用。

目前已经被LinkedIn、Uber、 Twitter、 Netflix等大公司所采纳。
选择建议
Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。

在大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准。

总结

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级 万级 10万级,是一种可以支撑高吞吐的MQ 10万级,吞吐量高是kafka最大的优点
可用性 高,基于主从架构实现高可用性 高,基于主从架构实现高可用性 非常高,分布式架构 非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
时效性 ms级 us级(微秒级延迟是最低的) ms级 ms级
消息可靠性 有较低的概率丢失数据 有较低的概率丢失数据 经过参数优化配置,消息可以做到0丢失 经过参数优化配置,消息可以做到0丢失
功能支持 功能齐全,被大量开源项目使用 由于Erlang 语言的并发能力,性能极好,延时很低 MQ功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准
posted @ 2022-03-17 17:30  当康  阅读(751)  评论(0编辑  收藏  举报