Appearance
消息队列
概述
消息队列(Message Queue)是一种用于在分布式系统中进行异步通信的机制。它允许不同的系统组件通过发送和接收消息进行数据交换,而不需要直接的连接。消息队列在系统之间充当中间件,提供可靠的消息传递、存储和处理功能。
主要特点
- 异步通信:消息发送方和接收方不需要同时在线。消息发送后存储在队列中,接收方可以在方便的时候读取消息。
- 解耦:发送方和接收方不直接通信,通过消息队列进行数据交换,从而降低了系统之间的耦合度。
- 持久性:消息队列通常提供消息的持久化存储,保证消息在系统故障时不会丢失。
- 负载均衡:通过消息队列,可以将负载分散到多个处理节点,提高系统的吞吐量和可靠性。
- 顺序保证:某些消息队列实现可以保证消息的顺序性,确保消息按发送的顺序被处理。
工作模式
交换机的两种工作模式:
- 通过标识符路由。消息到达交换机以后,会投递到通过队列的标识符和投递标识符相等的队列中
- 广播模式。消息到达交换机后,会投递到所有的队列中
常见的消息队列系统
- RabbitMQ:基于AMQP协议的开源消息队列系统,支持多种消息模式和持久化机制。
- Apache Kafka:高吞吐量、分布式的消息队列系统,适用于实时数据流处理和日志收集。
- ActiveMQ:Apache基金会下的开源消息队列系统,支持多种协议和持久化方式。
- Amazon SQS:AWS提供的完全托管的消息队列服务,具有高可用性和可扩展性。
INFO
在织信中采用RabbitMQ实现消息队列。
使用场景
- 异步处理:在Web应用中,用户请求可以立即返回响应,后台通过消息队列进行异步处理。
- 任务调度:定时任务或批处理任务可以通过消息队列进行调度和执行。
- 日志收集:系统日志和事件可以通过消息队列收集和处理,便于集中管理和分析。
- 微服务通信:在微服务架构中,服务之间通过消息队列进行通信,减少服务间的直接依赖。
消息读取
消费者消费消息后需要根据消费情况发送回执给系统
- 发送
确认
回执后,系统会从队列中删除消息
。 - 发送
不确认
回执后,如果指定了重新投递
参数,消息会被重新投递到队列中,如果没有设置则会丢弃消息。这种方式一般用在消费消息时出现异常是使用 - 发送
拒绝
回执后,如果指定了重新投递
参数,消息会被重新投递到队列中,如果没有设置则会丢弃消息。
消息确认机制
手动确认
在该模式下,消费者消费消息后需要根据消费情况给Broker返回一个回执,是确认ack使Broker删除该条已消费的消息,还是失败确认返回nack,还是拒绝该消息。开启手动确认后,如果消费者接收到消息后还没有返回ack就宕机了,这种情况下消息也不会丢失,只有接收到返回ack后,消息才会从队列中被删除。
忽略异常自动确认
消费者默认为忽略异常自动确认,不会管消费者是否成功消费/处理了消息
无异常自动确认
- 如果消费者在消费的过程中没有抛出异常,则自动确认。
- 如果抛出异常,则消息会重回队列,如果此时只有一个消费者监听该队列,那么该消息重回队列后又会推送给该消费者,会造成死循环的情况。
重新投递机制
在确认模式是手动确认和根据情况确认时,如果出现异常,就需要有重试投递机制。
默认的重试机制如下:
- 最大重试次数:5次
- 重试最大间隔时间:30分钟
- 重试初始间隔时间:5秒
- 间隔时间乘子:4
第一次重试时间会在5秒后触发,第二次会在45=20秒后触发,第三次是204=80秒后触发,第四次是804=320秒后触发,第五次是3204=1280秒后触发。