📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

一、RabbitMQ知识体系
消息模型
RabbitMQ是一款高度灵活的分布式消息队列,它支持多种消息交换模型,这些模型定义了消息如何在生产者和消费者之间传递。以下是几种常见模型的技术实现细节:
-
直连交换器(Direct Exchange):直连交换器将消息根据键(Routing Key)直接路由到与之绑定的队列。在RabbitMQ中,当生产者发送消息时,会指定一个路由键,交换器会根据键查找匹配的队列,并将消息传递到该队列。这种模型在RabbitMQ内部通过查找绑定键与队列的映射表来实现。
-
扇形交换器(Fanout Exchange):扇形交换器会将消息广播到所有绑定的队列。在RabbitMQ中,扇形交换器不需要路由键,它会将接收到的每条消息都传递给所有绑定到它的队列。这种模型的实现依赖于交换器到队列的映射关系。
-
主题交换器(Topic Exchange):主题交换器允许基于消息内容中的关键字段进行匹配,类似于发布/订阅模式。生产者发送消息时,会指定一个路由键,其中包含多个单词,以点号分隔。交换器会根据这些单词进行匹配,路由到对应的队列。在RabbitMQ中,这种匹配是基于正则表达式实现的。
消息传递
消息传递是RabbitMQ的核心功能,它涉及多个关键环节:
-
消息确认机制:RabbitMQ使用确认(acknowledgment)机制来确保消息被正确处理。消费者在处理完消息后,会向RabbitMQ发送一个确认信号,表明消息已经被处理。如果消息在传递过程中丢失或消费者崩溃,RabbitMQ会重新发送该消息。
-
事务消息:事务消息确保消息的原子性。在RabbitMQ中,事务通过开启事务(start transaction)、提交事务(commit)和回滚事务(rollback)来管理。如果事务中的所有操作都成功,则提交事务;如果有任何失败,则回滚事务。
-
死信队列(Dead Letter Queue):死信队列用于处理无法正常路由或处理的消息。例如,如果消息在队列中超过一定时间没有被消费,或者消费者拒绝接收消息,这些消息会被发送到死信队列。
集群架构
RabbitMQ的集群架构允许提高系统的可用性和扩展性:
-
镜像队列(Mirrored Queues):镜像队列在多个节点上创建队列的镜像,确保数据不丢失。当主节点发生故障时,镜像队列可以在其他节点上接管工作。
-
联邦插件(Federation Plugin):联邦插件允许不同节点的RabbitMQ实例共享消息。通过联邦,消息可以在不同的集群之间传递,实现跨集群的数据交换。
-
集群节点类型:RabbitMQ集群中的节点可以分为普通节点、管理节点和监控节点。管理节点负责集群管理和监控,而监控节点则用于收集和分析集群性能数据。
高级特性
RabbitMQ的高级特性扩展了其功能:
-
TTL消息(Time-To-Live):TTL消息设置了消息的存活时间。超过TTL的消息会被自动删除。在RabbitMQ中,TTL可以通过队列属性或消息属性来设置。
-
优先级队列:优先级队列允许消息根据优先级进行排序和优先处理。RabbitMQ支持多个优先级,消费者可以优先处理高优先级消息。
-
RPC模式:RabbitMQ的RPC模式允许客户端发送请求并等待响应。在RabbitMQ中,客户端发送消息到队列,并将响应消息发送到另一个队列,客户端监听该队列以获取响应。
二、RocketMQ知识体系
消息类型
RocketMQ支持多种消息类型,以适应不同的业务需求:
-
定时消息:RocketMQ支持定时消息,允许在指定时间发送消息。在RocketMQ中,定时消息通过延迟队列来实现。
-
事务消息:RocketMQ的事务消息保证消息的原子性。在RocketMQ中,事务消息分为本地事务和全局事务两种模式。
-
延迟消息:RocketMQ支持延迟消息,允许在指定延迟时间后发送消息。在RocketMQ中,延迟消息通过延迟队列来实现。
存储机制
RocketMQ的存储机制是其可靠性的基础:
-
CommitLog设计:RocketMQ使用CommitLog来存储消息的日志文件。每个消息都会被写入到CommitLog中,并且保证不丢失。
-
消息索引:RocketMQ的消息索引允许快速定位消息的位置。消息索引存储在MessageIndex文件中。
-
刷盘策略:RocketMQ的刷盘策略确保消息持久化到磁盘。RocketMQ支持同步刷盘和异步刷盘两种模式。
高可用设计
RocketMQ的高可用设计确保系统稳定运行:
-
主从同步:RocketMQ采用主从同步机制,主节点负责写入消息,从节点负责读取消息。当主节点故障时,从节点可以接管主节点的工作。
-
Dledger选举:在主节点故障时,RocketMQ会自动选举新的主节点。
-
故障转移:在节点故障时,RocketMQ会自动切换到备用节点。
扩展功能
RocketMQ提供了一些扩展功能,增强其可用性和可管理性:
-
消息轨迹:RocketMQ支持消息轨迹,记录消息的传递路径,方便追踪和分析。
-
ACL控制:RocketMQ支持ACL控制,控制对消息的访问权限。
-
多副本机制:RocketMQ的多副本机制提高消息的可靠性。
三、Kafka知识体系
核心组件
Kafka的核心组件包括:
-
生产者分区策略:Kafka的生产者分区策略决定消息如何分配到不同的分区。Kafka支持随机分区、轮询分区和自定义分区策略。
-
消费者组机制:Kafka的消费者组机制允许多个消费者实例协同工作。每个消费者组中的消费者实例都会消费不同分区的消息,确保每个分区中的消息只被消费一次。
-
ISR集合:Kafka的ISR集合维护副本同步的集合,确保数据一致性。ISR集合中的副本被认为是同步的,只有ISR集合中的副本可以接收写入请求。
流处理
Kafka支持流处理,提供以下API:
-
KStream API:KStream API用于构建实时流处理应用程序。它提供了丰富的操作符,如map、filter、reduce等。
-
状态存储:状态存储用于存储流处理应用程序的状态。状态存储可以是内存、磁盘或外部系统。
-
时间窗口:时间窗口用于对数据进行时间窗口划分,进行聚合分析。Kafka支持固定窗口、滑动窗口和会话窗口。
运维监控
Kafka提供了丰富的运维监控工具:
-
副本同步机制:Kafka监控副本同步状态,确保数据一致性。
-
日志清理策略:Kafka支持自动清理旧日志,释放磁盘空间。
-
JMX指标:Kafka通过JMX提供系统性能指标,方便监控和运维。
生态集成
Kafka与其他工具和框架集成,提供以下功能:
-
Connect连接器:Kafka Connect连接器用于数据集成和转换。
-
Schema Registry:Schema Registry用于管理数据模式。
-
KSQL引擎:KSQL引擎提供SQL查询能力,允许用户使用SQL查询Kafka中的数据。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~