当前位置: 首页 > 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.rkmt.cn/news/28620.html

相关文章:

  • 破局内容运营效率:2025 微信编辑器 10 款深度测评
  • 2025氮化硼陶瓷高温绝缘体/坩埚/套管/基板/高温构件/耐腐蚀构件推荐榜:福维科(山东)引领国产化,3 家企业凭技术实力登榜
  • 利用排列组合法实现TOPN路径计算
  • 达梦数据库获取判断字段中的json数据中的值
  • 2025包装机/全自动包装机/非标定制生产线厂家推荐昆仑智能装备,专业高效!
  • FastDFS 安装部署 数据迁移 centos 安装 FastDFS
  • 2025摩托车厂家推荐:浙江天鹰机车,专业制造与创新设计之选
  • Linux基础——wipefs磁盘数据擦除工具
  • python 异步调用语法
  • KAPE 0.8.3.0发布:数字取证工具新版本详解
  • 哇哦杯题解民间版
  • 2025移动泵车/防汛泵车/水泵机组厂家推荐潍坊山藤动力,专业高效排水解决方案
  • 第一!天翼云引领中国教育公有云市场
  • 第一次大作业心得
  • 基于粒子群优化(PSO)算法的PID控制器参数整定
  • 2025棒球帽/卫衣/羽绒服品牌推荐,COVERNAT潮流服饰厂家精选
  • 如何在CentOS 7上安装bzip2-1.0.6-13.el7.x86_64.rpm RPM包(详细步骤) - 详解
  • 2025 年度撕碎机厂家最新推荐权威榜单:涵盖金属 / 塑料 / 木材 / 固废等多物料处理,精选实力企业破解选型难题
  • C程序设计语言_1.1_开篇入门
  • 2025年10月广州办公室设备搬运公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 2025年专业的上海Micro-LED显示屏推荐TOP生产厂家
  • 2025年质量好的工业不锈钢链轮最新TOP厂家推荐
  • 2025年10月旋转接头厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 实用指南:Java 高效实现 PowerPoint 转 PDF:不依赖Office
  • 2025年靠谱的FCC催化剂拟薄水铝石厂家推荐及采购指南
  • 2025连接器厂家推荐皓富电子,专注USB/电池/TYPE-C/防水接口专业制造
  • 2025年知名的四川岩棉板,A级防火岩棉板推荐TOP品牌厂家
  • 2025年评价高的磁力齿轮泵,小型齿轮泵厂家推荐及选择建议
  • OJ模拟面试3(竞赛排名排序)
  • 2025 年最新散热片厂家推荐排行榜:权威评选揭晓高性能电子、水冷、铝型材等散热片优质企业水冷散热片/铝型材散热片/热管散热片/插齿散热片公司推荐