OJ模拟面试3(异步判题架构)

news/2025/10/23 18:38:49/文章来源:https://www.cnblogs.com/cabbagehp/p/19161386

1、请详细描述一条判题消息从生产到消费的完整生命周期。你在生产者端、Broker端和消费者端分别做了哪些具体配置和编码保证?
这是一个考察消息队列端到端可靠性的经典问题。我的设计目标是:消息绝不能丢

  1. 生产者端 -> RabbitMQ:确保消息成功送达Broker
    1.1 机制:启用 Publisher Confirm 机制。
    1.2 实现
    1) 在生产者代码中,将信道(Channel)设置为 confirm 模式。
    2)发送消息后,异步监听确认回调。
    3)在回调中,如果收到 ack,表示消息已持久化到磁盘(如果是持久化消息)。如果收到 nack 或超时未收到确认,则进行重试。
  2. Broker端:确保消息在RabbitMQ重启后不丢失
    2.1 机制:队列和消息都持久化。
    2.2 实现:
    1)队列持久化:在声明队列时,设置 durable = true。
    2)消息持久化:在发送消息时,将 delivery_mode 属性设置为 2 (MessageProperties.PERSISTENT_TEXT_PLAIN)。
    这样即使RabbitMQ服务器宕机重启,队列和消息也能恢复。
  3. 消费者端 -> 业务处理:确保消息被成功消费
    3.1 机制:启用 手动确认模式,并保证业务处理与确认的原子性。
    3.2 实现:
    1)关闭自动确认 autoAck = false。
    2)只有在判题业务完全成功(包括代码执行、结果写入数据库等所有步骤完成后),才调用 channel.basicAck(deliveryTag, false) 进行手动确认。
    3) 如果处理过程中抛出异常,则调用 channel.basicNack(deliveryTag, false, true),让消息重新回到队列,等待再次被投递。
    2、为什么需要幂等性?在什么场景下会导致RabbitMQ向消费者投递重复的消息?
  4. 为什么需要:因为网络不确定性和消费者故障可能导致同一条消息被多次投递和处理。如果判题操作不是幂等的,用户提交一次代码,可能会在排行榜上增加多次积分,或者产生多条一模一样的判题记录,这绝对是业务灾难。
  5. 重复投递场景:
    1)消费者超时:消费者处理时间过长,超过了RabbitMQ的 consumer_timeout,Broker会认为消费者死亡,从而将消息重新投递给其他消费者。
    2)消费者崩溃:消费者在处理消息后、发送ACK之前突然崩溃,消息会重新入队。
    3)网络抖动:ACK确认消息在网络传输中丢失。
    3、请深入讲解你实现幂等校验的完整技术和业务流程。
  6. 生产者(接收提交请求的服务)在创建判题任务时,生成一个全局唯一的标识作为幂等Token。这个标识通常是 SubmissionId(业务主键)或者一个雪花算法生成的UUID,随消息体一同发送。
  7. 消费者在开始处理消息前,先执行幂等校验。
  8. 校验通过,开始判题;校验不通过,直接丢弃消息并ACK。

4、如果消费者从MQ拉取消息后,在判题完成之前,应用崩溃了,会发生什么?
这是一个检验消息可靠性机制是否健全的完美问题。

  1. 会发生什么:因为消费者开启了手动确认模式且尚未发送ACK,当消费者通道关闭时,RabbitMQ会检测到这一点,从而判定该消息交付失败。
  2. 如何确保不丢失:RabbitMQ会自动将这条消息重新入队,并将其准备投递给下一个可用的消费者(或者等当前消费者重启后再次投递给它)。
  3. 与幂等性的关系:这正是幂等性设计至关重要的原因!当消息被重新投递给新的消费者时,会再次触发幂等校验。由于之前崩溃的消费者已经在Redis中设置了 PROCESSING 状态键,新消费者会认为这是一个重复消息,从而安全地跳过处理或等待。这完美地避免了因为消费者崩溃而导致的任务重复执行。

5、如何保证同一个用户的多个连续提交,其判题结果的返回顺序与提交顺序一致?
这是一个消息顺序性问题。在分布式环境下,保证全局顺序极其困难且代价高昂。我的设计权衡是:不保证全局顺序,但保证用户级顺序。
我的解决方案:

  1. 用户级消息分区:不再使用一个全局的 judge.queue。而是为每个用户创建一个逻辑上的“消息通道”。在RabbitMQ中,可以通过在路由键中加入用户ID哈希来实现,例如 judge.queue.user.%userId%,或者更实际一点,使用一致性哈希将同一用户的请求路由到同一个队列。
  2. 单消费者串行化:确保每个用户队列只有一个消费者。这样,同一个用户的消息在队列里是顺序的,并被同一个消费者串行处理,自然就保证了顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/944589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Edge浏览器网页设置深色模式(仅搜索结果界面)

偶然清除了Edge的浏览数据后发现搜索结果界面变成了白色,很不适应,于是在网络搜索,基本都非常相似,主要分为两种方法Edge浏览器网页设置深色模式/暗模式的小技巧_网页深色模式-CSDN博客①在Edge浏览器打开edge://f…

2025 年 AI 编程工具 TOP5 排名:谁在重新定义研发效率?

当 “写代码” 从 “手动敲” 变成 “AI 帮你想”,研发效率的天花板被彻底打破。2025 年最新出炉的 AI 编程工具排名,不仅是技术实力的较量,更是企业降本增效的 “选型指南”—— 这 5 款工具,已经帮数万家企业实现…

请求中断的原理与分类

本文分享自天翼云开发者社区《请求中断的原理与分类》.作者:尹****聪 1 中断的原理 在nginx中所有的http请求是流式的处理逻辑,当client发出一个请求后,nginx把请求代理到upstream上。如果upstream已经返回了200 OK…

LLM学习笔记DAY9

大语言模型学习笔记 一、大语言模型的局限性 1.1 规划能力不足示例:汉诺塔问题中步骤错误,缺乏校验与修正机制。 需引入规划策略与反思检查策略。1.2 知识时效性与计算能力不足示例:GPT-4回答“美国总统”错误,数值…

【Go】go学习笔记

# 一、Go基础 ## 1. 编译运行 ``` go // 构建二进制文件 go build hello.go ./hello.gogo run hello.go ```## 2. 数据类型 - 布尔型 - 数字类型 - 字符串 - 派生类型- 指针 pointer- 数组- 结构化类型 struct- channe…

破局内容运营效率:2025 微信编辑器 10 款深度测评

破局内容运营效率:2025 微信编辑器 10 款深度测评2025微信编辑器AI革命:全链路解决方案重塑内容生产 一、引言:运营者的效率焦虑与工具迭代机遇 2025年新媒体行业进入“精耕细作”阶段,一篇爆款推文不仅需要优质内…

Web3 行业 Solidity 高级后端开发工程师岗位要求

基本学历与经验要求学历:本科及以上,计算机科学、软件工程、密码学或相关专业优先。 工作经验:3-5 年后端开发经验,其中至少 2 年 Solidity 智能合约开发经验(强制),参与过实际 Web3 项目(如 DeFi、NFT、DAO、…

2025氮化硼陶瓷高温绝缘体/坩埚/套管/基板/高温构件/耐腐蚀构件推荐榜:福维科(山东)引领国产化,3 家企业凭技术实力登榜

在半导体、新能源等高精制造领域,对关键材料的性能要求持续升级,氮化硼陶瓷因兼具优异导热性、绝缘性与耐温性,成为支撑产业升级的核心材料之一。2025 年,随着高端制造国产化进程加快,具备核心技术与稳定产能的氮…

无需接入执行器,0 代码改造实现微服务任务调度

本篇文章通过分析现有解决方案的不足,提出一种新的轻量级解决方案,该方案无需业务改造,且支持多语言,能够有效解决分布式环境下的任务调度幂等执行以及批处理问题。作者:陈欣渝(恰橙) 概述 在现代分布式系统中,…

利用排列组合法实现TOPN路径计算

本文分享自天翼云开发者社区《利用排列组合法实现TOPN路径计算》.作者:罗****斌 1 背景在进行TOPN选路性能摸底时,发现其在100*100节点级别以上的两两互相探测情况下的选路性能不太理想,整体压测后分析发现,选路算…

达梦数据库获取判断字段中的json数据中的值

达梦数据库获取判断字段中的json数据中的值-- 版本支持情况: -- DM7.1.6及之前版本:不支持原生JSON类型,只能用VARCHAR/CLOB存储 -- DM7.6及以后版本:开始支持JSON相关功能 -- DM8.0及以后版本:完整支持JSO…

2025 废气处理/废气治理/环保/污水/分子筛/除臭设备推荐榜:上海深城以专利技术破局,3 家企业凭场景适配登榜,助力异味治理升级

随着工业生产与市政服务的精细化发展,除臭设备与 VOCs 异味治理需求持续增长,高效、低耗、无二次污染的解决方案成为行业核心诉求。2025 年,我们从技术创新性、案例落地能力、工艺成熟度等维度筛选企业,推出本次推…

API 搜索的下一代形态-Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口!

在大型项目中,API 数量庞大、命名不一,导致“找接口”耗时费力。传统工具依赖关键词搜索,难以应对语义模糊或命名不规范的场景。Apipost AI 智能搜索功能,支持自然语言查询,如“和用户登录有关的接口”,系统可理…

2025包装机/全自动包装机/非标定制生产线厂家推荐昆仑智能装备,专业高效!

2025包装机/全自动包装机/非标定制生产线厂家推荐昆仑智能装备,专业高效! 一、包装机械行业面临的技术挑战与创新需求 随着制造业智能化转型的深入,包装机械领域正面临前所未有的技术挑战。根据行业调研数据显示,目…

2025拖鞋机/酒店拖鞋生产线厂家推荐昆仑智能,高效稳定自动化解决方案

2025年拖鞋机/酒店拖鞋生产线厂家推荐昆仑智能,高效稳定自动化解决方案 行业技术挑战与现状分析 在当今快速发展的酒店用品制造领域,拖鞋机和酒店拖鞋生产线面临着多重技术挑战。据行业数据显示,传统拖鞋生产设备的…

2025年口罩机厂家权威推荐榜单:全自动口罩机器,全自动KN95口罩机,高效智能生产线专业选购指南

2025年口罩机厂家权威推荐榜单:全自动口罩机器,全自动KN95口罩机,高效智能生产线专业选购指南 随着全球公共卫生意识的持续提升,口罩作为基础防护用品已从应急物资转变为常态化需求。在产业升级与技术迭代的双重驱…

[sed] replace the first line with certain info

If you want to use sed to replace the first line of a file with <div id="lexicoEntryPage">then the proper command is: sed 1s/.*/<div id="lexicoEntryPage">/ inputfile >…

FastDFS 安装部署 数据迁移 centos 安装 FastDFS

FastDFS 安装部署 数据迁移 centos 安装 FastDFS概述: FastDFS 的编译和运行必须依赖于 libfastcommon,两个软件都需要下载之后编译安装 需要先安装libfastcommon再安装FastDFS, 启动时先启动fdfs_trackerd,再启动…

2025摩托车厂家推荐:浙江天鹰机车,专业制造与创新设计之选

2025摩托车厂家推荐:浙江天鹰机车,专业制造与创新设计之选 当前摩托车领域面临的技术挑战 摩托车行业正经历着前所未有的技术变革与挑战。根据行业数据显示,全球摩托车市场年产量已突破6000万辆,但产品同质化率却高…

2025不锈钢方形/消防/生活/保温水箱厂家推荐莞南节能,专业耐用品质保障

2025不锈钢方形/消防/生活/保温水箱厂家推荐莞南节能,专业耐用品质保障 在当今城市建设快速发展的背景下,不锈钢水箱作为重要的储水设备,在消防系统、生活供水、工业用水等领域扮演着不可或缺的角色。随着2025年的临…