Skip to content

消息队列

概述

消息队列(Message Queue)是一种用于在分布式系统中进行异步通信的机制。它允许不同的系统组件通过发送和接收消息进行数据交换,而不需要直接的连接。消息队列在系统之间充当中间件,提供可靠的消息传递、存储和处理功能。

主要特点

  1. 异步通信:消息发送方和接收方不需要同时在线。消息发送后存储在队列中,接收方可以在方便的时候读取消息。
  2. 解耦:发送方和接收方不直接通信,通过消息队列进行数据交换,从而降低了系统之间的耦合度。
  3. 持久性:消息队列通常提供消息的持久化存储,保证消息在系统故障时不会丢失。
  4. 负载均衡:通过消息队列,可以将负载分散到多个处理节点,提高系统的吞吐量和可靠性。
  5. 顺序保证:某些消息队列实现可以保证消息的顺序性,确保消息按发送的顺序被处理。

工作模式

工作模式

交换机的两种工作模式:

  • 通过标识符路由。消息到达交换机以后,会投递到通过队列的标识符和投递标识符相等的队列中
  • 广播模式。消息到达交换机后,会投递到所有的队列中

常见的消息队列系统

  • RabbitMQ:基于AMQP协议的开源消息队列系统,支持多种消息模式和持久化机制。
  • Apache Kafka:高吞吐量、分布式的消息队列系统,适用于实时数据流处理和日志收集。
  • ActiveMQ:Apache基金会下的开源消息队列系统,支持多种协议和持久化方式。
  • Amazon SQS:AWS提供的完全托管的消息队列服务,具有高可用性和可扩展性。

INFO

在织信中采用RabbitMQ实现消息队列。

使用场景

  • 异步处理:在Web应用中,用户请求可以立即返回响应,后台通过消息队列进行异步处理。
  • 任务调度:定时任务或批处理任务可以通过消息队列进行调度和执行。
  • 日志收集:系统日志和事件可以通过消息队列收集和处理,便于集中管理和分析。
  • 微服务通信:在微服务架构中,服务之间通过消息队列进行通信,减少服务间的直接依赖。

消息读取

消费者消费消息后需要根据消费情况发送回执给系统

  • 发送确认回执后,系统会从队列中删除消息
  • 发送不确认回执后,如果指定了重新投递参数,消息会被重新投递到队列中,如果没有设置则会丢弃消息。这种方式一般用在消费消息时出现异常是使用
  • 发送拒绝回执后,如果指定了重新投递参数,消息会被重新投递到队列中,如果没有设置则会丢弃消息。

消息确认机制

手动确认

在该模式下,消费者消费消息后需要根据消费情况给Broker返回一个回执,是确认ack使Broker删除该条已消费的消息,还是失败确认返回nack,还是拒绝该消息。开启手动确认后,如果消费者接收到消息后还没有返回ack就宕机了,这种情况下消息也不会丢失,只有接收到返回ack后,消息才会从队列中被删除。

忽略异常自动确认

消费者默认为忽略异常自动确认,不会管消费者是否成功消费/处理了消息

无异常自动确认

  1. 如果消费者在消费的过程中没有抛出异常,则自动确认。
  2. 如果抛出异常,则消息会重回队列,如果此时只有一个消费者监听该队列,那么该消息重回队列后又会推送给该消费者,会造成死循环的情况。

重新投递机制

在确认模式是手动确认和根据情况确认时,如果出现异常,就需要有重试投递机制。

默认的重试机制如下:

  • 最大重试次数:5次
  • 重试最大间隔时间:30分钟
  • 重试初始间隔时间:5秒
  • 间隔时间乘子:4

第一次重试时间会在5秒后触发,第二次会在45=20秒后触发,第三次是204=80秒后触发,第四次是804=320秒后触发,第五次是3204=1280秒后触发。