当前位置: 首页 > news >正文

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

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.hskmm.com/?act=detail&tid=37543

相关文章:

  • Edge浏览器网页设置深色模式(仅搜索结果界面)
  • 2025 年 AI 编程工具 TOP5 排名:谁在重新定义研发效率?
  • noipd8t2 - Slayer
  • 【Go】go学习笔记
  • todolist
  • 利用排列组合法实现TOPN路径计算
  • 达梦数据库获取判断字段中的json数据中的值
  • 2025 废气处理/废气治理/环保/污水/分子筛/除臭设备推荐榜:上海深城以专利技术破局,3 家企业凭场景适配登榜,助力异味治理升级
  • Web3 行业 Solidity 高级后端开发工程师岗位要求
  • API 搜索的下一代形态-Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口!
  • 2025包装机/全自动包装机/非标定制生产线厂家推荐昆仑智能装备,专业高效!
  • 2025拖鞋机/酒店拖鞋生产线厂家推荐昆仑智能,高效稳定自动化解决方案
  • 2025年口罩机厂家权威推荐榜单:全自动口罩机器,全自动KN95口罩机,高效智能生产线专业选购指南
  • 2025提升机/自动提升机厂家推荐垚林机械,高效稳定省心之选
  • 二分图
  • 2025不锈钢方形/消防/生活/保温水箱厂家推荐莞南节能,专业耐用品质保障
  • 2025-10-23 DeepSeek R1本地部署(ollama)
  • python 异步调用语法
  • KAPE 0.8.3.0发布:数字取证工具新版本详解
  • 第一!天翼云引领中国教育公有云市场
  • 哇哦杯题解民间版
  • 海上60公里,5G信号满格?这款神器让远航不再“失联”
  • 2025除尘设备/脉冲除尘器厂家推荐东莞市百谊环保科技,专业高效净化解决方案
  • 2025 年压滤机厂家最新推荐排行榜:隔膜 / 污泥 / 真空 / 板框 / 带式压滤机优质品牌权威指南
  • 2025发电机/发电机组/柴油发电机/甲醇发电机组租赁厂家推荐新疆泓浩机电,专业维修保养服务保障
  • 2025 年氮化硅陶瓷球生产厂家最新推荐榜:高精度高耐磨产品优选,国内优质企业全面剖析
  • 阿里云加持,《泡姆泡姆》让全球玩家畅享零延迟冒险
  • 基于粒子群优化(PSO)算法的PID控制器参数整定
  • VScodeC语言结构体成员提示不全
  • 2025滑石粉厂家推荐辽宁精华新材料,纳米级/工业级/化妆品级多品类覆盖