在高并发业务场景,典型的阿里巴巴双11秒杀业务中,消息队列中间件在流量调峰解耦方面发挥着不可替代的作用。今天一起来讨论一下:什么是全消息队列?Kafka、RocketMQ、RabbitMQ优缺点对比,以及消息队列的选择。最全的MQ消息队列有哪些?那么目前业界比较知名的新闻引擎有哪些呢?如下图所示:这里几乎列出了比较知名的消息引擎,包括:ZeroMQTwitter的DistributedlogActiveMQ:Apache的老牌消息引擎RabbitMQ,Kafka:AMQP的默认实现。RocketMQArtemis:Apache的ActiveMQ下的子项目Apollo:也是Apache的ActiveMQ的子项目,号称下一代消息引擎商业化的消息引擎IronMQ,实现了JMS(JavaMessageService)标准的OpenMQ。MQ消息队列的技术应用1.解耦解耦是消息队列要解决的最本质的问题。2.最终一致性最终一致性是指两个系统的状态是一致的,要么都成功,要么都失败。最终一致性不是消息队列的必要特性,但你确实可以依赖消息队列以最终一致性做事。3.广播消息队列的基本功能之一就是广播。有了消息队列,我们??只需要关心消息是否已经投递到队列中即可。至于谁要订阅,那是下游的事情,这无疑大大减少了开发联调的工作量。4、错峰和流量控制一个典型的使用场景是秒杀服务用于流量调峰场景。限于篇幅,本文重点介绍消息队列的对比。详细应用场景请参考:《什么是流量削峰?如何解决秒杀业务的削峰场景》。Kafka、RocketMQ、RabbitMQ的比较1、ActiveMQ优势:单机吞吐量:万级话题吞吐量影响:时效性:ms级可用性:高,基于主从架构实现高可用消息可靠性:低probabilityLostdata功能支持:MQ领域的功能极其完备缺点:官方社区现在维护的ActiveMQ5.x越来越少,在大规模吞吐场景中很少使用。2.Kafka被称为大数据的杀手级特性。说到大数据领域的消息传输,就绕不开Kafka。这个大数据的消息中间件以百万级TPS的吞吐量而闻名。它迅速成为大数据领域的宠儿,在数据的采集、传输、存储过程中发挥着举足轻重的作用。ApacheKafka最初是由LinkedIn基于独特的设计实现的分布式提交日志系统(distributedcommitlog),后来成为Apache项目的一部分。它已被LinkedIn、Uber、Twitter和Netflix等大公司采用。优点:性能好,单机写入TPS在百万条/秒左右,优点是吞吐量高。时效性:ms级别可用性:非常高,kafka是分布式的,一份数据多份,少量机器宕机,无数据丢失,无不可用消费者使用Pull获取消息,消息有序,通过控制可以保证所有消息都被消费并且只消费一次;有一个优秀的第三方Kafkaweb管理界面Kafka-Manager;在日志领域比较成熟,被很多公司和多个开源项目使用;功能支持:功能比较简单,主要支持简单的MQ功能,大数据领域的实时计算和日志采集被大规模使用缺点:Kafka单机超过64个队列/分区,负载将显着增加。队列越多,负载越高,发送消息响应时间变长,采用短轮询方式,实时性取决于轮询间隔时间;消费失败不支持重试;支持消息顺序,但是当代理宕机时,消息会乱序;社区更新缓慢;3.RabbitMQRabbitMQ发布于2007年,是一个基于AMQP(高级消息队列协议)的可重用企业消息系统,是目前最主流的消息中间件之一。RabbitMQ的优点:由于erlang语言的特点,mq具有良好的性能和高并发;吞吐量达到万级,MQ功能比较完善。健壮、稳定、易用、跨平台、支持多语言、文档完备;开源提供的管理界面很好,简单易用,社区活跃度高;RabbitMQ缺点:erlang开发,源码难以阅读和理解,基础功能依赖于开源社区的快速维护和bug修复,不利于二次开发和维护。RabbitMQ确实吞吐量较低,因为它做的实现机制比较重。需要学习比较复杂的接口和协议,学习和维护成本比较高。4.RocketMQRocketMQ是阿里巴巴的开源产品,用Java语言实现,设计时参考了Kafka,并做了一些自己的改进。RocketMQ在阿里巴巴集团广泛应用于订单、交易、充值、流计算、消息推送、日志流处理、binglog分发等场景。RocketMQ优势:单机吞吐量:10万级可用性:很高,分布式架构消息可靠性:经过参数优化配置,消息可以做到零丢失功能支持:MQ功能比较完善,还是分布式的,具有很好的扩展性支持积累10亿级别的消息不会因为堆积而导致性能下降。源代码是java。我们可以自己阅读源码,定制自己公司的MQ,控制RocketMQ。缺点:支持的客户端语言不多,目前有java和c++,其中C++不成熟;社区活动一般不会在mq核心实现JMS等接口,部分系统迁移需要修改大量代码。消息队列选型建议1.KafkaKafka的主要特点是基于Pull方式处理消息消费,追求高吞吐量,最初的目的是收集和传输日志,适用于产生大量数据的互联网服务的数据收集业务。大公司建议可以用。如果有日志收集功能,那肯定是Kafka。2.RocketMQ为金融互联网领域而生。对于可靠性要求高的场景,尤其是电商中的扣单、业务调峰,当大量交易涌入时,后端可能无法及时处理。RocketMQ在稳定性方面可能更值得信赖。这些业务场景已经在阿里双11测试过多次,如果你的业务有以上并发场景,建议选择RocketMQ。3.RabbitMQRabbitMQ:结合erlang语言本身的并发优势,性能更好,社区活跃度更高,但不利于二次开发和维护。不过RabbitMQ的社区非常活跃,可以解决开发过程中遇到的bug。如果你的数据量不是那么大,小公司更愿意选择功能比较齐全的RabbitMQ。
