前言
现在很多项目基本都是采用采用微服务分布式架构了,但是在分布式系统中,组件之间的通信通常面临诸多挑战,如网络延迟、故障恢复、负载均衡等。消息中间件作为一种关键的分布式组件,在解决这些问题方面具有重要价值。本文将介绍消息中间件在分布式系统中的作用,以及它在解耦、异步调用、流量削锋和柔性事务方面的应用。
解藕
在传统的分布式系统中,组件之间的直接调用容易导致耦合度过高,降低了系统的可维护性和可扩展性。消息中间件通过提供统一的通信接口,实现组件间松耦合,使得各系统能够独立进行开发和部署,降低系统间的相互影响。比如以下场景:
不同服务调用,下单扣减库存,订单服务调用库存服务,如果直接调用库存服务扣减接口,一旦扣减API接口修改(参数变了),订单服务就要修改调用代码。
所以,利用消息中间件进行解耦,下单直接把商品id,用户id等必要信息,发送给中间件,无需关心扣减接口参数,库存服务订阅该消息,然后在分析那个商品扣取库存。类似生产者消费者模式。
异步调用
消息中间件也支持异步调用,允许发送方将消息发送到中间件,而无需等待接收方的响应。这种方式有效地提高了系统响应速度,降低了发送方的等待时间。同时,异步调用可以很好地应对高并发场景,提高系统的吞吐量。
比如广播消息,点对点,不同服务监听到。先发送消息给用户,然后服务端异步再去处理数据库保存操作,无需等到数据操作完在响应给用户。
再或者用户操作之后需要发送邮件跟短信,保存数据库操作之后,发送消息给消息队列,提示用户,后台在慢慢异步处理发送邮件和短信。
流量消锋
在高流量场景下,系统可能会面临瞬间的流量高峰。消息中间件通过缓存消息和异步处理的方式,有效地分摊请求压力,实现流量削锋,保证系统的稳定性和响应速度。当系统收到大量请求时,可以将部分请求作为消息发送到消息中间件,而不是立即进行处理。消息中间件会根据其处理能力逐步消费这些消息并进行相应的处理。这样,可以将请求压力分散到不同的时间段,降低系统在高峰时刻的压力。
很典型的例子就说秒杀活动,把请求放到消息队列,放不了的就直接拦截,发送消息提示,然后服务才一个个处理消息队列的请求。
分布式事务的一种解决方案(柔性事务)
在分布式事务中,需要保证事务的一致性、隔离性和持久性(即ACID特性)。然而,在分布式系统中实现强一致性的事务处理往往面临诸多挑战。采用柔性事务(如两阶段提交、补偿事务、Saga等)是一种解决分布式事务的可行方案。
柔性事务的核心思想是在一定程度上放宽事务的约束条件,实现最终一致性。例如,在电商场景中,用户下单和扣库存是两个独立的子系统,可以通过Saga模式来实现分布式事务。Saga模式将整个过程划分为若干个本地事务,并通过事件驱动的方式协调这些事务的执行。在执行过程中,如果某个子事务失败,Saga会根据预定义的策略进行补偿操作,使得整个事务达到最终一致性。
典型的例子,Rabbitmq延迟消息队列解决分布式最终一致性。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!