消息队列面试解析系列(三)-消息模型辨析(下)

简介: 消息队列面试解析系列(三)-消息模型辨析

RabbitMQ消息模型


少数依然坚持使用队列模型的产品之一。怎么解决多消费者问题的?

RabbitMQ中,Exchange位于生产者和队列间,生产者并不关心将消息发给哪个队列,而将消息发送给Exchange,由Exchange策略决定将消息投递到哪些队列。


image.png


同份消息若需被多消费者消费,需配置Exchange将消息发到多个队列,每个队列都存放一份完整消息数据,可为一个消费者提供消费服务。这也可变相实现发布-订阅模型的“一份消息数据可被多订阅者多次消费”功能。


RocketMQ的消息模型



RocketMQ使用标准的发布-订阅模型,其中的生产者、消费者、主题与前文讲的发布-订阅模型中的概念一致。


RocketMQ还有队列概念,又有何作用?

几乎所有MQ都使用一种非常朴素的“请求-确认”机制,确保消息不会在传递过程中由于网络或服务器故障而丢失。

具体做法也简单。


  • 生产者先将消息发给服务端(即Broker),服务端在收到消息并将消息写入主题或队列后,给生产者发送确认的响应。
  • 若生产者未收到服务端的确认或收到失败的响应,则重新发送;
  • 消费者在收到消息并完成消费业务逻辑(比如将数据保存到数据库)后,也会给服务端发消费成功的确认,服务端只有收到消费确认后,才认为一条消息被成功消费,否则它会给消费者重发送这条消息,直到收到对应的消费成功确认


确认机制保证消息传递过程中的可靠性,但该机制在消费端带来不小问题。

为确保消息的有序性,在某条消息被成功消费前,下条消息是不能被消费的,否则就会出现消息空洞,违背有序性原则。

即每个主题在任意时刻,至多只能有一个消费者实例在进行消费,那就没法通过水平扩展消费者数量提升消费端总体的消费性能。为解决问题,RocketMQ在主题下增加队列概念。


每个主题包含多个队列,通过多队列实现多实例并行生产和消费。注意RocketMQ只在队列保证消息有序性,主题层面无法保证消息的严格顺序。



RocketMQ中,订阅者的概念是通过消费组(Consumer Group)体现。

每个消费组都消费主题中一份完整消息,不同消费组间消费进度彼此不受影响,即一条消息被Consumer Group1消费过,也会再给Consumer Group2消费。


角色完全相同的消费者被分组在一起,称为消费组。通过它,在消息消费方面实现负载平衡和容错非常容易。


Consumer Group的Consumer实例必须具有完全相同的主题订阅。


消费组包含多个消费者,同组的消费者是竞争消费关系,每个消费者负责消费组内的一部分消息。若一条消息被Consumer1消费,那同组的其他消费者就不会再收到该消息。


在Topic的消费过程,由于消息需要被不同组进行多次消费,所以消费完的消息并不会立即被删,这需要RocketMQ为每个消费组在每个队列维护一个消费位置(Consumer Offset),该位置之前的消息都被消费过,之后消息都未被消费过,每成功消费一条消息,消费位置加一。

这个消费位置是非常重要的概念,丢消息的原因大多是由于消费位置处理不当导致。


  • RocketMQ的消息模型的核心概念

image.png


在消费时,为保证消息的不丢失和严格顺序,每个队列只能串行消费,无法做到并发,否则会出现消费空洞的问题。那如果放宽一下限制,不要求严格顺序,能否做到单个队列的并行消费呢?如果可以,该如何实现?

todo


Kafka的消息模型

RocketMQ的完全一致,上节所有RocketMQ中对应的概念,和生产消费过程中的确认机制,都完全适用于Kafka。

唯一区别:

Kafka中,队列概念的名称不一样,Kafka中对应的名称分区(Partition),本质毫无差异。    


总结

队列和主题的区别,这俩概念的背后实际对应两种不同的消息模型:队列模型和发布-订阅模型。这两种消息模型其实并无本质区别,都可通过一些扩展或者变化来互相替代。


  • RabbitMQ采用的是队列模型,但是它一样可以实现发布-订阅功能
  • RocketMQ和Kafka采用的是发布-订阅模型,并且二者的消息模型是基本一致的。



本文消息模型相关概念都是业务层面模型,但业务模型不等于实现层面模型。

比如MySQL和Hbase都是支持SQL的数据库,它们的业务模型中,存放数据的单元都是“表”。

但在实现层面,没有哪个数据库是以二维表方式存储数据,MySQL使用B+树,HBase使用KV结构。

同理,像Kafka和RocketMQ的业务模型基本一样,并非指实现就一样,实际俩实现完全不同。



参考

目录
相关文章
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
438 2
|
11月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
1422 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
机器学习/深度学习 人工智能 算法
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
DeepSeek-R1 通过创新的训练策略实现了显著的成本降低,同时保持了卓越的模型性能。本文将详细分析其核心训练方法。
1314 11
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
|
自然语言处理
高效团队的秘密:7大团队效能模型解析
3分钟了解7大团队效能模型,有效提升团队绩效。
1378 7
高效团队的秘密:7大团队效能模型解析
|
人工智能 自然语言处理 算法
DeepSeek模型的突破:性能超越R1满血版的关键技术解析
上海AI实验室周伯文团队的最新研究显示,7B版本的DeepSeek模型在性能上超越了R1满血版。该成果强调了计算最优Test-Time Scaling的重要性,并提出了一种创新的“弱到强”优化监督机制的研究思路,区别于传统的“从强到弱”策略。这一方法不仅提升了模型性能,还为未来AI研究提供了新方向。
1591 9
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
739 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
888 3
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
210 3
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
672 1
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
1962 2

推荐镜像

更多
  • DNS