上篇刷完算法高频题,这篇进入外卖系统专项。美团外卖是美团核心业务,架构师面试经常围绕外卖场景展开——不是考你写代码,而是考你对复杂业务系统的理解深度和架构设计能力。
这篇8道题覆盖美团外卖架构师面试核心考点,每道题都有追问环节。
Q1:美团外卖的实时定位系统怎么做的?
场景:用户下单后需要看到骑手位置,骑手端持续上报GPS坐标,用户端实时展示骑手移动轨迹。
技术方案:
- 定位采集:骑手端每3-5秒上报一次GPS坐标(经纬度+时间戳+方向+速度)。弱网环境本地缓存批量上报。
- 数据传输:长连接通道(WebSocket或自定义TCP协议)。服务端维护骑手位置的最新状态。
- 位置推算:两次上报之间用插值算法(线性插值或贝塞尔曲线)平滑轨迹。避免骑手在地图上"跳"。
- 地图展示:用户端收到位置更新后,用Marker动画平滑移动。道路吸附算法让Marker沿道路移动而非直线。
追问:GPS漂移怎么处理?过滤异常点(速度超过合理值、位置跳变超过阈值)。用卡尔曼滤波平滑轨迹。室内定位用WiFi/基站辅助。
Q2:订单状态机怎么设计?
外卖订单状态流转:
已下单 → 商家接单 → 商家备餐中 → 骑手接单 → 骑手到店 → 骑手取餐 → 配送中 → 已送达
↓ ↓
商家拒单(退单) 超时未接单(重新派单)
状态机设计要点:
- 状态枚举:每个状态有明确定义和允许的操作。
- 状态迁移:只有合法的状态转换才能执行。非法转换直接拒绝或告警。
- 事件驱动:状态变化由事件触发(如"商家点击接单"事件 → 状态从"已下单"变为"商家接单")。
- 幂等性:同一事件重复触发不会导致状态异常(如骑手重复点击"取餐"不会出问题)。
追问:分布式环境下状态机怎么保证一致性?用分布式事务(如TCC/Saga)或消息队列+本地事务表。订单状态变更先写本地事务表,异步通知其他服务。配合重试和补偿机制保证最终一致性。
Q3:骑手调度算法怎么理解?
调度目标:在满足时效承诺的前提下,最大化骑手效率(每人配送单量最大化、总配送距离最小化)。
调度流程:
- 订单聚合:相近地址、相近时间的订单聚合成"批次",分配给同一骑手顺路配送。
- 骑手匹配:考虑骑手当前位置、手头订单数量、预计完成时间、到商家的距离。
- 路径规划:给骑手规划最优配送顺序(TSP问题的近似解)。
- 动态调整:骑手配送途中如果有新订单,评估是否顺路,顺路则追加。
算法复杂度:骑手调度本质是NP-Hard问题(带时间窗的车辆路径问题VRPTW),实际用启发式算法(贪心+局部搜索)在毫秒级给出近似最优解。
追问:Android端怎么配合调度?骑手端接收派单通知(推送)、展示配送路线(地图SDK)、上报位置和状态变化。弱网环境本地缓存状态变化,网络恢复后同步。
Q4:多端数据同步怎么做?
场景:用户端、商家端、骑手端需要同步看到订单状态变化。用户下单 → 商家看到新单 → 骑手看到新派单。
技术方案:
- 消息推送:服务端状态变更后推送给相关端。用长连接通道(WebSocket)保证实时性。
- 版本号机制:每条数据带版本号(或时间戳)。端侧收到数据后比较版本号,只处理更新的版本。避免乱序问题。
- 增量同步:只推送变化的字段而非全量数据。减少带宽消耗。
- 离线同步:端侧离线时操作暂存本地队列,上线后批量同步。服务端用版本号去重。
追问:Android端怎么做离线缓存?Room数据库存订单数据,配合LiveData观察变化。网络请求成功更新DB,网络失败时操作入本地队列。WorkManager定期重试同步。
Q5:外卖App的架构怎么设计?
分层架构:
- UI层:Compose或View实现页面。MVI架构——State驱动UI,单向数据流避免状态混乱。
- 业务层:各业务模块(订单、商家、骑手、支付、评价)独立模块,通过接口交互。模块间不直接依赖,通过路由或事件总线通信。
- 数据层:Repository模式封装数据来源。网络(Retrofit+OkHttp)+ 本地(Room)+ 推送(WebSocket)。Repository决定从网络还是缓存取数据,业务层无感知。
- 基础层:网络、存储、日志、监控、埋点等基础能力。统一封装供上层调用。
关键技术选型:
- 模块化:组件化架构,各业务独立编译、独立运行。Debug时可单独运行某模块加速开发。
- 路由:ARouter或自研路由框架,模块间解耦通信。支持URL Scheme跳转和拦截器。
- 热修复:线上Bug快速修复不用发版。Tinker或Sophix方案。
- 性能监控:APM体系监控启动耗时、帧率、崩溃率、ANR率。线上异常自动告警。
追问:多模块编译冲突怎么处理?统一依赖版本管理(gradle.properties统一声明)。冲突用resolutionStrategy强制指定版本。模块间依赖用接口隔离避免直接依赖实现。
Q6:支付流程怎么保证安全?
支付流程:用户选支付方式 → 拉起支付SDK(微信/支付宝) → 支付结果回调 → 服务端验证 → 更新订单状态。
安全要点:
- 签名验证:支付结果不能只信客户端回调。服务端必须向支付平台查询确认支付状态。
- 幂等处理:同一支付结果可能多次回调(网络重试),服务端用订单号+支付流水号去重。
- 超时处理:支付超时未完成自动关单,避免资源浪费。
- 金额校验:服务端下单时计算金额,客户端只传商品ID不传金额。防止篡改金额。
追问:支付失败怎么重试?本地记录支付状态,支付未完成提示用户重试。超过时限自动取消订单并释放库存。
Q7:弱网环境怎么优化用户体验?
策略:
- 本地优先:页面数据优先从本地缓存读取,有数据先展示,网络请求成功后更新。避免白屏等待。
- 乐观更新:用户操作先本地更新UI(乐观),网络请求成功后确认,失败则回滚并提示。
- 请求重试:网络失败自动重试(指数退避)。超时设置合理值(弱网放宽超时)。
- 图片优化:弱网降低图片质量(WebP、更低采样率)。优先加载关键图片,懒加载次要图片。
- 预加载:WiFi环境预加载常用页面数据。
追问:怎么检测网络质量?测速(ping+带宽估算)、信号强度(TelephonyManager)、网络类型(WiFi/4G/5G)。根据质量动态调整策略(弱网减少请求频率、降低图片质量)。
Q8:外卖架构师面试怎么准备?
业务理解:了解外卖业务的完整流程(用户下单→商家接单→骑手取餐→配送→送达)。能讲清楚每个环节的技术挑战和解决方案。比如骑手调度为什么是NP-Hard、订单状态机为什么要幂等。
系统设计:练习画架构图——订单系统、调度系统、实时通信系统、支付系统。能讲清楚模块间的交互和数据流。推荐参考《System Design Interview》和美团技术博客。
深度追问:面试官会深挖细节——"骑手位置漂移怎么解决"、"订单状态不一致怎么办"、"高并发下单怎么保证库存"、"支付回调丢失怎么处理"。准备时每个技术点都要能讲清楚原理和具体实现方案。
加分项:了解美团外卖的技术博客(有公开分享调度系统、实时定位、弹性计算等文章)。面试时提到"我看过美团技术团队的XX分享"会加分。
面试Tips:美团外卖架构师面考的是业务理解+系统设计+深度追问。不是背八股,而是让你分析真实业务场景的技术挑战。订单状态机(幂等、一致性)、骑手调度(路径规划)、弱网优化(本地优先、乐观更新)是高频话题。准备时画架构图、讲数据流、准备被追问细节。
下一篇进入快手初级Android——快手公司首篇,考察Activity生命周期、Fragment、Intent、UI布局等基础。
用过美团外卖的同学扣1,你觉得骑手定位准不准?背后用了哪些技术?
本系列连载中,关注不迷路,下一篇:快手初级Android工程师面试真题
系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。