这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
消息队列已经成为后端架构的重要组件,它提供了异步的消息发布和订阅服务。本文通过具体的场景来分析,为什么需要在系统中引入消息队列,它能带来哪些好处。
让次要逻辑不影响主要逻辑
假设这样一个场景,我们开发了一个社群电商 APP,里面的大部分功能,用户需要注册账号才能使用。在用户注册信息提交到后端服务之后,我们会执行以下几个业务逻辑:
- 在用户信息表创建一个用户。
- 给用户发放新手优惠券,存入相应的表中。
- 给用户发送注册成功的短信。
- 如果用户注册行为来自其他用户的邀请,那么给邀请人发放优惠券。
- 更多的逻辑。
在以上的业务逻辑中,第一步属于主要业务逻辑,我们需要首先保证它成功执行,之后的所有逻辑都是第一步执行成功之后需要执行的业务逻辑,暂且称为次要业务逻辑,不需要保证他们的顺序。
如果我们要在用户进行注册的时候,执行完以上的所有业务逻辑之后,再给用户返回注册成功的响应,那么,就有一个问题:以上所有的步骤中,只要有一个失败了,那么用户就注册失败了,这样会导致系统非常脆弱。
举一个极端的例子,如果我们使用的第三方短信平台出问题了,那么短信发送就会失败,用户注册也会失败。但是从我们的业务逻辑来讲,给用户发送注册成功的短信,其实并没有那么重要。
并且,当用户注册的时候,只要第一步执行成功了,那么他其实就可以在我们的 APP 里做其他的事情了,优惠券、短信、邀请奖励这些都可以在用户正常注册之后再进行。
因此,这里就非常适合使用一个消息系统来处理次要逻辑。当我们向数据库中增加一个用户信息之后,就向消息队列发送一条消息,然后,就可以将成功的内容相应给客户端。
消息系统的消费端,从消息系统中读取到用户注册成功的消息,在执行之后的次要业务。这样就实现了业务逻辑的解藕。
让后端系统保持稳定
另一个场景:我的 APP 越来越受欢迎,用户量已经达到了一定的规模,但是我们发现,用户的访问和交易都集中在每天的个别时间段,用户访问频繁的时候,会有个别服务和数据库顶不住压力,闲的时候 CPU、IO 等指标都很低。比如在频繁交易的时间段,我们需要在每一个交易中处理订单、支付、积分变更、订单状态等等业务,其实有一些类似于几分变更等业务的处理,对实效性的要求并不高,于是,我们打算从这方面入手,解决系统在少数时间段压力大的问题。
消息队列系统正好可以解决这个问题。我们可以把交易流程中的各个子业务,按照实效性的需求分类,把一些实效性要求不高的业务,提交到消息队列,由消息队列的消费方来处理。比起直接处理并在关系型数据库中修改数据,消息队列能在同样时间内应对更大的请求量,消费端从消息队列接收到要处理的业务后再进行处理。虽然消息的消费端仍然需要处理与之前相同的业务流程,并且要操作关系型数据库。但是,消息队列可以在短时间内接受大量的任务请求,待消费端慢慢消化。
假设针对某一个任务,消费端每秒处理 500 个任务,系统忙时每秒需要处理 2000 次用户请求,闲的时候只有忙时的十分之一。那么,有了消息系统的加入,就可以在不影响业务的情况下,缓解服务的波动。
给用户即使反馈
在以上的两个场景中,除了带来上述的好处之外,还带来了一个好处,就是服务端对客户端的响应更及时了。在一个复杂的业务流程中,每一个子业务都需要一定的时间处理,加上网络传输的时间,如果超过 200ms,那么用户就能感知到等待的过程,如果控制在 200ms 以内,用户就能体验到即时的响应。
将一部分业务发送到消息队列进行异步处理,可以缩短住业务执行的时间,让用户得到响应的时间更短。