身处分布式系统里,数据流动所具备的可靠性属于关键挑战,鉴于此,消息中间件化作协调不同模块展开通信的重要基础 。
消息中间件的作用与价值
于典型的用户注册情形里,系统得去处理好些后续任务,像发送邮件以及短信这般。要是通过串行方式逐个执行,那会致使注册的整体响应时间被拖慢,进而对用户体验造成影响。
倘若是以并行的方式,同时去触发这些任务,虽说响应速度变快了,然而流程的管理以及错误处理却变得繁杂起来,一旦有一个任务失败了,便很有可能对全局造成影响。消息中间件能够把这些任务进行解耦,注册服务仅仅只需发布一条消息,后续再由不同的消费者以异步的方式去处理 。
异步解耦应对高峰
于“双11”这般的电商高峰之际,订单量会出现激增的情况,库存更新请求同样会增加。传统模式是订单系统直接对库存接口进行调用,万一库存服务出现响应滞后的状况,那么整个订单流程就会陷入卡顿状态。
在引入消息队列之后,订单系统一旦生成订单消息,那便能够响应成功,库存系统会从队列里面依照自身处理的能力去消费消息从而进行扣减。这样的一种方式达成了关键业务相互之间的解耦,回避了系统之间直接性的性能依赖。
缓冲与削峰填谷
于秒杀活动之际,巨大流量瞬间涌入,极易冲垮应用服务器。在此种场景当中,把请求放进消息队列,并且让后端服务依循自身可承受的速率去处理,如此便起到了有效的缓冲作用。
人们把这种做法命名为“削峰填谷”,它会把瞬时出现的高峰请求,平摊到更为漫长的时间段里面进行处理,进而保护了后端系统的稳定性,虽说这样做也许会使得用户等待的时间有所增加,不过却保证了服务不会出现崩溃的情况 。
可靠性与数据持久化
消息传输具备的可靠性,是极其重要的。优良的消息中间件,借助持久化机制,保障消息于发送之后,就算遭遇系统故障,也不会出现丢失情况,一般来讲,会把消息写入磁盘。
要是为了去应对单点故障这种情况,现代的消息队列都是支持展开集群部署的。集群能够达成横向扩展这个行为,以此来提升总体的性能表现,并且在某个节点出现失效状况的时候,是由其他节点去接管相应服务的,最终保证系统整体具备高可用性 。
主流产品的特性比较
RabbitMQ是一款有着较长历史的开源产品,它具备全面的功能,严格依照AMQP协议运行,借助交换器机制能够达成灵活的消息路由功能。然而,在应对海量消息处理时,其性能或许会演变成瓶颈 。
Kafka从设计开始就旨在实现高吞吐,它运用顺序读写磁盘以及批处理设计,则能够轻易达成每秒千万级别的消息处理,它于大数据和流计算范畴已成为实际标准,其生态兼容性十分出色。
引入消息队列的权衡
并非没有代价才作出引入消息队列这个行为,它自身摇身一变成为了能决定整个态势之全新关键系统,架构的复杂性因之而得以增加,一旦消息队列集群出现故障,所有对它有所依赖的业务都存在可能陷入停滞状态的情况。
采用消息队列进而能够产生全新的技术难题,像怎样避免消息遭重复消费,还有怎样保障分布式事务的最终一致性。这些难题得依据业务场景设计专门的解决办法,致使开发成本有所提升。
就您的系统架构不断演进的进程当中,究竟为何种确切的性能方面的瓶颈,或者是业务范畴内的痛点,最终致使您做出决定,去引入消息中间件呢?


