关注△mikechen睿哥△,十余年BAT架构经验倾囊相授
消息中间件设计
消息中间件(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、中间件...等必考题答案详解。
需要以上架构专题&面试答案的同学,加我微信即可领取!
添加时备注:资料