消息队列-简介与基础概念

简介与基础概念

  • 一、背景和起源
  • 二、应用场景
    • 1.应用解耦
    • 2.异步处理
    • 3.流量削峰
  • 三、架构图
    • 1.生产者
    • 2.消费者
    • 3.消息存储
    • 4.协调服务
  • 四、基本特性
    • 1.消息消费模式
    • 2.消息重投
    • 3.消息重试
    • 4.消费确认机制
    • 5.顺序性
    • 6.消息回溯
    • 7.重试队列
    • 8.死信队列
    • 9.延迟队列
    • 10.优先级队列
    • 11.消息持久化
    • 12.消息语义
      • 12.1 Least Once
      • 12.2 Most Once
      • 12.3 Exactly Once
    • 13.消息可靠性
    • 14.动态扩缩容
  • 五、高级特性
    • 1.多租户隔离
    • 2.消息生存期
    • 3.事务消息
  • 总结


一、背景和起源

消息队列是一个消息存储组件,是分布式服务框架系统中的一个重要组件。用于应用间通信,消息投递后可以立即返回,消息系统确保消息的可靠性。消息使用者从消息队列获取消息后进行消费。

二、应用场景

消息队列广泛应用在分布式服务框架中,并成为其中的必选组件。主要应用场景为应用解耦、异步处理、流量削峰等三个场景。

1.应用解耦

上下游应用如果存在RPC调用,那么下游服务异常会导致上游应用异常。因此可以将RPC直接调用改为通过消息队列进行交互,这样通过引入消息队列组件,解除了上下游应用的强耦合,可以增强整个系统的可靠性。

2.异步处理

应用过程中有一些业务需要经过很长的处理流程才能完成业务逻辑。在串行处理过程中需要很长的处理时间,会影响系统响应时间和用户的体验。因此下游服务可以从消息队列读取后处理,这样大部分处理流程可以进行异步处理,而不会影响系统响应时间。

3.流量削峰

在一定配置和系统架构情况下,系统的处理能力总是有极限的。如果秒杀活动或者流量激增,超过系统处理上限,会导致应用崩溃。因此可以在应用前端加入消息队列,系统可以按一定频率从消息队列取出消息进行逐步处理和消费。

三、架构图

消息队列主要是包括生产者、消费者、消息存储、协调服务等四个部分。整体架构如下图:
消息队列-简介与基础概念_第1张图片

1.生产者

主要是消息的生产方,在实际场景中生产者都是以集群形式部署,一般情况只有一个消息生产方。

2.消费者

主要是消息的消费方或者订阅方,会获取消息进行后续业务处理。消费者也是以集群形式部署的,一般情况下会有多个消费者进行消息消费。

3.消息存储

消息存储主要是对消息进行持久化存储,接收生产者发送的消息,并且支持消费者对消息的消费。一般会进行多副本保存来保证消息的可靠性,避免单点故障。

4.协调服务

主要是保存消息的存储位置和副本信息、消费者的注册和协调等。

四、基本特性

1.消息消费模式

主要是消费者消费消息时,消费者与消息存储的交换方式。

  • 拉模式:是指消费者主动从消息存储方获取消息。
  • 推模式:是指消息存储主动推送消息给消费者。

2.消息重投

生产者发送消息失败,会自动重新投递

3.消息重试

消费失败,会自动重新尝试再次消费

4.消费确认机制

  • 单条确认:支持消费者单条确认消费成功,单条消费可以避免重复消费,但是性能有限制。
  • 批量确认:支持消费者批量确认消费成功,批量消费性能较高,但是可能出现重复消费情况。

5.顺序性

消息的消费顺序跟生产者生产顺序一致,一般可以保证分区的消息顺序性。

6.消息回溯

消息被消费之后,如果下游系统奔溃或信息丢失,就需要对已消费信息重新消费。

7.重试队列

重试队列是指一个与原消息队列相关的一个队列,此队列用于存放消费失败的消息。

8.死信队列

死信队列是指一个与原消息队列相关的一个队列,此队列用于存放多次消费失败的消息,此队列中的消息需要人工介入处理。

9.延迟队列

生产者有时候希望消息延迟一段时间才被消费者消费,因此有对延迟队列的需求。比如订单未支付延迟取消场景。

10.优先级队列

优先级队列:指的是消息不是按照时间顺序被消费,每个消息包含优先级信息,优先级高的消息会被优先消费。

11.消息持久化

消息队列如何设计和保证消息的持久化,影响到消息队列本身的性能特性。

12.消息语义

12.1 Least Once

消息至少被写入一次。producer如果没有收到ack,需要重试发送消息,一条消息可能写入多次

12.2 Most Once

消息至多被写入一次。producer发送消息到服务端后,不论是否收到ack,都不再重试,消息可能丢失

12.3 Exactly Once

消息确定被写入一次。producer保存发送失败消息再次发送,服务端保证重试多条消息只存储一次

13.消息可靠性

当出现发生硬件故障或者软件故障时,是否会导致消息丢失或者影响消息的生产和消费。

14.动态扩缩容

当业务实际应用中,与评估容量有差异时,是否支持不停机状态下对消息队列进行扩缩容,已有数据是否需要进行重分配。

五、高级特性

1.多租户隔离

一个消息队列实例可以为多个租户提供服务,并且保证租户之间的数据隔离。

2.消息生存期

消息携带生存时间,在生存时间内如果没有被消费会被删除或者放入死信队列

3.事务消息

在分布式系统中保证上下游应用执行一致

总结

消息队列是一个常用的中间件。目前有很多常用的消息队列可供选择,本文仅仅是罗列了消息队列的一些特性,可以根据以上特性和具体业务场景来进行消息队列的选型。


你可能感兴趣的:(消息队列,中间件,架构,系统架构)