消息中间件MQ最全详解(图文全面总结)

文摘   2024-10-30 17:18   四川  

关注mikechen睿哥十余年BAT架构经验倾囊相授


消息中间件是大型架构的必备中间件,本篇就重点谈谈消息中间件@mikechen睿哥

消息中间件设计

消息中间件(MQ),主要功能主要涉及到:Producer、Broker、消息消费者...等等。

1、生产者(Producer)

主要职责是生成消息并发送到队列,可以理解为消息的“发起者”。

生产者生成的消息,会被打包并发送到指定的队列(Queue),队列负责后续的持久化和管理。

生产者,一般需要支持异步、和同步模式的消息发送。

这里的核心点是:异步模式,可以更高的提高吞吐量、和减少发送等待时间。

2、消息队列(Queue)

这里会涉及到:存储(Broker)、以及消息路由、消息分发...等等。

核心存储模块

负责存储生产者发送的消息,并按照一定的策略持久化消息。

比如:文件系统、数据库。。。等,以保证即使系统崩溃后,消息也不会丢失。

消息管理

包括:对消息的入队(生产者写入)/和出队(消费者读取),并负责处理消息的顺序性、过期和删除。

路由和分发

消息队列可以根据消息主题或标签,进行不同队列或分区的消息路由,使消费者可以根据订阅条件接收特定消息。

3、消费者(Consumer)

负责从队列中接收消息并处理,可以理解为消息的“处理者”。

消费者可以采用拉取模式(主动获取)/或推送模式(由队列推送消息)来接收消息。

消息存储选型

设计消息中间件(MQ)时,需要重点关注:消息存储、传递机制、可靠性保障...等等,高可用设计等几个方面。

首先,消息存储,就会涉及到具体的存储介质。

选择合适的消息存储方式,需要根据具体的业务需求、和系统特点进行权衡。

比如:常见的存储格式有:

1. 内存存储

优点:高性能,低延迟;

缺点:数据易丢失,容量受限;

适用场景:对性能要求极高,可以容忍数据丢失的场景。

2. 文件系统存储

优点:持久化,成本低;

缺点:I/O性能较低;

适用场景:需要持久化但对性能要求不是特别高的场景。

3. 数据库存储

优点:结构化存储,易于管理和查询;

缺点:性能相对较低,成本较高;

适用场景:需要复杂查询和管理的消息系统。

4. 分布式存储

优点:高可用性,易扩展;

缺点:实现复杂,成本较高;

适用场景:大规模分布式系统,需要高可用和易扩展的场景。


消息可靠性

消息的可靠性,也是非常重要的,常见的包含:

1.至少一次处理

使用消息确认机制(ACK),即消费者在接收到消息并处理成功后,发送ACK确认,消息队列才移除该消息。

未收到ACK的消息会被重新投递到消费者,保证消息不会丢失,但可能会被多次处理。

2.最多一次处理

适合对幂等性要求较高的场景,通过消息的去重或检测机制,确保消息被消费后直接删除,不会重复消费。

例如可以在发送ACK前直接删除消息,防止消息的多次传递。

3.正好一次处理(Exactly Once)

通过分布式事务、唯一消息ID或幂等机制来实现,确保消息只被处理一次,适合对数据一致性要求较高的系统。

消息模式实现

消息传递实现,一般都需要实现常见的,比如:点对点模式、以及发布/订阅模式。

1.点对点模式

消息由一个生产者发送到指定队列,只有一个消费者可以消费此消息,适合典型的任务处理或单一消费者场景。

消费者完成处理后,需要发送确认(ACK)来通知MQ已成功消费,队列才能删除该消息。

2.发布/订阅模式

消息被发送到特定主题(Topic),多个订阅者可以订阅该主题,接收并处理消息。

发布/订阅模式适用于广播、事件通知等场景,通常需要保证不同订阅者独立消费各自的消息。

支持持久化订阅,即消费者在离线时仍能接收到重新上线后的未处理消息。

消息重试和错误处理

消息中间件中的重试机制、和错误处理,是确保消息可靠传递的关键组成部分。

1.重试机制

当消费者处理消息失败时,可以实现重试机制,将失败消息重新投递。

常见的方案有:

  • 定时重试:按照预设的时间间隔进行重试;

  • 指数退避:重试间隔随着失败次数增加而增加;

  • 最大重试次数:设置重试上限,避免无限重试。


设置重试次数限制,避免过度重试,常见方案是固定间隔重试、或指数退避(延迟逐步增加的重试策略)。

2.死信队列(DLQ)

超过重试次数后,将消息投递到死信队列,以便后续查看和手动处理。

很多主流的消息中间件,比如:RocketMQ。。。等等,都会有自己的实现。

死信队列还可以用于存储因格式错误、不可达等导致的处理失败消息,便于系统运维分析问题。

3. 错误处理策略

常见的策略,包含:

忽略错误:适用于非关键消息;

重新入队:将失败的消息重新放入队列;

错误通知:向管理员或监控系统发送警报。

4.幂等性处理

确保重复处理同一消息不会导致不良后果,通常通过唯一标识符实现,这里也会涉及到:幂等性的处理等等。

以上


最后送大家一个福利:

送我原创超30万字阿里架构师进阶专题合集


以及给大家整理最全大厂Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件...等必考题答案详解。


需要以上架构专题&面试答案的同学,加我微信即可领取!


添加时备注:资料






mikechen的架构笔记
十余年BAT架构经验倾囊相授!
 最新文章