💡应聘技术问题
问题:"如何设计一个支持百万级并发的 API 网关?"
参考答案:
设计高并发 API 网关需要从多个层面考虑。接入层采用 LVS + Nginx 做四七层负载均衡,将流量分散到多个网关实例。网关核心使用异步非阻塞模型,Go 可以用 goroutine + channel,Java 用 Netty 的 EventLoop。限流策略上,令牌桶算法控制单接口 QPS,滑动窗口做全局限流,配合 Redis 实现分布式限流。路由转发通过前缀树匹配请求路径,减少正则匹配开销。缓存层对幂等查询接口做本地缓存(如 FreeCache)+ 分布式缓存(Redis)两级缓存,热点 Key 用本地缓存兜底。熔断降级方面,基于错误率和响应时间做自适应熔断,降级策略预先配置好 fallback 逻辑。监控埋点覆盖每个接口的延迟分布(P50/P99)、错误率、QPS,用 Prometheus + Grafana 做实时可视化。整个网关无状态设计,水平扩展只需要加实例,配合 K8s HPA 可以根据 CPU/自定义指标自动扩缩容。
问题:"OAuth 2.0 的授权码模式流程是怎样的?在开放平台中如何保证第三方接入的安全性?"
参考答案:
授权码模式的流程分四步:第一步,第三方应用将用户重定向到授权服务器,带上 client_id、redirect_uri、scope 和 state 参数;第二步,用户在授权页面登录并同意授权,授权服务器生成一个短期有效的授权码 code,通过 redirect_uri 回调给第三方;第三步,第三方后端用 code + client_secret 向授权服务器换取 access_token(这一步在后端完成,secret 不会暴露给浏览器);第四步,第三方用 access_token 调用资源服务器的 API。
开放平台的安全保障措施包括:redirect_uri 严格白名单校验,防止开放重定向攻击;state 参数防 CSRF,回调时必须校验一致性;授权码一次性使用且短有效期(通常5分钟);access_token 设合理过期时间,配合 refresh_token 续期;scope 做细粒度权限控制,最小化授权范围;API 调用层面做签名验证(HMAC-SHA256),加时间戳防重放;敏感操作做二次确认;全链路审计日志记录每次鉴权和调用行为。对于高安全级别场景,还可以接入 PKCE 增强(即使授权码泄露也无法换 token)和 IP 白名单机制。
问题:"Redis 在高并发场景下常见的问题有哪些?如何解决?"
参考答案:
几个典型问题及对应解法。缓存穿透:大量请求查询不存在的 Key,直接打到数据库。解法是对查不到的数据缓存空值(设短过期时间),或者用布隆过滤器前置拦截,Guava 或 Redisson 都有现成实现。缓存击穿:某个热点 Key 过期瞬间,大量并发请求同时穿透到数据库。可以用互斥锁(Redis SETNX)让只有一个请求去加载,其他请求等待;或者热点数据不设过期时间,由后台异步刷新。缓存雪崩:大批 Key 同时过期,数据库瞬时压力骤增。将过期时间加随机偏移量打散,或者做多级缓存(本地缓存 + Redis),本地缓存用 Caffeine,即使 Redis 全挂也能扛一部分流量。热 Key 问题:单个 Key 访问量极大,单节点成为瓶颈。可以将热 Key 拆分为多个子 Key 分布到不同节点,或者在客户端做本地缓存。大 Key 问题:单个 Value 过大(如超过 10KB 的 Hash 或 List),影响序列化性能和阻塞单线程。拆分为小 Key,或用压缩算法减少体积。数据一致性方面,采用 Cache-Aside 模式,先更新数据库再删缓存,配合延迟双删或订阅 binlog 做最终一致性保障。
问题:"描述一个你参与过的技术项目,你在其中承担了什么角色,遇到了什么技术难点,如何解决的?"
参考答案:
这类问题考察的是实际工程能力和解决问题的思路。回答时建议用 STAR 结构组织:Situation(项目背景和目标)→ Task(你的具体职责)→ Action(你做了什么,技术决策过程)→ Result(量化结果)。
举例来说,假设你参与了一个校园二手交易平台的开发。背景是学校没有统一的二手交易平台,微信群信息分散难以检索。你的角色是后端核心开发,负责商品发布、搜索和消息通知模块。技术难点在于商品搜索性能,初期直接查 MySQL LIKE 模糊查询,数据量到 5000 条后响应时间超过 2 秒。你的解决方案是引入 Elasticsearch 做全文检索,设计索引 mapping 支持标题+描述的分词搜索,用 RabbitMQ 做 MySQL 到 ES 的异步数据同步。最终搜索响应降到 100ms 以内,日活用户增长到 2000+。关键是把重点放在你个人的贡献和技术决策上,而不是泛泛描述团队成果。
问题:"开放平台的某个核心 API 响应时间突然从 50ms 飙升到 2s,你会如何排查?"
参考答案:
先确定影响范围。看监控面板判断是单个接口还是多个接口同时变慢,是全部请求都慢还是部分请求慢。如果是全部接口同时变慢,大概率是基础设施层面的问题——查看机器 CPU、内存、磁盘 IO、网络带宽是否异常,检查是否有慢 SQL 占满数据库连接池,Redis 是否有大 Key 阻塞或者内存满了在频繁驱逐。
如果只是单个接口变慢,先看这个接口的依赖链路。通过分布式链路追踪(Jaeger 或 SkyWalking)定位耗时卡在哪个环节。常见原因:下游服务响应变慢,查下游日志看是否有异常;数据库慢查询,查慢查询日志,看是不是新上的查询没走索引;缓存失效导致大量请求穿透到数据库;网络抖动导致 RPC 调用超时重试放大了问题。如果是依赖方的问题,看熔断器是否正常触发,降级逻辑是否生效。
临时止血手段:如果是数据库压力过大,考虑限流降级非核心接口,减少数据库负载;如果是缓存失效,手动预热缓存;如果是某台机器有问题,从负载均衡摘除。根本解决需要根据根因修复,比如加索引、优化查询、调整缓存策略、扩容等。最后做复盘,补齐监控告警(比如 P99 延迟超过阈值自动告警),避免同类问题再次发生。
🎯应聘面试准备
问:想应聘上述岗位,需要做哪些准备?
答:
简历优化
1.核心信息前置
- 学历背景:
- 工作经验:
- 技术栈: Go/Java/C++ 至少一门主力语言,熟悉 Linux、网络协议、数据库与缓存
- 意向岗位:
2.匹配岗位关键词
- 技术栈: Go / Java / C++、MySQL / PostgreSQL、Redis / Memcached、RPC 框架
- 工程能力: 高并发系统设计、分布式系统、微服务治理、API 网关、OAuth/SSO
- 工具与平台: Linux、Docker、Kubernetes、Istio、Git
- 能力标签: 接口规范设计、流控与审计、技术文档撰写、开发者生态支持
技能梳理
编程语言方面,Go/Java/C++ 至少精通一门,重点搞懂并发模型——Go 的 goroutine/channel、Java 线程池、C++ 多线程各自怎么处理并发。操作系统要理解进程调度、内存管理和文件系统,网络方面 TCP 三次握手/四次挥手、HTTP/2 多路复用、WebSocket 长连接这些都是基础。
数据库和缓存是重头。MySQL 的 B+ 树索引、聚簇索引、覆盖索引原理要清楚,事务隔离级别和锁机制要能讲明白,慢查询优化要会实战。PostgreSQL 的 MVCC 机制了解一下。Redis 方面,五大数据结构底层实现、RDB/AOF 持久化、主从哨兵、集群分片,这些都会被问到。
分布式这块,CAP 理论和 Raft/Paxos 一致性协议是面试高频题。服务注册发现(etcd/Consul)、负载均衡(一致性哈希、加权轮询)、熔断降级(Hystrix/Sentinel)、链路追踪(Jaeger/SkyWalking)要能串起来讲。RPC 框架(gRPC、Thrift)的序列化方式、服务路由和超时重试机制也要了解。
开放平台方向会问到 OAuth 2.0 / OIDC 认证流程、API 网关设计(路由、限流、鉴权、日志),以及开放 API 的版本管理策略。Docker 镜像构建和 K8s 的 Pod/Service/Deployment 资源模型也要有基本概念。
面试准备
经典问题
- MySQL 索引失效的常见场景有哪些?用 EXPLAIN 怎么分析?
- Go 的 goroutine 调度模型 GMP 是怎样的?和 Java 线程模型有什么区别?
系统设计
- 设计一个支持多种授权模式和细粒度权限控制的 OAuth 2.0 授权服务
- 从零设计一个 API 网关:路由转发、限流、熔断、鉴权、监控怎么串起来
- 开放平台要对接第三方,数据开放与集成的安全方案怎么设计
项目经验准备
- 挑 1-2 个核心项目讲清楚:做了什么、怎么做的、踩了什么坑、结果怎样。面试官更关注你个人的技术决策和解决问题的过程,而不是团队整体做了什么
- 课程设计或实验项目也可以聊,但要把工程化细节准备好——怎么设计的、为什么这么选型
- 有开源贡献的话,整理好贡献内容和你做技术决策的过程