深色模式
后端通用基础与接口设计
面向全栈岗位的语言无关基础。先口述定义与场景,再解释一致性、性能和故障边界;产品特有行为会明确标注。
1. 一个请求在服务端通常经历哪些层?
展开答案与追问
参考答案: 入口代理或网关接收请求,完成必要路由和流量控制;应用执行认证、参数校验、业务逻辑和数据访问,再序列化响应。分层是职责边界,不要求每层都部署成单独服务。
追问与易错点: 同一链路需传递请求标识,避免每层分别生成无法关联的日志。
2. 认证和授权有什么区别?
展开答案与追问
参考答案: 认证确认调用者是谁,授权判断其能否操作指定资源。所有权和租户隔离必须在服务端逐次校验,不能只依靠前端隐藏按钮。后台任务和内部服务也需要清晰身份边界。
追问与易错点: 常见漏洞是知道订单 ID 就可读取他人订单;随机 ID 不能替代授权。
3. Session 与 JWT 如何选择?
展开答案与追问
参考答案: Session 常用服务器状态和客户端会话标识;JWT 是可验证声明的格式,可减少部分集中查询但撤销与权限变化更复杂。需校验签名、有效期、发行者和受众等,不应信任客户端解码得到的声明。
追问与易错点: JWT 通常只是编码和签名,不等于加密;登出、轮换与泄露处置要单独设计。
4. API 幂等如何实现?
展开答案与追问
参考答案: 重复请求在约定范围内产生与一次相同的业务效果。创建类请求可使用幂等键和数据库唯一约束,原子记录处理状态及结果,并校验同键参数是否一致。需定义并发请求、失败重试和过期语义。
追问与易错点: HTTP 方法的幂等语义与每次响应相同不同;POST 可通过协议设计成可安全重试。HTTP 语义
5. 为什么超时不代表操作失败?
展开答案与追问
参考答案: 客户端停止等待时,服务端可能已提交结果。重试有副作用的请求需幂等设计,并能通过业务 ID 查询状态。应将超时预算分配到连接、读取和整体链路,避免下游继续做无用工作。
追问与易错点: 不要在超时后直接重复扣款或生成订单。超时与重试
6. 接口错误结构和版本兼容怎么设计?
展开答案与追问
参考答案: 区分 HTTP 状态、稳定机器错误码与用户可读信息,附可追踪请求 ID;避免暴露堆栈或敏感信息。新增字段尽量兼容旧消费者,破坏性改动使用明确版本或迁移窗口。
追问与易错点: 客户端应按错误码决策,不依赖可能本地化的文本;不要所有失败都无差别返回 200。
7. 分页、筛选、排序接口要注意什么?
展开答案与追问
参考答案: 设置最大页大小和允许排序字段,使用参数化查询并限制复杂度。游标必须绑定排序与筛选上下文,必要时防篡改。总条数、实时性和任意跳页应作为明确能力选择。
追问与易错点: 排序字段不能直接拼接不可信 SQL;参数绑定通常不能代替标识符白名单。
8. 连接池与线程/并发上限为什么重要?
展开答案与追问
参考答案: 复用连接降低建立成本,但池过大可能压垮数据库,过小又导致排队。基于依赖容量、请求持有时间和超时预算确定上限,配合有界队列和过载拒绝。
追问与易错点: 增加应用实例会放大总连接数,应计算所有实例之和而不是单实例配置。
9. 同步、异步与阻塞有什么区别?
展开答案与追问
参考答案: 同步/异步关注完成结果如何通知和组织,阻塞/非阻塞关注等待时执行资源是否被占住。异步接口也可能内部使用阻塞 I/O;CPU 密集任务不会仅因 async 语法就变快。
追问与易错点: 全栈回答可从浏览器 await 类比到服务端:挂起调用者流程不等于底层工作免费。
10. 消息投递的至多一次、至少一次和恰好一次如何理解?
展开答案与追问
参考答案: 至多一次可能丢但不重复投递;至少一次允许重试和重复;恰好一次通常只在限定系统、事务边界与配置下成立。跨数据库、外部支付等副作用需要幂等键、去重和事务协调。
追问与易错点: 消息确认前后宕机会产生不同结果,要能用时间线解释,而不是只说开启一个配置。
11. 日志、指标与链路追踪如何配合?
展开答案与追问
参考答案: 日志记录离散上下文,指标展示流量、错误、延迟和饱和度趋势,追踪连接一次请求的跨组件耗时。按用户体验定义 SLI/SLO,并避免记录令牌、密码和完整敏感载荷。
追问与易错点: 关注 p95/p99 及错误率,低平均延迟不能证明用户体验稳定。
12. 从前端转全栈,如何建立一条完整业务闭环?
展开答案与追问
参考答案: 以登录后的个人任务管理为例,设计页面状态和错误反馈、HTTP 契约、服务端授权、数据模型与事务、分页、测试、部署和观测。先用单体应用完成正确闭环,再用测量决定是否需要缓存或队列。
追问与易错点: 面试能解释一次失败如何呈现、如何重试、如何查到日志,比只罗列技术栈更有说服力。