消息队列 | 青训营笔记

136 阅读5分钟

消息队列

消息队列是一种解决不同应用间通信、异构系统间数据交换的重要方式,是分布式系统中实现松耦合的重要组件。消息队列(MQ)顾名思义,是把消息排成一队,类似我们平时排队等待服务一样。

消息队列的作用

消息队列提供了一种异步处理程序之间的通信方法,消费者可以在生产者生产消息时来读取这些消息。它的出现,主要是为处理高并发量和异步处理提供一种解决方案。

解耦

通常开发的系统都是一个大型的分布式系统,并且会由于业务不断扩展,而导致服务或功能的不断增加,单一的服务已经远远不能满足业务的需求。因为很多服务之间可能存在紧密的依赖关系,比如直接通过共享同一数据库表或web-service组件进行通讯,一旦其中一个服务发生变化,便不可避免地影响到其他服务的正常运行。而使用消息队列可以将相互之间依赖的服务的耦合度降低到最低,各个服务之间的交互只需要通过消息队列即可完成,从而实现每个服务之间的松耦合。

异步

在现实中,很多场景下,业务处理需要异步执行的需求逐渐增多,但是实现一个高效的异步通信系统是很复杂的。通过消息队列可以实现一些任务异步执行的需求,例如时间敏感性要求不高的发送邮件等。通过异步队列可以降低系统的响应时间,提高用户体验。

流量控制

微服务下限流是十分重要的,通过充分利用消息队列,可以实现分层架构中的流量控制功能,实现高并发的请求分担到不同的机器上,大大降低每一个处理单元的压力。可以通过多个消费者,实现流量的分离,控制流量速度。

消息队列的类型

常用的消息队列类型有多个,包括 RabbitMQ、ActiveMQ、Kafka、RocketMQ 等。这些消息队列都有各自的特点及适用场景。

  • RabbitMQ:是一个消息代理,采用 AMQP(Advanced Message Queuing Protocol)协议,基于 Erlang 语言来实现。它具有轻量级、高可用、易于部署、易于使用的特性,此外还具有插件式的扩展性和极强的可靠性支持。

  • ActiveMQ:是一个开源的基于 JMS(Java Message Service)规范实现的消息中间件,它建立在 Java 平台之上。因为符合 JMS 规范发布/订阅模型,所以和 Java 集成程度较高。ActiveMQ 尤其适合于分布式部署。

  • Kafka:是一个高吞吐量的分布式消息队列,它采用发布/订阅模式,可以轻松地处理消费者之间的负载均衡。以其出色的性能,可扩展性和高可用性而著名。Kafka 在分布式日志处理和流处理应用程序中得到了广泛的应用。

  • RocketMQ:是由 Apache 软件基金会创办的一款分布式消息中间件,它采用了与 Kafka 相似的设计理念,也是基于发布/订阅模式,可以呈现出较高的吞吐量和较低的延迟。

消息队列的应用

消息队列在很多应用场景下都有广泛应用。

异步处理

消息队列可以用于解耦异步请求处理。例如电商系统发起订单创建请求后,可以先把请求放入消息队列中,在后续订单状态变化时异步通知其它观察者系统(如会员积分系统、运费计算系统),从而实现请求处理的异步设计。

分布式任务调度

几乎所有分布式系统的任务调度,都可以使用消息队列实现。例如队列中消息通知某个任务完成,再由下一个服务直接消费队列中的消息继续处理。

流量控制

微服务下限流是十分重要的,通过充分利用消息队列,可以实现分层架构中的流量控制功能,实现高并发的请求分担到不同的机器上,大大降低每一个处理单元的压力。可以通过多个消费者,实现流量的分离,控制流量速度。

削峰填谷

有很多应用场景下,都存在瞬时高峰的业务需求(如秒杀、抢票等),导致系统压力大。常规处理方式是增加机器,但这种方式既费成本,而且的效果不一定好。通过消息队列,可以将积压请求暂存在队列中,做到削峰填谷的功能。

总结

消息队列成为当今互联网技术非常核心的组件之一,所有大型系统都或多或少地使用了消息队列。在分布式系统中,消息队列充当着异构系统之间数据交换的桥梁,让系统在高并发情况下得以顺畅运转。

不同的消息队列提供了不同的实现方式,可以根据自己的业务需求来选择适合的消息队列。与此同时,消息队列的应用场景也非常广泛,应用领域已经涵盖了从基础设施到业务开发的各个领域。学习不同类型的消息队列,可以让我们更好地理解消息队列的优缺点,并且可以更好地应用于实际工作中。