原文:mp.weixin.qq.com/s/J591FoCbl…
一、消息队列能干什么?
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下:作用:提升性能、系统解耦、流量消峰
1、提升性能:
一个请求调用了A、B两个系统,执行业务逻辑各需要20 、200毫秒,那么处理这个请求一共需要220毫秒。引入MQ后:发送消息给MQ的速度是很快的(没有业务逻辑、没有数据库操作),所以引入MQ后,20多毫秒就可以返回结果给用户了。
2、系统解耦:
系统A和系统B通过同步调用的模式耦合在了一起,一旦系统B出现故障,很可能会影响系统A也有故障,而且系统A还得去关心系统B的故障,去处理对应的异常,这是很麻烦的。
引入MQ后:B如果出现了故障,对系统A根本没影响,系统A也感觉不到,B自己处理自己的问题!
3、流量消峰:
如果高并发访问系统A(A没有数据库操作),A调用B(B有数据库操作),那么瓶颈在B,因为数据库操作是比较耗时的。
同样的机器配置下,如果数据库可以抗每秒6000请求,MQ至少可以抗每秒几万请求。因为数据库复杂,需要支持事务、复杂的SQL查询等
引入MQ后:A系统依赖支持高并发的MQ,B也依赖MQ,此时B可以用自己的合适的速度访问MQ,即B系统流量被消峰了。整个系统的性能由A决定,而不速度慢的B决定。
二、几种MQ的对比
目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Activitymq。
ActiveMQ和RabbitMQ这两者因为吞吐量还有GitHub的社区活跃度的原因,在各大互联网公司都已经基本上绝迹了,业务体量一般的公司会是有在用的,但是越来越多的公司更青睐RocketMQ这样的消息中间件了。
1、吞吐量
- Rabbitmq,Activitymq单机吞吐量是万级别的
- Rocketmq、kafka是十万级别的
现在这样大数据的年代吞吐量是真的很重要。
比如现在突然爆发了一个超级热点新闻,你的APP注册用户高达亿数,你要想办法第一时间把消息全部推送到每个人手上,你没有大吞吐量的消息队列中间件用啥去推?
再说这些用户大量涌进来看了你的新闻产生了一系列的附带流量,你怎么应对这些数据,很多场景离开消息队列基本上难以为继。
2、消息丢失
- Rabbitmq基本不丢失消息
- Activitymq有较低的概率丢失数据
- Rocketmq、kafka经过参数优化配置,可以做到0丢失
3、部署方式
- Rabbitmq,Activitymq不如Rocketmq、kafka,他们都是高可用的分布式架构,而且数据多个副本的数据也能做到0丢失。
4、Rocketmq、kafka优势
(1)、RocketMQ(阿里开源的),git活跃度还可以。基本上你push了自己的bug确认了有问题都有阿里大佬跟你试试解答并修复的,我个人推荐的也是这个,他的架构设计部分跟同样是阿里开源的一个RPC框架是真的很像(Dubbo)可能是因为师出同门的原因吧。
(2)、Kafka,这是个大哥,号称最好的mq。应用于大数据领域,公司的日志采集,实时计算等场景,都离不开他的身影,他基本上算得上是世界范围级别的消息队列标杆了。
以上这些都只是一些我自己的个人意见,真正的选型还是要去深入研究的,不然那你公司一天UV就1000你告诉我你要去用Kafka我只能说你吃饱撑的。
记住,没有最好的技术,只有最适合的技术,不要为了用而用