消息队列简介

112 阅读3分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

现在的高并发框架,基本都离不开消息队列,那么什么时消息队列呢?使用消息队列能给我们带来什么好处呢?下面我们就来探讨下

1. 什么是消息队列

顾名思义,消息队列就是存放消息的队列,早期的消息队列就是通过队列实现的,而现在的消息队列有了更复杂的功能模式,例如RocketMQ使用的就不是队列模式,而是主题模式

2. 为什么要使用消息队列?

使用消息队列可以有以下三个好处。

2.1 异步

传统模式: 业务逻辑以同步的方式运行,在串行的模式下对于整条业务链路等待时间较长,而且浪费了接口的并发带来的性能提高。

中间件模式: 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度,但是你需要注意的是,整个流程的时长是没变的。

2.2 解耦

传统模式: 系统间耦合性太强,如果系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!

中间件模式: 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。如果没有消息队列,每当一个新的业务接入,我们都要在主系统调用新接口、或者当我们取消某些业务,我们也得在主系统删除某些接口调用。有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,接下来收到消息如何处理,是下游的事情,无疑极大地减少了开发和联调的工作量。

2.3 削峰

传统模式: 并发量大的时候,所有的请求直接堆积到数据库,造成数据库连接异常,会引起系统崩溃,甚至可能会影响到其他使用同一个数据库的系统正常运行。

中间件模式: 引入消息中间件后就能使系统平稳的处理大流量,让各服务尽自己所能地去消息队列中取消息和消费消息 ,这样即使处理速度慢一点也无所谓,只要我们的系统没有崩溃就行了。

3. 消息队列的副作用

当然,使用消息队列也不是没有副作用得。

  1. 引入消息中间件后,我们需要考虑使用中间件而产生的消息可靠传输、顺序消费、重复消费、分布式事务、消息堆积、消息持久化等问题,使得整个系统的复杂度上升

  2. 当消息队列出问题的时候,会影响到系统的运行。因此使用消息队列降低了系统的可用性

  3. 如果上游实时关注执行结果,使用消息队列可能会造成结果延迟,因此在这种情况下不建议使用消息队列。