消息队列是什么?
消息队列概述
消息队列(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功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |