12.1 设计一个高并发点赞接口,如何优化性能?
设计要点:
- 问题: 点赞操作是高频写操作,数据库直接写可能成为瓶颈。
优化方案:
-
缓存计数 + 异步落库
-
点赞先写缓存(Redis Hash / Sorted Set)
-
定时批量同步缓存数据到数据库,减少 DB 写压力
-
-
热点数据分片
- 对热点数据分片(比如分成多个 Redis key),减少单点竞争
-
幂等处理
- 防止重复点赞,用用户ID作为唯一标识存 Redis Set
-
使用消息队列异步处理
- 点赞请求先写 MQ,再由消费者更新数据库
-
读写分离 + 数据库索引优化
- 读请求走缓存,写请求异步,数据库索引优化查询
12.2 设计一个订单系统,要用 MQ 做削峰填谷,你怎么设计?
设计思路:
-
订单创建接口
-
接收订单请求,快速返回结果(预订单号)
-
把订单写入 MQ(消息持久化)
-
-
订单处理服务(消费者)
-
消费 MQ 消息,执行库存扣减、支付、订单状态更新
-
处理失败可重试,确保可靠性
-
-
库存锁定
- 在消费端做库存预扣,防止超卖
-
异步通知
- 订单处理完通知用户(短信、邮件、推送)
-
监控告警
- MQ 堆积监控,超时重试,异常报警
12.3 如果一个接口每秒有 2 万请求,你怎么优化后端架构?
方案思路:
-
负载均衡
- 使用 Nginx / LVS / 云厂商负载均衡做流量分发
-
水平扩展
- 多实例服务部署,利用容器、Kubernetes 弹性伸缩
-
缓存优化
- 接口读请求用 Redis 缓存,降低数据库访问
-
异步处理
- 尽量异步化请求流程,长耗时业务放 MQ 后台处理
-
数据库优化
- 主从读写分离、分库分表、索引优化、连接池
-
限流降级
- 流量超限使用限流策略,降级服务保证核心可用
-
监控报警
- 实时监控接口响应时间、错误率、资源使用
12.4 如何实现一个视频转码平台?如何让任务不阻塞主线程?
设计要点:
-
前端上传文件
- 支持分片上传,减少上传失败重试
-
转码任务调度
- 任务写入消息队列,异步调度
-
独立转码服务
- 使用专门转码微服务或 Worker,运行 ffmpeg 等工具
-
多进程/容器隔离
- 转码在独立进程或容器中执行,防止阻塞 Node.js 主线程
-
状态管理
- 任务状态存储(数据库 + 缓存),实时查询转码进度
-
结果存储
- 转码完成后上传至对象存储(如 OSS/S3)
-
通知机制
- 通过 WebSocket 或轮询通知用户转码完成
12.5 如何将一个单体博客系统拆分为微服务系统?拆哪些模块?
拆分思路:
-
用户服务(User Service)
- 负责用户注册、登录、权限管理
-
文章服务(Article Service)
- 负责博客文章增删改查
-
评论服务(Comment Service)
- 评论的 CRUD 及审核功能
-
通知服务(Notification Service)
- 发送系统通知、邮件、消息推送
-
搜索服务(Search Service)
- 基于 ElasticSearch 或类似方案,支持全文检索
-
媒体服务(Media Service)
- 处理图片、视频上传及转码
-
网关服务(API Gateway)
- 统一入口,路由转发、鉴权、限流
拆分原则:
-
按业务边界分
-
服务自治,低耦合
-
共享数据库避免,服务自己管理数据
-
统一认证鉴权机制(OAuth / JWT)