3.21 美团一面 - 核心本地商业-业务研发平台 35min

3.21 美团一面 - 核心本地商业-业务研发平台 35min
最新回答
梨涡少年我的梦

2020-12-10 17:00:09

1. 自我介绍

  • 简洁说明教育背景、技术栈、核心项目经历及与岗位匹配的技能,突出与业务研发平台相关的经验(如分布式系统、高并发优化等)。

2. 项目概述与个人职责

  • 项目概述:用1分钟说明项目背景、目标及核心功能(如营销活动系统、订单处理平台等)。
  • 个人职责:明确负责的模块(如状态机设计、分布式锁实现、导出优化等),强调技术难点与贡献。

3. 状态机的作用与选型依据

  • 作用:统一管理业务状态流转,避免硬编码逻辑,提升可维护性;通过单机CAS锁和持久化机制保证数据一致性;支持动态扩展,新需求通过配置实现,无需修改代码。
  • 选型依据:需支持高并发、持久化、可扩展性;选择成熟框架(如Spring StateMachine)或自研轻量级状态机,根据业务复杂度决定。

4. Redis分布式锁的使用与漏罩问题解决

  • 使用方式:通过SETNX获取锁,设置过期时间(如5分钟),操作完成后释放锁;禁用Redisson自动看门狗机制,避免锁自动续期导致死锁。
  • 长期占用问题:操作前校验当前线程是否持有锁,防止误释放;超时未释放的锁由Redis自动过期清理;结合业务逻辑设置合理超时时间。

5. 导出优化分析与具体措施

  • 问题分析:复用查询逻辑导致数据量暴增,引发OOM和耗时过长。
  • 优化措施

    耗时分析:通过Arthas定位耗时模块,发现网络调用(40%)和SQL查询(60%)为主要瓶颈。

    网络优化:删除非必要接口调用,首次查询缓存数据。

    SQL优化:分批分页查询(每次100条),用上次最后ID作为游标,避免深度分页;利用主键索引提漏源升性能。

  • 接口超时处理:异步化处理导出任务,前端先返回响应,后台通过消息队列通知结果。

6. MySQL索引机制理解

  • 底层结构:B+树,支持高效范围查询和排序。
  • 索引类型

    主键索引:唯一且非空,聚簇索引,数据按主键物理排序。

    普通索引:无唯一性约束返搜闹,辅助查询。

    唯一索引:允许NULL值,但值必须唯一。

    组合索引:多列组合,遵循最左前缀原则。

7. 实际使用的索引类型

  • 根据业务场景选择,例如:

    用户表:主键(ID)、唯一索引(手机号)、组合索引(姓名+年龄)。

    订单表:主键(订单号)、普通索引(用户ID、状态)。

8. 事务隔离级别与实现

  • 隔离级别

    RU(读未提交):脏读、不可重复读、幻读。

    RC(读已提交):解决脏读。

    RR(可重复读):解决脏读和不可重复读(默认级别)。

    Serializable:串行化,解决所有问题。

  • RR实现机制:MVCC(多版本并发控制),通过ReadView判断数据可见性:

    首次SELECT时创建ReadView,记录活跃事务ID范围。

    根据max_trx_id和min_trx_id判断数据版本是否可见,不可见则通过UndoLog回溯。

9. Kafka顺序保证机制

  • 单分区内有序:消息按写入顺序存储在单个分区中,消费者按顺序消费。
  • 全局无序:不同分区间无序,需确保业务逻辑对顺序无强依赖,或通过单分区设计保证顺序。

10. Kafka高可用机制

  • 副本机制:分区有多个副本(Leader/Follower),分布在不同Broker上;Leader负责读写,Follower同步数据。
  • 故障恢复:Leader宕机后,从Follower中选举新Leader;持久化机制(Segment刷盘)确保消息不丢失。

11. Redis数据结构与应用场景

  • String:缓存数据、分布式锁(SETNX)。
  • List:消息队列、最新消息排行。
  • Hash:存储对象属性。
  • ZSet:排行榜、延迟队列。
  • Set:交集/并集操作(如共同好友)。
  • HyperLogLog:UV统计(基数估算)。
  • Bitmap:用户签到、状态标记。

12. 实习经历确认

  • 重点描述技术贡献(如代码实现、性能优化)和业务影响(如提升效率、减少故障),用数据支撑(如“优化后接口响应时间降低50%”)。

13. 消息消费失败处理

  • 重试机制:设置最大重试次数(如3次),超过后记录死信队列或人工干预。
  • 死信队列:将失败消息转入专门队列,后续分析原因或重新投递。

14. 消息不丢失方案

  • 生产端:ACK确认机制,确保消息送达Broker。
  • 消费端

    本地存储消费状态(如数据库或Redis),未完成消息标记为“待重试”。

    定时任务扫描未完成消息,超过阈值(如10次)后报警并暂停消费。

算法题:二叉树层序遍历

  • 思路:使用队列实现BFS,按层遍历节点。
  • 代码示例
public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); List<Integer> level = new ArrayList<>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); level.add(node.val); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } res.add(level); } return res;}

15. 反问环节

  • 部门业务:高并发场景(如大促活动、优惠券发放),技术挑战包括海量数据处理(百亿级)、接口性能优化(如10万QPS)。
  • 技术栈:混元体系(美团内部技术框架),涉及分布式系统、微服务、中间件(Kafka、Redis)等。

16. 面试结果

  • 当场约二面,说明面试官对技术深度和问题解决思路认可。