腾讯后端开发面经合集:HTTP 长短连接、微服务服务发现与 RPC 框架设计
- 轮次
- 面试合集
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
面经 01
面试岗位:后端开发岗 | 面试时间:2026 年 9 月 26 日
- 手撕:字符串压缩解压缩。
- 手撕:交替打印奇偶数。
- 手撕:自己新建一个文件,大概按照题目给定的形式先写入一些数据。
- 手撕:给一个 URL,访问这个 URL 拿到访问的数据后,解析其中某个特定的字段,把解析得到的数字做相加。
面经 02
面试岗位:IEG 后端开发工程师 | 面试时间:2026 年 9 月 24 日
- 说一下 HTTP 的长连接和短连接的区别。追问:长连接的目的是什么?
- 你知道哪些 Java 开发的框架?
- 你知道有哪些保障负载均衡的方法吗?
- 微服务框架有哪些?如果让你设计微服务的服务发现你会怎么做?
- 你怎么做注册中心集群的高可用性保障?
- 如果让你做一个 RPC 框架,你会从哪些方面入手?
- 平时都用哪些语言开发?追问:你觉得 C++ 有什么有趣的特点吗?
- 平时在学校的爱好是什么,会怎么去学习?
- 聊一下目前自学遇到的瓶颈和困难。
面经 03
面试岗位:TEG 后端开发工程师 | 面试时间:2026 年 9 月 23 日
- 论文相关:创新点、卷积和 Transformer 的区别?除了论文里面的方法,还有什么新的创新点可以尝试?你的论文在你们领域算是什么样的成绩?
- 从键盘输入一个 A,到显示在屏幕上,全过程描述。
- 说说对原码、反码、补码的理解。
- 怎么判断一个数的奇偶,不用取余?
- 你在腾讯实习干了什么?
- 手撕:矩阵对角线 Z 字形遍历。
- 说说对线程池、消费者生产者和任务队列的理解。
- 如果让你设计一个消息队列,你怎么设计?有锁和无锁分别怎么设计?
- 1 亿个 QQ 号,怎么找到只出现 1 次的?
- 三次握手四次挥手为什么是 3 次、4 次?
- 实习的工作是什么?
《参考解析》
HTTP 长连接与短连接的区别
短连接是「一次请求一次连接」:建连、发请求、收响应、四次挥手,每个请求都要摊上一次握手往返和 TCP 慢启动。长连接是建连后持续复用同一条 TCP 连接发多个请求,省掉重复握手与慢启动,同时减少服务端的 TIME_WAIT 与端口消耗;代价是连接被长期占用,必须配空闲超时、最大请求数和连接数上限。追问「长连接的目的是什么」,要落到三点:减少建连开销、让拥塞窗口与 TLS 会话得以复用(后续请求不再重新慢启动)、便于服务端做连接级资源规划。再补一层演进:HTTP/1.1 的长连接仍有队头阻塞,所以有域名分片;HTTP/2 用一条连接跑多路流,HTTP/3 换成 QUIC 把传输层队头阻塞也消掉。
微服务服务发现与注册中心高可用
服务发现分四步:注册、心跳续约、发现(拉取或订阅推送)、剔除。设计要点是健康检查要区分「进程活着」与「能提供服务」,摘除留宽限期避免网络抖动误杀;消费者侧必须本地缓存实例列表并定期全量对账,注册中心整体挂掉时调用链还能靠缓存继续跑。注册中心高可用靠多节点选主(Raft 类协议)保证写入线性一致,客户端同时连多个节点、故障自动切换,跨机房时明确「写只在主机房、读可同机房优先」,并在脑裂时选择宁可拒写也不双主写坏数据。还要讲清 CP 与 AP 两条路线(etcd、Consul 偏一致,Eureka 靠自我保护偏可用),以及网络分区时系统会退化成什么样子——面试官真正想听的是你的取舍和退化行为,而不是名词。
自研 RPC 框架从哪些方面入手
按调用链拆五块。①协议与序列化:定报文结构(魔数、版本、请求 id、长度、body),在性能与可读性之间选 Protobuf、Thrift 或 JSON,并预留版本兼容与跨语言扩展。②网络模型:长连接加 I/O 多路复用,Reactor 线程模型、心跳与空闲检测、连接池与重连退避。③调用端:动态代理把接口调用翻译成请求,处理超时、重试(只重试幂等接口,带退避与上限)、熔断限流、异步与请求 id 到 Future 的映射。④服务端:业务线程池与 I/O 线程隔离、背压与拒绝策略、优雅上下线。⑤服务治理:注册发现、负载均衡(随机、轮询、一致性哈希、最少活跃)、灰度路由、链路追踪与指标。最后说明真正的难点往往不是协议,而是超时与重试的边界、序列化兼容和可观测性,并讲清「自研」与「在 Dubbo/gRPC 上二次开发」的分界线。
线程池、任务队列与消息队列设计
线程池的模型是「生产者提交任务、任务队列缓冲、消费者线程取任务」,核心线程数、最大线程数、队列容量与拒绝策略共同决定「先扩线程还是先排队」;CPU 密集按核数、IO 密集按等待比放大,但前提是任务之间没有依赖,否则固定线程池会互相等待造成死锁。队列要有界:无界队列在过载时把内存堆到 OOM,有界队列配拒绝策略能把压力暴露出来,并监控队列深度与排队时长。设计消息队列要回答投递语义(至少一次 + 幂等实现精确一次效果)、顺序(同一 key 落同一分区)、持久化与刷盘、消费位点与重复消费、积压背压、重试与死信。无锁设计的核心是「单写者加原子游标」:用 CAS 或 fetch-add 抢序号、各消费者写自己的槽位;但无锁要额外处理 ABA、伪共享与内存序,实践中更常见的是分段锁加批量提交,先把锁竞争量出来再决定要不要上无锁。
1 亿个 QQ 号里找出只出现一次的那个
先问清约束:QQ 号能否重复、取值范围多大、只出现一次的有几个、内存和磁盘各有多少,再选方案。如果只有一个数出现奇数次、其余都出现偶数次,直接全部异或,O(n) 时间 O(1) 空间。更一般的情形用两位计数位图:取值上限约 10 位数即 10^10 个位置,2 bit 表示「没出现 / 出现一次 / 出现多次」,约 1.25 GB,分块扫描即可。内存装不下就按位分桶:用某一个二进制位把数据切成两半,递归到某个子集能一次放进内存;或者对 QQ 号取模分片落盘,逐片统计再合并。答题的关键不是背出位图,而是主动给出约束假设、内存测算和退化方案。
矩阵 Z 字形遍历与编程小题
Z 字形遍历(对角线遍历)用「边界法」最稳:从 (0,0) 出发,右上走时行减列加,碰到右边界或上边界就换向并小心同一轮不要重复推入;左下走时行加列减,碰到下边界或左边界同理。写法上先按 r + c 分组再对奇数层反转,实现简单、不容易漏边界。字符串压缩解压缩要主动定清楚格式与边界:连续字符计数还是只对重复片段编码、单字符是否带 1、数字与字符冲突时怎么转义,并把空串、全相同字符、数字开头这些用例说一遍。交替打印奇偶数考的是线程同步:共享一个计数器加锁或用信号量成对唤醒,注意条件判断要用 while 而不是 if(防虚假唤醒),并在结束时唤醒对端线程,避免死等。