【选型】消息中间件选型

摘要:
目录1。概述什么是消息中间件?消息队列中间件是指使用高效可靠的消息传递机制进行独立于平台的数据交换,以及基于数据通信的分布式系统的集成。这反映在简历中,MQ用于去耦。系统的复杂性得到了改善:如何确保在添加MQ时不会重复使用消息?

目录

一、概述   

       什么是消息中间件?

二、消息队列的使用场景  

       为什么使用消息队列?

       消息队列有什么优缺点?

三、目前流行的消息队列优缺点对比

四、总结     

一、概述   

       什么是消息中间件?

消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。个人感觉比价场景应用核心的有三个:解耦、异步、削峰。

二、消息队列的使用场景  

       为什么使用消息队列?

其实这个话题也是面试官经常问询的问题,问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么

期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用MQ可能会很麻烦,但是你现在用了MQ之后带给了你很多的好处

现在你可以下想想你如何回答上述问题,想不起来?  好吧我这里先介绍几个常见使用场景,提醒下。。。

解耦:现场画个图来说明一下,

【选型】消息中间件选型第1张

A系统发送个数据到BCD三个系统,接口调用发送,那如果E系统也要这个数据呢?那如果C系统现在不需要了呢?现在A系统又要发送第二种数据了呢?A系统负责人濒临崩溃中。。。再来点更加崩溃的事儿,A系统要时时刻刻考虑BCDE四个系统如果挂了咋办?我要不要重发?我要不要把消息存起来?头发都白了啊。。。

 【选型】消息中间件选型第2张

这是你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用MQ给他异步化解耦,也是可以的,你就需要去考虑在你的项目里(做过微服务项目的同学这里是不是考虑下  消息总线 搭配Rabbitmq 做解耦 用于广播配置文件的更改或者服务间的通讯?),是不是可以运用这个MQ去进行系统的解耦。在简历中体现出来这块东西,用MQ作解耦。

异步:现场画个图来说明一下,

 【选型】消息中间件选型第3张

【选型】消息中间件选型第4张


A系统接收一个请求,需要在自己本地写库,还需要在BCD三个系统写库,自己本地写库要3ms,BCD三个系统分别写库要300ms、450ms、200ms。最终请求总延时是3 + 300 + 450 + 200 = 953ms,接近1s,用户感觉搞个什么东西,慢死了慢死了。

更改为 异步后当消息发送到消息队列  自行让对应系统进行消费即可  所以给用户的体验为20 + 5 = 25ms  ,快 好快!

削峰:每天0点到11点,A系统风平浪静,每秒并发请求数量就100个。结果每次一到11点~1点,每秒并发请求数量突然会暴增到1万条。但是系统最大的处理能力就只能是每秒钟处理1000个请求啊。。。尴尬了,系统会死。。。

 【选型】消息中间件选型第5张

【选型】消息中间件选型第6张

 消息队列有什么优缺点?

优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰

缺点呢?显而易见的

 【选型】消息中间件选型第7张

系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ挂了咋整?MQ挂了,整套系统崩溃了,你不就完了么。

系统复杂性提高:硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已

一致性问题:A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,咋整?你这数据就不一致了。

所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,最好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了10倍。但是关键时刻,用,还是得用的。。。

目前流行的消息队列优缺点对比

kafka、activemq、rabbitmq、rocketmq都有什么优点和缺点啊?

常见的MQ其实就这几种,别的还有很多其他MQ,但是比较冷门的,那么就别多说了

作为一个码农,你起码得知道各种mq的优点和缺点吧,咱们来画个表格看看

 【选型】消息中间件选型第8张


综上所述,各种对比之后,总结如下:

一般的业务系统要引入MQ,最早大家都用ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了;

后来大家开始用RabbitMQ,但是确实erlang语言阻止了大量的java工程师去深入研究和掌控他,对公司而言,几乎处于不可控的状态,但是确实人是开源的,比较稳定的支持,活跃度也高;

不过现在确实越来越多的公司,会去用RocketMQ,确实很不错,但是我提醒一下自己想好社区万一突然黄掉的风险,对自己公司技术实力有绝对自信的,我推荐用RocketMQ,否则回去老老实实用RabbitMQ吧,人是活跃开源社区,绝对不会黄

所以中小型公司,技术实力较为一般,技术挑战不是特别高,用RabbitMQ是不错的选择(我们项目也正在使用这个^_^);大型公司,基础架构研发实力较强,用RocketMQ是很好的选择

如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范


转自:https://blog.csdn.net/java_zyq/article/details/80022391

免责声明:文章转载自《【选型】消息中间件选型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇刷爆github小绿点C#中SetWindowPos函数详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity碰撞消息(OnCollisionXXXX)和触发消息(OnTriggerXXXX)的调用情境

MonoBehaviour中的消息非常多,一共有62个! 除了必须关注的脚本生命周期的一系列函数外,还有其他两组比较常混淆的消息:碰撞和触发。 按3D和2D物体区分,又分为碰撞:Collision、Collision2D。触发:Trigger、Trigger2D。 以3D物体为例做了如下实验,分别测试下OnColiisionXXXX碰撞消息和OnTrigg...

CAT 监控搭建

简介 CAT 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。 开源地址:https://github.com/dianping/cat/ D...

Qt for windows消息循环、libqxt分析和wince快捷键处理

Qt for windows消息循环、libqxt分析和wince快捷键处理 利用Qt做windows图形界面开发和MFC相比,个人感觉还是比较简单好用的:首先利用Designer工具搞个ui文件;然后在程序中写几个信号和槽;然后加载ui文件;最后显示界面就搞定了。 在界面开发中,快捷键处理肯定是必不可少的。现在使用的是开源的第三方处理类:libqxt。它...

wParam与lParam的区别

wParam与lParam的区别 lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数。 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);wParam 通常用来存储小段信息,如,标志lParam...

网络文件下载(提供多种下载方式)

(1)使用 NSURLConnection 直接方式 (2)使用 NSURLConnection 代理方式 (3)使用 NSURLSession 直接方式 (4)使用 NSURLSession 代理方式 (5)使用 AFNetworking 方式 附加功能: (1)使用 AFNetworking 中的 AFNetworkReachabilityManage...

iOS开发——远程消息推送的实现

       在我们使用App的过程中。总是会收到非常多的消息推送。今天我们就要来实现这个功能。首先消息推送分为本地消息推送和远程消息推送。而当中又以远程消息最为经常使用。 可是在推送远程消息之前。有两个前提条件。你须要购买苹果的开发人员账号,也就是每年99刀;而且有一台iOS真机(模拟器不能測试推送)。事实上远程推送须要有server,可是我们自己临时...