腾讯 Java / 后端怎么准备
腾讯后端面试因 BG 而异,但社交消息和资金安全是公开讨论里反复出现的约束:不能多扣、不能丢、不能把已读变成未读。
下面五题走红包、回执、长连接、对账和事故复盘,请用自己做过的一致性和连接管理经历来答。
腾讯怎么面Java后端
- 基础之后往往进入「正确性」:重复消息、乱序、部分失败。
- 即时通讯相关团队会问连接生命周期;支付相关会问对账。
- 把方案讲到可回放:如何用日志证明没有多发。
面试阶段与知识点
第一批不把每个阶段拆成独立 URL,避免程序化重复页。阶段对应下面的题,练完再用模拟面试串起来。
- 并发与正确性:锁、CAS 和幂等,要落到资金或消息。
- 连接与投递:长连接、回执和重复。
- 对账与事故:用一次真实核对说明你怎么收口。
- 复盘:事故里你的责任边界。
值得开口练的题
每题给考察点、思路、结构化参考答案和追问。参考答案用来组织语言,面试时必须换成你自己的项目事实。
微信红包这种「扣余额再入账」如何避免多发?
考察点
- 资金流水
- 幂等与条件更新
- 对账
回答思路
先声明这是教学场景,按通用资金正确性讲,不描述任何未公开实现。
结构化参考答案
- 扣减必须是条件更新:余额足够才成功,失败返回明确错误,禁止先改缓存再补库。
- 每一笔有唯一流水号,重试用同一流水,避免网络重试造成二次扣减。
- 入账和扣减要么事务消息,要么先记意图再异步,最终以账本为准。
- 日终对账比实时缓存更重要,差异进入冻结和人工。
面试官可能追问
- 用户重复点击十次,你返回什么?
- 缓存余额和账本不一致谁赢?
- 跨系统入账失败如何补偿?
已读回执重复到达,会话未读数会被减成负数吗?
考察点
- 计数下限
- 消息乱序
- 会话维度聚合
回答思路
这是计数加乱序问题。先保证单会话内更新串行或用版本号,再谈缓存和性能优化。
结构化参考答案
- 未读数更新带版本或「只减一次」的回执集合,重复回执直接忽略,避免同一回执扣两次。
- 乱序时用最后一条已读进度覆盖,而不是每条回执都减一,避免跳过中间消息。
- 展示层不允许出现负数,但根因仍要修,不能只靠 max(0, n) 把错误藏起来。
- 多端同步以服务端进度为准,客户端本地减只是乐观展示,最终以服务端合并结果为准。
面试官可能追问
- 两台手机同时已读怎么合并?
- 撤回消息如何影响未读?
- 离线很久的设备上来会不会把进度打回去?
百万级长连接,心跳失败你要不要立刻踢下线?
考察点
- 弱网与误踢
- 状态扩散
- 资源回收
回答思路
先区分「探测失败」和「确定离线」。即时通讯里误踢比晚踢更伤体验,宽限期要有依据。
结构化参考答案
- 心跳失败先进入宽限期,连续多次失败或收到主动断开才标记离线,避免弱网一次抖动就踢。
- 确认离线后要同步路由表和推送通道,避免继续往已失效连接写消息造成堆积。
- 重连应恢复同一会话身份而不是新建连接,防止未读数和推送状态在两端分叉。
- 容量规划上心跳周期和超时要按真实带宽和连接数估算,不能按实验室 RTT 拍脑袋。
面试官可能追问
- 弱网地区心跳周期怎么调?
- 如何防止心跳风暴?
- 连接迁移时消息是否会双发?
日终发现账本和渠道差了几笔,你怎么查?
考察点
- 对账范围
- 单边账
- 冻结
回答思路
按时间窗口和流水号逐笔对齐,先分类再处置,不要一上来改余额或手工冲正。
结构化参考答案
- 先固定对账窗口和时区,把在途交易单独挂起,避免把未落账流水算进差异。
- 对不上的分成三类:我有他无、他有我无、金额不等,每类走不同排查路径。
- 单边账先冻结相关账户或订单,禁止继续自动冲正到可能错误的方向。
- 修数必须有工单和双人复核,并补监控与告警,避免同一原因在下一日再现。
面试官可能追问
- 在途资金最多挂多久?
- 如果渠道对账单延迟一天怎么办?
- 你会不会先改用户可见余额?
一次误踢造成用户收不到消息,你怎么复盘?
考察点
- 影响面
- 根因
- 防护
回答思路
复盘讲事实、影响面和机制改进,不讲谁态度差,也不把责任推给单一值班同学。
结构化参考答案
- 影响:统计多长时间内多少连接被误判离线,消息是否堆积、用户投诉是否上升。
- 根因:区分心跳阈值过严、机房网络抖动还是路由表更新竞态,用日志和指标佐证。
- 动作:回滚阈值配置、对受影响用户补发消息,并加误踢率与离线误判告警。
- 机制:连接相关变更必须演练弱网场景,而不是只在办公网低延迟环境验收。
面试官可能追问
- 你个人在这次变更里的角色?
- 如果产品要求更激进踢线省资源,你怎么答?
- 如何验证补发没有造成重复?
和岗位、模拟面试一起用
资料管理里保存目标岗位 JD,模拟面试会按简历出题。点题目下的按钮会把本题带进模拟开场,仍需先绑定简历与岗位。