开源消息中间件怎么选?从解耦、削峰到高可用,一文讲清核心需求与关键因素
处于繁杂的系统架构里,各个模块之间那种盘根错节的依赖关系,往往而言是拖着低下开发进度的,是引发线上故障的,是如同隐形炸弹一般的存在,就是这样子的情况 。
耦合的本质与代价
所谓耦合涵盖了系统内部模块间会发生紧密调用的情况,在一个简单的企业内部管理系统当中,模块A会直接去调用模块B的接口以此来获取数据,而这种直接依赖在业务简单的时候是比较易于理解且维护的。
但跟着业务拓展,系统繁杂程度飞快急速上升。比如说,在订单模块要一并调用库存模块、支付模块、物流模块这三个模块之时,并且任由其中任何一个模块出现故障都会致使下单不成功的状况下,这样一种网状式的依赖便变成了灾祸,极大程度地削减了系统的可用性能以及开发工作的效率。
消息中间件的核心解耦原理
消息中间件的关键思路是引入一个中间层次,生产者应用把消息发送至队列或者主题里,之后就能够接着处理后续的逻辑,不须等待消费者完成处理 。
消费者应用会依据自身的处理能力,从队列里拉取消息来进行异步消费,这种模式完全切断了服务间的直接调用依赖,把紧耦合的架构转变为借助消息传递的松耦合架构。
从同步阻塞到异步提速
于同步调用模式里,业务流程当中的慢环节会拖累整体,像用户上传视频之后,系统得即刻开展转码、审核、生成缩略图的操作,整个进程有可能耗费数分钟,致使用户请求长时间被阻塞 。
系统在引入消息中间件之后,能够于保存上传记录完毕之时,即刻对用户作出响应,在此过程中,会把转码这类耗时的任务当作消息发送出去,交由后台服务以异步方式予以处理,如此一来,便令前端响应速度以及用户体验得到了极大程度的提升。
流量削峰与系统缓冲
高并发场景当中,瞬时的流量极有可能将后端服务给压垮。像电商秒杀这种情况,开场那一瞬间,或许会有数以十万计的请求潮水般涌入,径直对数据库以及库存服务发起冲击 。
消息中间件于此处担当起了缓冲区的职责,所有下单请求先是以消息的形式蜂拥进入队列,而后端服务依据自身最大的处理能力自队列里匀速地进行消费,借此把脉冲式的流量曲线开展削峰填谷的操作,进而保卫后端系统能够平稳地运行 。
技术选型的核心功能维度
选择类型的时候,首先得弄清楚功能方面的需求。对于高可靠性这一要求而言,消息中间件务必拥有集群部署以及数据多副本的机制,用于避免因为单点故障从而致使消息遗失。消息是一定要支持持久化来存储到磁盘当中的,哪怕服务器重新启动数据也是不会丢失的。
就得针对那些业务场景,去思索是不是得要求消息严格依照顺序来依次进行消费,就像某些金融交易相关的场景那样。与此同时,消息中间件必须能够支撑海量的消息堆积,这样才不会对性能造成明显的影响,而且还得允许按照时间点去再一次回溯进行消费,以此来应对对账工作或者补偿等各种需求。
选型决策的非功能与实施考量
存在这样一种情况,这种情况是除了功能之外,技术栈匹配度占据着至关重要的地位。有一个团队它是基于Java技术栈构建的,然而这个团队却选择了使用用Erlang编写而成的消息队列,那么这样做很有可能会遭遇比较高的学习成本还有运维成本。业内普遍存在选择的方向,而这种普遍意义上的指向是值得进行参考的,因为它能够意味着存在着更为丰富的实践案例以及更为稳定的表现 。
项目生命力的风向标是社区所能达到活跃度状态。若是开源项目,其社区存在频繁更新、活跃讨论情况,那么一般来说能更迅速地对漏洞予以修复,并且更及时地适应新技术需求情形。当到了最终决策阶段,则应当按照清晰且量化的需求框架来开展理性比较行为,以此防止个人技术偏好对判断形成干扰,进而做出更合适决策。
在事情还没发生之前,要断定技术选型绝对的对错可不是一件容易的事儿,其中的关键之处在于,是不是已经深入透彻地理解了自身业务里真实存在的痛点,并且据此做出了与之相适配的、体现责任心的理性抉择 。
当你针对项目开展技术选型之际,那最为纠结且权衡耗时最长的因素一般是什么呢?欢迎于评论区域分享你的经验以及见解。
