前言
在平常管理团队的时候,肯定会遇到这种情况,某种业务问题,有解决方案的技术有很多种,但是不知道该如何选择,技术选型也是一件非常谨慎的事情,事关日后对应服务的维护和拓展,这里就讲讲RabbitMQ、RocketMQ、Kafka这三款MQ该如何选择
选型前提
1、产品必须是开源的
主要是为了应对实际需求,如果开源产品有一点点不满足或者bug,我们也可以下载源码,潜心钻研一下并修改源码,就可以继续使用,方便且实用
2、近几年比较流行的
这个不用说了吧,技术大多数情况下,越流行,说明业务场景的解决方案就越成熟
3、消息传输是可靠的:保证消息不会丢失
这是MQ必须要保证的
4、支持集群,可以横向扩展,包括解决单点故障
这是MQ必须要保证的
5、性能要好,不能用了它之后,反而影响服务响应
这是MQ必须要保证的
RabbitMQ
【背景】
最开始普遍用在电信业务方面的,也是极少数中支持AMQP协议的产品
【优点】
1、轻量级,部署方便且快速
2、支持灵活的配置,在RabbitMQ中存在一个处于生产者和队列之间的交换器模块,可以自定义路由规则,把不同消息发送到指定的队列中,规则也是自定义的,非常人性化,我个人非常喜欢的一个功能
3、RabbitMQ是跨平台的,它支持大多数编程语言,Java肯定是不用说了
【缺点】
1、如果出现消息堆积或阻塞,性能会大幅度下降
2、在RocketMQ和Kafka的对比下,它的性能是最差的。官方测试是每秒处理几万到几十万的消息,如果你有更高的需求,就不要用RabbitMQ了
3、它的开发语言是Erlang,平常我们走Java的,如果对源码进行修改,成本肯定是相当大的,相当于要学习这个语言
RocketMQ?
【背景】?
背景就是阿里出品,那大多数就是精品了,阿里团队参考Kafka的设计并使用Java实现的,最主要的是RocketMQ经住了多次双十一这种大数据传输的场景,性能和可靠稳定性那就不用说了
【优点】
1、Java语言开发的,源码比较亲近,源码的拓展和二级开发,对于我们来说只是时间问题
2、提供了多种场景功能,比如:有序、事务、流计算等等
3、具备了市场定义的消息队列应该具备的所有特性和功能
4、经得住双十一的考验,因为诞生于电商,所以它在响应延迟方面做了很多优化,它的响应大多在毫秒级别,如果需要响应时效的,可以考虑RocketMQ
5、性能比RabbitMQ要好,每秒处理几十万的消息量
【缺点】
它没有像RabbitMQ那样,支持多种语言,可能是因为阿里在设计的时候,是专门为电商设计的,所以就没有考虑为其他平台做兼容,不过对于我们Java的业务场景,大多数情况下是ok的
Kafka?
【背景】?
是一个分布式流媒体平台,Apache出品的一款开源流处理平台
【优点】
1、默认是异步发送和接收消息的,所以性能是杠杠的,比RocketMQ和RabbitMQ都要好,如果是异步并且开启了消息压缩,那Kafka可以达到每秒两千万的消息处理量
2、兼容性也是数一数二的,尤其是大数据和流计算领域,几乎所有相关的开源软件都支持Kafka
3、性能佳,可伸缩,支持消息持久化、分区、副本和容错
4、基于Scala和Java开发的,为啥上面提到对大数据领域比较适用,Scala的衍生品Spark不知道你们有没有听说,是一款大数据领域下很热门的新一代内存级大数据计算框架,所以知道为啥Kafka适用于大数据领域了吧
【缺点】
因为Kafka在批处理和异步方面做了大量的设计和优化,性能是非常好了,但是延迟也会特别高,不适合电商场景
总结?
就我司的场景来说,典型的电商,果断还是选择RocketMQ作为主力,Kafka的应用一般用在日志采集方面,毕竟他是异步的,而且日志的打印也是非常庞大的,RabbitMQ的力度相对就比较小了但是一些特定场景使用RabbitMQ也是没有问题的?
|