目录
正在加载目录...

Microsoft SWE Full Time VO 面经|第一轮 BQ + System Design

Microsoft SWE Full Time VO 面经|第一轮 BQ + System Design

这轮 Microsoft SWE Full Time VO 先问客户沟通和 Availability Zone,随后设计游戏平台的 Credit Management System。需求分三步给出:增加积分、使用积分购买道具,以及退还道具并返还积分。

随着需求增加,需要解释的问题也更具体:并发修改会不会丢失余额?请求重试会不会重复扣款?商品涨价后应该退多少?以下按这一轮的题目展开,接口和数据结构为补充解法示例。

第一面:客户沟通、云基础与积分系统设计

BQ:客户遇到问题,情绪激动,怎么处理?

题目:客户因为服务问题情绪激动,你会如何回应并推进解决?

解答思路:先确认问题对客户的影响,再安排排查、临时方案和后续沟通。不要一开始就争论责任,也不要在根因未明时承诺修复时间。

可以这样回答:

我会先听完客户的描述,确认受影响的功能、发生时间和影响范围。如果有临时恢复方案,会先帮助客户恢复使用,再协调负责团队调查。我会明确下一次反馈时间,即使问题还没有解决,也会同步已确认的信息和下一步。修复后,再确认客户是否恢复正常,并跟进防止复发的措施。

如果面试官要求举例,再用实际项目说明自己做了什么、如何协调,以及最终结果。重点讲清个人贡献,避免整段只有“我们团队”。

技术问答:Availability Zone 是什么?

题目:什么是 Availability Zone?为什么系统要部署在多个 AZ?

解答思路:AZ 是同一个云区域内独立的故障隔离单元,由一个或多个数据中心组成,具有独立的供电、冷却和网络基础设施。多 AZ 部署可以降低单个 AZ 故障对整体服务的影响。

但应用部署了多个副本,并不代表整个系统已经具备容灾能力。数据库、流量入口和其他关键依赖也要支持冗余与切换,剩余实例还要有容量承接流量。整个 Region 发生故障,则需要另外讨论跨区域恢复。

System Design:游戏平台积分管理

题目:玩家可以获取 Credits、消费 Credits 购买道具,并在退还道具后获得退款。如何设计这个系统?

解答思路:先从一个积分服务和关系型数据库开始,完成账户余额、购买记录和积分流水,再讨论服务拆分。

初版方案先约定:积分按整数计量、不允许透支、仅支持整笔退款。部分退款、积分过期和多种积分类型留到扩展阶段。

第一阶段:增加积分

接口示例:AddCredits(accountId, amount, requestId)

服务端需要检查账户是否存在、数量是否为正整数,以及调用方是否有加分权限。身份认证回答“调用者是谁”,权限校验回答“调用者能做什么”;普通玩家不能自行提交数量给账户加分。

数据可以拆成三部分:

数据主要内容
CreditAccount账户 ID、当前余额
CreditLedger积分变化数量、业务编号、操作类型、时间
IdempotencyRecord调用方、操作、请求编号、参数摘要、处理结果

账户保存当前余额,流水记录余额为什么发生变化。两者应在同一个数据库事务内更新,避免出现“余额已增加,但没有流水”的情况。

并发加分如何避免覆盖?

假设余额是 100,两笔不同请求分别增加 50 和 30,最终应为 180。

不要在应用中分别读取 100,计算后再写入 150 和 130。使用数据库原子增量更新,让每笔加分都基于数据库中的当前值执行,并检查数值上限。

请求重试如何避免重复加分?

对调用方、操作和 requestId 建立唯一约束。相同键、相同参数返回原结果;相同键、不同参数拒绝处理。余额、流水和成功结果要一起提交,防止服务在中途崩溃后重复执行。

充值订单、活动奖励等业务编号也应防重。同一笔充值即使换了请求编号,也不能再次入账。

第二阶段:消费积分购买道具

接口示例:SpendCredits(itemId, requestId),玩家身份从登录信息取得,商品价格由服务端确定。创建购买记录时保存实际成交价,后续重试和退款都使用这份记录。

客户端可以提交商品编号或报价编号,但不能自行决定最终扣款数量。

如何防止余额被并发扣成负数?

余额为 100,两笔各扣 80 的请求同时到达。如果先查询余额、再执行扣款,两笔请求都能通过检查。

可以把余额条件与扣款放在同一条原子更新中。下面是参数化 SQL 示意:

UPDATE credit_account
SET balance = balance - :price
WHERE account_id = :account_id
  AND balance >= :price;

服务端检查影响行数,只有成功更新账户的请求才能继续。购买记录、扣款流水和幂等结果也需要纳入同一事务。

以 PostgreSQL 的 Read Committed 隔离级别为例,并发更新同一行时,后执行的更新会等待,并重新检查更新后的行是否满足条件。

价格服务不可用怎么办?

拿不到有效价格时,不执行扣款。若采用缓存报价,需要定义有效期和版本;报价失效时要求重新确认。

已经创建的订单保留成交价,不能因为重试时商品涨价,就按照新价格再次扣款。

扣款成功,道具发放失败怎么办?

如果余额和道具归属在同一个数据库中,可以把扣款、发放道具、写流水和创建订单放入同一事务,失败时一起回滚。

如果道具由独立服务管理,则需要跨服务恢复机制。一个可行方案是:在扣款事务中同时保存待发货事件,再由后台可靠投递;道具服务按购买编号去重,防止重复发放。这个做法称为 Transactional Outbox。

调用超时不能直接视为发货失败,因为道具已经发出、响应丢失,也会表现为超时。订单应保留待确认状态,通过查询或幂等重试确认结果。

需要取消购买时,先阻止后续发货,或者确认已发道具被撤销,再返还积分,避免退款后迟到的发货请求仍然成功。

第三阶段:退款

接口示例:Refund(purchaseId, requestId)

退款必须关联原购买记录。假设商品标价 100,玩家打折后支付 80,后来商品涨到 120;按整笔返还已支付积分的规则,退款仍应为 80。

处理前需要确认:

  • 原购买记录属于当前用户,且符合退款条件。
  • 订单尚未退款,也未进入另一笔退款流程。
  • 本次购买对应的道具可以撤销。

已消耗、转赠或用于合成的道具,需要先明确业务规则,不能默认都能退。

如何避免重复退款?

不能只依靠退款请求的 requestId。用户使用两个不同请求编号,对同一订单申请退款,也必须被拦住。

可以通过订单状态的条件更新领取退款处理权,并对原购买编号设置退款唯一约束。退款流水、余额增加和最终状态在同一个事务中提交。

如果道具与账户分属不同服务,则先记录 REFUND_PENDING,确认道具撤销后再返还积分。中途失败从已完成的步骤继续,不能每次重试都重新加钱。

原消费流水应保留,退款通过新增冲正流水记录,方便审计和对账。

进一步追问:积分过期、类型与批量发放

积分过期:需要按批次保存剩余数量、来源和到期时间。消费时记录扣了哪些批次,退款时才能按规则恢复。余额查询和扣款也必须识别已过期积分,不能只依赖后台任务及时清理。

多种积分类型:付费积分、赠送积分和活动积分分别记录,并定义使用顺序、适用商品与退款规则。

批量发放:为“活动+账户”建立唯一业务标识,分批处理并保存每项结果。失败时只重试未完成项,避免整批重跑造成重复加分。

这些需求都要落到具体数据和状态上。只在架构图中增加一个队列或缓存,并不能解决重复发放与记账一致性。

备考建议

练习时,按“加分→购买→退款”逐步增加需求,每一步都说清楚哪些操作必须一起提交,失败后从哪里恢复。

准备 Microsoft SWE Full Time Interview 时,除了 Coding,也建议重点准备 Behavioral Questions、System Design、API Design、Data Modeling、Concurrency、Idempotency 等内容。

System Design 尤其需要训练“需求逐步增加”的应对能力,不只是会套模板,还要能够解释设计选择、处理 Failure Cases,并根据新的 Follow-up 持续扩展原有方案。

如果你正在准备 Microsoft SWE Full Time VO,需要面试题整理、模拟面试或针对 Coding、BQ、System Design 的专项反馈,可以联系我们进一步了解。

FAQ

幂等能解决所有并发问题吗?

不能。幂等处理同一请求的重复执行;两笔不同购买争抢余额,需要原子条件更新或合适的锁与事务机制。

购买请求超时后,应该重新下单吗?

先查询原订单,或使用原幂等键重试。直接生成新键会被视为另一笔购买。

为什么不能把退款直接写成 AddCredits?

退款还涉及原订单校验、道具撤销和防止重复返还。单独加分无法保证整个流程正确。

积分应该使用浮点数吗?

整数积分使用整数。需要小数时,采用最小单位换算或精确十进制类型,避免浮点舍入影响余额和对账。

初版需要微服务、Redis 和消息队列吗?

不需要。先用清晰的数据库事务完成核心流程,再根据独立扩容、服务边界和异步处理需求引入组件。

参考阅读

以下记录可用于对照不同 Microsoft 岗位的面试安排;本篇仍只讨论这一轮题目:

面试准备支持

正在准备 Microsoft SWE Full Time VO,针对客户沟通、系统设计和失败场景进行模拟面试与专项反馈。

目前已经帮助了很多北美留子上岸,身边几个同学也找过他们准备 Microsoft 和其他大厂的面试。另外注意一下,像 Meta 这种公司,本人有收集好的 Microsoft 面试题库,有需要的可以联系 Interview Show

如果你也在准备 Microsoft 的OA/VO、NG 或其他大厂的OA,感觉复习效率低、方向模糊,欢迎联系。我们会根据你的具体水平和欠缺的内容,提供专业的 VO 辅助服务和一对一指导。

END