面灵AI→

拼多多一面:中间件选型与按序打印的工业编程题

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍。
  2. 讲一讲你的实习有没有碰到一些有意思或者困难的问题,怎么解决的?
  3. 讲一讲你熟悉的中间件 Redis、MQ。
  4. 工业场景编程题:消息是乱序到达的,但是你必须按顺序打印。
  5. 反问。

《参考解析》

中间件不要只报名称,要讲清「为什么用它」

被问「讲一讲你熟悉的 Redis、MQ」,面试官想听的是选型判断与踩坑经验,不是功能清单。Redis 的答法按「定位 → 数据结构 → 典型用途 → 坑」组织:定位是内存键值存储,强在低延迟与丰富的数据结构;String 做缓存、计数与分布式锁,Hash 存对象字段,List 做简单队列,Set 做去重与交并集,ZSet 做排行榜与延时任务,Stream 提供消费组与 ACK;典型坑是内存成本与淘汰策略、持久化在故障时的数据窗口、单线程下慢命令阻塞、大 key 与热 key 分片、以及缓存与数据库的一致性(常用「先更新库再删缓存 + 延迟双删 + 过期兜底」)。RabbitMQ 的答法按「模型 → 可靠投递 → 顺序与幂等」组织:Exchange 按类型(direct/topic/fanout/headers)路由到 Queue,消费者用 ack 确认;可靠投递要开生产者确认(publisher confirm)与持久化,消费端手工 ack 并在处理完成后再确认,失败进死信队列并配重试与告警;它按队列保序(单队列单消费者才严格有序),加上消费端幂等才能应对重复投递。如果说的是 Kafka,就补分区保序与 ISR;选型的判据是「能不能接受丢、能不能接受重、要不要严格顺序、吞吐与堆积需求」——把这句话说出来,等于把两种中间件的差别一次讲清。

工业场景题:乱序到达的消息按序打印

这题的本质是「流式数据里的顺序纠正」,标准解法是滑动窗口加缓冲。设每个消息带一个单调递增的序号(seq),期望按 seq 从小到大打印:维护一个 nextSeq(下一个该打印的序号)与一个按 seq 排序的缓冲区(最小堆或 TreeMap)。每来一条消息:若 seq == nextSeq 就立刻打印,然后检查缓冲区里是否有连续的后续序号,有就一起弹出打印并推进 nextSeq;若 seq > nextSeq 就放进缓冲区等待(说明前面还有没到的);若 seq < nextSeq 说明是重复或迟到的,直接丢弃。这个结构的时间复杂度是每条消息 O(log n) 入堆、弹出总量也是 O(n log n)。需要跟面试官确认的边界有四条:序号从哪里来(发送端生成还是服务端分配)、是否允许丢消息(如果某条永远不到,缓冲区会一直堵着,所以要设超时与窗口上限:超时就跳过并记录缺口,或者按策略补齐)、窗口能有多大(内存约束,超阈值就落盘或反压上游)、以及是否需要持久化(进程重启后要能恢复 nextSeq 与缓冲区)。可以主动提一个更简单的近似方案:如果只需要「同一实体的消息有序」而不是全局有序,按 key 哈希到不同的处理单元、每个单元内部串行,就能避免全局排序的开销——这也是 Kafka 分区保序的实际做法。面试中「先问清约束再动手」这一步本身就会被记分,尤其在题目描述不完整时。

面试很短意味着什么

面试只有二十分钟左右通常有三种原因:面试官时间紧、岗位匹配度已经很明显、或者这只是初筛轮。无论哪种,你能控制的只有单位时间的产出密度:自我介绍用 40 秒左右讲清「学校/方向 + 一段最相关的经历 + 一个可量化的成果 + 为什么投这个岗位」,把深挖的空间留给面试官;每个技术问题先给结论再给理由,别从一个概念的历史讲起;编程题即使一时没有思路,也要把「我理解的输入输出与约束是什么、我打算怎么做」说出来,多数面试官会在这个过程中给提示(原帖的经历就是被讲解与提醒之后才写出来)。面完不要用时长判断结果,把这次暴露的短板(中间件细节、算法熟练度)列出来补齐,比情绪内耗更有价值。