美团C++ 二面总结

1. 简单介绍一下你自己和你最有成就感的项目

回答框架:

  • 教育背景和技术栈
  • 项目背景和业务价值
  • 你的核心贡献
  • 技术亮点和创新点
  • 项目成果(用户量、性能提升等)

2. 如果让你设计一个外卖订单系统,支持千万级日订单,你会怎么设计

答案要点:

需求分析

  • 下单:高并发写入
  • 查询:用户查订单、骑手查配送单
  • 状态流转:待支付→已支付→配送中→已完成
  • 数据量:千万级/天,亿级总量

架构设计

客户端 → API网关 → 订单服务集群
                      ↓
    Redis(缓存) + MySQL(持久化) + MQ(异步)

核心模块

  1. 订单创建:生成全局唯一订单号(雪花算法)库存扣减(Redis预减)写入MySQL(分库分表)发送MQ通知下游(支付、配送)
  2. 数据存储:MySQL分库分表:按用户ID哈希分256库,每库256表Redis缓存:最近7天订单,TTL自动过期ES搜索:支持多条件查询
  3. 状态机设计:定义状态流转规则防止非法状态跳转状态变更记录日志
  4. 高可用方案:服务多副本部署数据库主从+读写分离限流降级熔断

关键技术点

  • 分布式事务:本地消息表+定时补偿
  • 幂等性:订单号+状态判断
  • 超时处理:延迟队列自动取消未支付订单

3. 你们的系统如何做容量规划和性能评估的

答案:

容量规划流程

  1. 业务预估:日活用户数(DAU)人均请求次数峰值倍数(平时的3-5倍)计算峰值QPS
  2. 单机性能测试:压测单台机器的极限QPS观察资源瓶颈(CPU、内存、网络)确定单机承载能力
  3. 计算所需机器数:机器数 = 峰值QPS / 单机QPS / 0.7(留30%余量)考虑容灾:至少2个机房,每个机房能承载全部流量
  4. 数据库容量:单表建议不超过2000万行计算需要多少分表预留增长空间

性能评估

  • 定期压测,验证容量
  • 监控资源使用率
  • 提前扩容(使用率超过70%告警)

实际案例:"我们系统日活100万,人均10次请求,峰值是平时5倍,计算出峰值QPS约5000。单机压测QPS 1000,需要5000/1000/0.7≈8台机器。考虑容灾,部署16台。"

4. 说说你对微服务的理解,微服务拆分的原则是什么

答案:

微服务优势

  • 独立部署:单个服务可独立上线
  • 技术栈自由:不同服务可用不同语言
  • 故障隔离:一个服务挂了不影响其他
  • 团队自治:每个团队负责自己的服务

微服务挑战

  • 分布式事务:跨服务的数据一致性
  • 服务治理:服务发现、负载均衡、熔断
  • 链路追踪:请求跨多个服务,排查困难
  • 运维复杂:服务数量多,部署复杂

拆分原则

  1. 按业务领域拆分:用户服务、订单服务、支付服务每个服务对应一个业务领域遵循DDD(领域驱动设计)
  2. 单一职责:一个服务只做一件事服务边界清晰
  3. 高内聚低耦合:服务内部高内聚服务之间低耦合通过接口通信
  4. 数据独立:每个服务有自己的数据库不直接访问其他服务的数据库通过API获取数据
  5. 团队规模:两个披萨原则(6-8人)一个团队维护1-3个服务

拆分粒度

  • 不要过度拆分:增加复杂度
  • 不要拆分不够:失去微服务优势
  • 根据业务复杂度和团队规模决定

5. 如何设计一个高性能的RPC框架

答案:

核心组件

  1. 序列化:Protobuf:性能好,跨语言JSON:可读性好,性能一般自定义二进制协议:性能最好
  2. 网络传输:TCP长连接自定义协议:[magic][version][type][requestId][bodyLen][body]支持请求响应匹配(requestId)
  3. 服务发现:注册中心:Zookeeper、etcd、Nacos客户端缓存服务列表监听变更,动态更新
  4. 负载均衡:轮询(Round Robin)随机(Random)最小连接数一致性哈希(会话保持)
  5. 连接管理:连接池:复用连接心跳保活:定期发送心跳断线重连:自动重连

性能优化

  1. 零拷贝:sendfile、splice系统调用减少内存拷贝次数
  2. 批量发送:合并小包,减少系统调用提高网络利用率
  3. 异步调用:Future/Promise模式不阻塞业务线程
  4. 线程模型:IO线程:处理网络读写业务线程:处理业务逻辑分离,互不影响

可靠性保证

  • 超时重试:可配置重试次数
  • 熔断降级:错误率高时自动熔断
  • 限流保护:防止雪崩

参考实现:gRPC、brpc、Thrift

6. 线上服务出现内存泄漏,如何排查和解决

答案:

发现阶段

  • 监控发现内存持续增长
  • top命令看RES不断上升
  • 服务运行一段时间后OOM

排查工具

  1. Valgrind(测试环境)
valgrind --leak-check=full --show-leak-kinds=all ./app

  • 优点:详细的泄漏报告和调用栈
  • 缺点:性能损耗大(10-50倍)
  1. AddressSanitizer
g++ -fsanitize=address -g -o app app.cpp
./app

  • 优点:性能损耗小(2倍),能检测多种问题
  • 缺点:需要重新编译
  1. tcmalloc/jemalloc
LD_PRELOAD=/usr/lib/libtcmalloc.so HEAPPROFILE=/tmp/heap ./app
pprof --pdf ./app /tmp/heap.0001.heap > heap.pdf

  • 可以在生产环境使用
  • 生成heap profile分析
  1. 查看进程内存
cat /proc/<PID>/status | grep -i vm
cat /proc/<PID>/smaps
pmap -x <PID>

定位问题

  • 查看哪个模块内存增长
  • 分析调用栈,找到分配点
  • 检查是否有delete/free

常见原因

  • new/delete不匹配
  • 容器存裸指针,未释放
  • shared_ptr循环引用
  • 异常导致未释放
  • 第三方库泄漏

解决方案

  • 用智能指针管理内存
  • RAII原则
  • 代码审查
  • 定期压测

7. 如何设计一个分布式ID生成器

答案:

需求

  • 全局唯一
  • 趋势递增(方便排序、索引)
  • 高性能(百万级QPS)
  • 高可用

方案对比

  1. UUID:优点:简单,本地生成缺点:无序,占用空间大(36字节)
  2. 数据库自增ID:优点:简单,有序缺点:性能瓶颈,单点故障
  3. Red

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

04-11 10:31
已编辑
南昌大学 Java
美团三个志愿都是后端,没约面,然后挂掉了进入池子。被池子里面的前端&amp;移动端捞起面了(约面时候我以为是后端,看了一眼以为是客户端,直到面试前我都以为是客户端)。因为实在没面了,就想着面一下吧。4.10&nbsp;一面部门是做美团地图的前端(当时不知道是前端,还以为是客户端),面试官人挺好的。自我介绍挑项目里的一个点说一下(随便说了一个12306的微服务循环调用的问题)看你提到了分库分表?怎么用的?(扯了一下基因法)基因法是怎么设计的?那聚合查询问题是怎么解决的?(不会,这个忘记了)实习里面的MQ消息怎么保证不丢失的?ai的使用?(我说cc用的多,其实我也没用多少)cc写的时候万一不符合预期你怎么整?(我说优化提示词,这问题我真不会,没怎么了解过ai)万一不是提示词的问题呢?可能是他不知道你的功能是怎么样子?(这里我扯了一嘴skill)你说说skill和mcp的区别?(随便瞎扯了几句)进程、线程的区别?(吟唱)tcp三次握手、四次挥手?(吟唱)get和post的区别?(吟唱)数据结构里面的&nbsp;二叉树的前序中序后序遍历?(问到这里感觉是kpi了)先说思路,再写个算法题吧:lc买卖股票的最大利润&nbsp;&nbsp;&nbsp;1min秒了。原题写对了(后面扯了一下不借助额外空间找第二大利润,我以为是买2次,结果不是。面试官给了思路我还是没想起来,后面写完说情况不全,是两种情况就让写下一题了)这题事后感觉还是比较简单的,但是当时不知道为啥没想起来。lc无重复最长子串&nbsp;&nbsp;2min秒了同学,我们这边是前端,想问一下你来的意愿(我说,要我的话我肯定来)前端你会多少?(我说我大一用vue写了个博客,仅限于使用)vue是吧?我们这边是做vue、react啥的(后面的框架我都没听清,也不知道是啥)肯定了表现。反问:转前端的建议和期望?(对实习生没有期望,建议:我们这边有实习的培训)反问:我的表现?(计算机基础还可以,整体可以,ai多去了解一下)面了50min(这点东西居然问了50min,我有点意外)问的太简单了,我还是维持原判,面完这个是投agent岗位了,争取找个中小厂agent暑期就可以了。
查看19道真题和解析
点赞 评论 收藏
分享
04-07 01:45
门头沟学院 Java
感觉自己好菜、面试很难,还是要多多练习Q1:&nbsp;那你在做项目过程中,你觉得自己遇到的最难的困题是啥?Q2:&nbsp;你视频的处理分片是把它分成什么&nbsp;M3U8&nbsp;文件吗?Q3:&nbsp;那你视频流读取过程中用什么请求?它会不会涉及到跨域跳转这些?Q4:&nbsp;那你那个文件上传的时候,像你说的那个断点,就是比如说网络中断的情况下,你是怎么保持后续的工作的?Q5:&nbsp;所以你是记录的一个状态,然后给到前端,那你这里只记录这个状态,只用到&nbsp;Redis&nbsp;是吧?Q6:&nbsp;那你是先写&nbsp;Redis&nbsp;还是先写&nbsp;Mysql?Q7:&nbsp;那如果那个&nbsp;Redis&nbsp;那个就是挂了怎么办?Q8:&nbsp;比如说我举个详细点的例子,比如说&nbsp;Redis&nbsp;某一个节点挂了,那你这个节点挂了之后,就是这个服务就不可用了。还是说?Q9:&nbsp;那你现在用的是主从还是什么模式?Q10:&nbsp;比如说就是你现在是分片上传,那分片合并的时候会不会有重复的情况?Q11:&nbsp;前端去重,你有没有考虑到一个情况?如果你是做一个&nbsp;Web&nbsp;页面,你的前端可能涉及到的鉴权没办法去避免恶意攻击,同样一个请求带着自己的&nbsp;cookie&nbsp;重复的去上传你的服务,会对你服务造成什么影响吗?Q12:&nbsp;令牌桶限流,那你的&nbsp;key&nbsp;是啥呀?Q13:&nbsp;说到限流,你知道的那个限流的算法一共有几个?Q14:&nbsp;令牌桶你说的弹性可能不是很准确,你可以再详细的说一下令牌桶它的所谓的弹性在哪里?Q15:&nbsp;说的没问题。那我再详细地说一下那个令牌,比如说我现在限流是&nbsp;100,5&nbsp;秒极限流&nbsp;100,我上一秒的请求是&nbsp;50,这一秒的请求是&nbsp;150,我会被限流住吗?
查看15道真题和解析
点赞 评论 收藏
分享
3.27&nbsp;全程70min面试官简单介绍部门自我介绍你是学学习方向好像是机器学习的方向,然后为什么是想要想到要学前端呢?你做的项目的背景是什么呢?怎么来学习前端这块的?自学通过什么途径来学习的?怎么来想到要做这些项目呢?怎么完善开发体系做项目的过程中哪一部分花时间比较长?项目有部署过吗?有在线上跑过吗?项目目前哪一方面有些不足?项目的整体流程是怎样的?为什么用localstorage存储?Local&nbsp;Storage&nbsp;本身有大小的限制吗?会不会丢失上下文?业界有没有比较好的做法?(这个没答出来就换题目了)必须要用虚拟滚动吗&nbsp;为什么统一对话请求是是什么意思呢?项目中&nbsp;AI&nbsp;参与比例AI&nbsp;主要用在哪些方面前端基础怎么学、哪部分比较熟悉JavaScript&nbsp;有哪些数据类型基本类型与引用类型的区别let&nbsp;和&nbsp;const&nbsp;的区别如何检测对象类型instanceof&nbsp;的作用未知自定义实例如何判断类型手写实现类型判断(Object.prototype.toString.call&nbsp;逻辑)手写防抖和节流防抖的作用与使用场景反问对前端学习的建议随着ai的发展对前端面试的考核会不会有aicoding(面试官说如果能参与后面的二面的话会有AICoding的)ai对前端岗位影响的看法base面试官最后还问了能实习多长时间参加了好多家面试&nbsp;美团的面试体验是最好的&nbsp;面试官很温柔&nbsp;不会的也会引导&nbsp;基础部分问的也很简单&nbsp;希望不是kpi面&nbsp;许愿能过
查看28道真题和解析
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务