消息队列的常见使用场景 | 青训营

103 阅读3分钟

消息队列在软件开发中有许多实际应用场景,它们能够有效地解决各种问题。以下是一些常见的消息队列使用场景:

解耦系统

消息队列可以用来解耦不同的系统组件,使它们能够独立演化。当一个组件需要与另一个组件通信时,它只需将消息发送到消息队列,而不需要直接调用对方的接口。
举个常见业务场景:下单扣库存,用户下单后,订单系统去通知库存系统扣减。传统的做法就是订单系统直接调用库存系统。这种做法的缺点是:

  • 如果库存系统无法访问,下单就会失败,订单和库存系统存在耦合关系
  • 如果业务又接入一个营销积分服务,那订单下游系统要扩充,如果未来接入越来越多的下游系统,那订单系统代码需要经常修改

引入消息队列可以将应用解耦:

  1. 订单系统:用户下单后,消息写入到消息队列,返回下单成功
  2. 库存系统:订阅下单消息,获取下单信息,进行库存操作。

流量削峰

流量削峰也是消息队列的常用场景。消息队列能够帮助应用程序平稳处理高并发的请求和数据流:

  1. 异步处理: 将高峰时段产生的请求或数据写入消息队列,然后在低峰时段使用消费者进行处理。这样可以平滑分摊高峰时段的请求压力,避免对应用程序造成过大的压力。
  2. 延迟处理: 将部分请求或任务延迟处理,通过消息队列进行排队。例如,将某些请求放入消息队列,并设定一个稍后处理的时间,以平稳分散处理压力。
  3. 限流控制: 在消息队列中设置消息消费者的并发数或速率限制。这可以防止过多的请求一次性涌入系统,从而控制系统的负载。

做秒杀实现的时候,需要避免流量暴涨,打垮应用系统的风险。可以在应用前面加入消息队列。假设秒杀系统每秒最多可以处理2k个请求,每秒却有5k的请求过来,可以引入消息队列,秒杀系统每秒从消息队列拉2k请求处理得了。

异步处理

将耗时的任务从主应用中分离出来,通过消息队列异步处理,以提高应用的响应速度和性能。例如,发送电子邮件、生成报表、图像处理等任务可以被放入消息队列中异步执行。

我们经常会遇到这样的业务场景:用户注册成功后,给它发个短信和发个邮件。 如果注册信息入库是30ms,发短信、邮件也是30ms,三个动作串行执行的话,会比较耗时,响应90ms: 如果采用并行执行的方式,可以减少响应时间。注册信息入库后,同时异步发短信和邮件。如何实现异步呢,用消息队列即可,就是说,注册信息入库成功后,写入到消息队列(这个一般比较快,如只需要3ms),然后异步读取发邮件和短信。