Enterprise Rust/C++ · Technical Phone Screen

xAI 机器间通信:RPC、消息队列与共享存储的边界

Enterprise 初筛问机器之间如何沟通;按请求响应、异步交付和共享状态比较延迟、失败、顺序与背压。

题目重点:Enterprise 初筛问机器之间如何沟通;按请求响应、异步交付和共享状态比较延迟、失败、顺序与背压。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练场景是两个不同主机的服务交换消息,网络可能延迟、重复、丢连接或分区;业务所需一致性尚未指定。
  • ‘机器内部’若确指单机进程/线程沟通,应改谈 pipe、Unix socket、共享内存、线程 channel;不能把跨机 RPC 当成唯一原题含义。
  • 方案选择需要先明确同步响应、吞吐、消息大小、持久化与顺序要求。

解题路线

  1. 同步请求响应:HTTP/gRPC/TCP 等网络协议提供一次请求与响应关联,适合需要即时答案的查询/命令;超时不能推出远端未执行,重试写操作需幂等键或结果查询。
  2. 异步消息:队列/日志解耦生产者与消费者,可缓冲峰值、重试和重放;必须明确至少一次交付下去重、分区顺序、死信队列和积压告警。
  3. 共享存储:双方通过数据库/对象存储交换状态,适合可持久查询的工件;读写需版本、事务或 CAS,轮询会增加延迟,不能把数据库当零成本消息总线。
  4. 大 payload 可把元数据走 RPC/队列、内容放对象存储;流式传输须考虑分块校验、背压和取消。安全上需服务身份、传输加密与授权,观测要有 request ID、延迟和重试指标。
  5. 先问面试官‘机器内部’指同一主机 IPC 还是不同机器通信,再选一例画出发送、确认、失败重试与收端处理状态。

手动走一遍

训练例:A 让 B 执行一次批处理。若 A 需要立刻知道受理状态,用带 idempotency key 的 RPC;若 B 可能忙数分钟,则 A 向队列发任务并返回 job ID,B 消费并把结果存储,A 查询状态。A 的 RPC 超时后直接重发而无幂等键,可能执行两次。

规模与取舍

单次 RPC 至少一次网络往返,延迟约网络 RTT 加排队与处理;队列增加持久化与消费延迟,但可把峰值流量转成积压;共享存储每次读写承担存储往返和一致性成本。具体吞吐与规模取决于 payload、分区数及实现,题目没有数值。

易错点与追问

容易失分的边界

  • 只列 TCP/UDP/HTTP 名词,不说明业务交付语义。
  • 认为 RPC 超时等于服务端未执行。
  • 把队列的至少一次重投当成恰好一次业务效果。
  • 忽略‘机器内部’可能是单机 IPC 的题意歧义。

继续深挖

  • 若要求同一 user 的命令有序,队列如何分区?
  • 何时选共享内存/Unix socket 而非网络 RPC?
  • 消费者慢时如何背压与限制队列长度?
  • 网络分区期间如何处理需要强一致的写入?
✓已复制微信号!