RabbitMQ从入门到面试(一)

在刚开始接触Rabbitmq 的时候,从网上搜寻了很多资料以便于快速理解,但是这些资料都是零星的分布,并且质量参差不齐无用重复的太多。所以打算写一个Rabbitmq系列的文章,作为一个参考,帮助后来者更好的学习。

消息中间件的简介

1.1 什么是消息中间件

在学习消息中间件之前,我们就听过很多概念,包括:RabbitMQ、ActiveMQ 、RocketMQ、Kafka等。这些所谓的消息中间件也也把我们搞得脑壳疼。
在这里插入图片描述
那么什么是消息队列中间件(Message Queue Middleware,简称MQ)呢,稍微专业一点就是利用高效可靠的消息传递机制与平台无关的数据交流,并且基于数据通信来进行分布式系统的集成。

消息中间件一般有两种传递模式:点对点(Point-to-Point,简称P2P)模式和发布订阅(Pub/Sub)模式。点对点模式主要是基于队列实现,消息生产者发送消息到队列,消息消费者从队列中接收消息,这也就使得消息可以异步传输。在生活中微信已经与我们的生活密不可分,我们经常会关注一些公众号来获取信息,这也就是我们所说的发布和订阅模式。公众号号主,将文章发布到微信公众号平台,订阅者从平台中订阅消息,公众号平台使得也使得消息发布者和订阅者之间相互独立,无需接触就可以保证消息的传递。在众多消息中间件中本文主要介绍RabbitMQ。

1.2 消息中间件的使用场景

曾几何时,你是否有过这样的体验,你怀着激动地心情坐在公司的接待处等待着面试官的到来。不远处你看到面试官穿着拖鞋,抱着一个满是划痕的Mac,是不是拨弄着头顶那仅剩不多的几戳头发。走到你面前开门见山的说道,用过消息中间件吗?你们公司是怎么使用的,简单介绍一下。

面试题:消息中间件的使用场景,为什么要用它?
回答:MQ主要有三个作用,解耦、异步、削峰。
解耦:在实际项目中如果有三个系统ABC,A系统通过接口调用发送数据给BC系统,随着项目的发展又加入D系统,或者C系统不需要数据了,此时又要修改A系统的代码,比较麻烦。因为A系统和其他系统之间的耦合性太高,但是如果使用MQ,A系统将数据发送的MQ中,然后MQ再将数据发送给其他系统,就会大大降低耦合性。

异步:在很多时候应用不想立即处理消息。MQ同时也提供了异步处理机制。A系统发送数据给B系统,B系统如果一直不接收数据,此时A系统就无法结束线程。但是如果使用MQ,A系统可以直接将数据放入MQ中,而不需要等待B系统处理完数据。

削峰:在访问量激增的情况下,系统会无法保证正常使用,但是这样的突发流量不常见,如果单纯为此投入资源,也是一个巨大的浪费。使用MQ就可以支撑访问压力,降低系统因为超负荷的请求而崩溃。
同时MQ的应用还不仅于此,在日志处理中,可以使用Kafka解决大数据环境下的大量日志传输问题。

面试题:MQ有哪些缺点
回答:MQ的优点我们在上面巴拉巴拉的说了很多,但是任何事物都是有双面性的,有优点必然也会存在缺点。比如:系统的可用性也会大大降低了。在系统中加入中间件,如果中间件挂了,那么系统也就无法正常执行。同时系统的复杂度也增大了很多。还有就是会出现一致性问题,如果A系统将数据发送到MQ后返回成功,此时A系统就会认为请求成功了,但是如果MQ将数据发送给其他系统的过程中挂掉了,那么就会出现数据不一致的问题。

如何选择消息中间件

面试官此时漫不经心的看着你说,你们公司生产环境下用的什么消息中间件,为什么选这个?
当我们在回答这种问题时,一定要对常用的消息中间件的性能以及其局限性有一定的了解。
比如:ActiveMQ是比较常用的消息中间件,过去国内很多公司应用广泛,功能比较强大。但是ActiveMQ无法支撑互联网公司的高并发、高负载以及高吞吐量的复杂场景,在互联网公司使用较少多使用于传统企业。

RabbitMQ的好处在于可以支撑高并发、高吞吐性能比较强大,同时拥有非常完善的后台管理界面可以使用,同时支持集群部署,它的开源社区也很活跃版本迭代频率较高。但是RabbitMQ是基于erlang语言开发,所以很少有公司有实力做到erlang源码级别的研究和定制。

RocketMQ是阿里开源的Java项目,经过阿里生产环境的高并发、高吞吐的考验,性能卓越还支持分布式场景的应用,并且RocketMQ是基于Java语言开发,适合深入阅读源码。

Kafka的特点比较明显,它仅仅能提供较少的核心功能,但是提高超高的吞吐量,毫秒级的延时。它的优势在于超高吞吐量的日志采集、实时数据同步与计算,多用于大数据领域。

ActiveMQRabbitMQRocketMQKafka
单机吞吐量比RabbitMQ低万级万级十万级
消息延迟微秒级毫秒级毫秒级
开发语言JavaErlangJavaScala/Java
消息丢失理论上不会理论上不会
社区活跃度

综合以上各种对比:ActiveMQ的性能比较差,没有经过大规模的吞吐量场景验证,社区也不是很活跃,所以不太建议使用。RabbitMQ虽然使用Erlang语言开发,但是开源的,并且性能并较好,社区活跃度也比较高,相比较RocketMQ,它是使用Java开发,如果对自己公司的技术实力有绝对信心,可以使用RocketMQ,否则建议使用RabbitMQ。如果是大数据领域的实时计算、日志采集等可以使用Kafka,社区的活跃度很高,并且几乎是行业内的标准,大家都在使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值