面试官:讲讲微信“正在输入”的原理?别再拿 WebSocket 忽悠我了 📅 2026/6/27 2:01:49 昨天半夜技术交流群里有个小老弟崩溃吐槽。他白天去面了某大厂的后端架构岗前面聊 JVM 调优、聊 MySQL 锁机制、聊 Redis 高可用那是对答如流、刀光剑影。结果最后倒在了一个看着毫不起眼的“小玩具”功能上。面试官微微一笑“你平时用微信吧能讲讲那个‘对方正在输入…’功能如果是你来做底层架构会怎么设计吗”这小老弟心想这题我熟啊脱口而出“这简单两边客户端起个 WebSocket 长连接只要 A 的键盘一动就给服务端发个消息服务端再透传给 B。齐活”面试官听完没说话喝了口水反问“微信十几亿日活每天晚高峰大家都在激情对线。要是每个人每敲一个字母客户端就发一个网络请求你算过这个并发量吗你信不信按你这个方案今晚网关服务器就得物理冒烟”小老弟瞬间哑火。其实这道题根本不是在考你懂不懂 WebSocket它是一道披着前端外衣的“高并发流量削峰 极限状态同步”的顶级架构题。今天咱们就带你拆解一下看看国民级 APP 是怎么用“四两拨千斤”的骚操作把海量并发化解于无形的。第一层心法别拿技术硬刚用“产品规则”物理超度流量很多程序员的通病是一上来就想着用 Kafka、用 Redis 集群去硬抗并发。但真正顶级的架构师第一步绝对是和产品经理“拉扯”。在微信里最让人心跳加速的就是顶端闪烁的“对方正在输入...”。但你要知道这玩意儿能扛住十几亿人的折腾最大的功劳在于它暗藏的“变态级”产品红线。微信官方揭秘过触发这个功能必须同时满足两个极其苛刻的条件10秒黄金法则你发出消息后对方必须在10秒内打开对话框。动作感对方打开了且还在输入框里打了字哪怕只是打个空格。看懂了吗如果你发了消息对方对着屏幕发呆了半分钟才开始回抱歉服务器压根不伺候你这边什么都看不到。通过这套极其克制的业务规则微信把一个原本可能是百亿 QPS 的灾难级动作硬生生降维成了一个低频的偶发事件。90% 的无效网络请求在客户端就被直接“物理超度”了。第二层心法抛弃长连接拥抱“信令握手”与指挥塔模式好了现在 A 满足了 10 秒法则终于开始打字了。是不是就开始用长连接狂发数据了大错特错。官方明确说过微信聊天并非时刻连接而是采用了一套高效的“对讲机指挥塔”模式。专业术语叫信令握手Signaling Handshake。什么意思呢为了极致省电和省流量大厂是绝对不会让你的手机时刻处于高频数据传输状态的。申请频道当 A 开始输入A 的微信就像拿起对讲机向指挥塔微信服务器发送一个极小极轻量的状态信令申请临时私密频道。而且客户端内置了状态机防抖短时间内怎么狂敲键盘都只发一次。查户口丢弃逻辑服务器收到这个信令后绝不盲目转发它会立刻去高性能缓存比如 Redis或者网关节点的 Local Cache里查 B 的底细“B 此时此刻在线吗B 的当前活跃窗口是 A 吗”精准打击如果 B 正在刷朋友圈服务器二话不说直接在内存里把这个信令丢进垃圾桶。只有确认 B 正在眼巴巴地盯着和 A 的聊天框服务器才会把“A已准备回话”的信号透传给 B。这就是为什么你和别人聊天时“正在输入”会时有时无——因为你们之间的信令通道不是永远粘连的而是在反复地进行轻量级握手与断开。服务端在这里扮演的是一个“无情的太极大师”主打一个能不转发就不转发。第三层心法那些“不显示”的边缘场景才是架构师的修罗场面试官往往会在这时候给你下套“那你知道有哪些情况明明在打字但就是不显示吗”如果你能把下面这几个异常边界场景Edge Cases甩在面试官脸上这 Offer 基本就稳了PC 端微信不触发为什么因为 PC 端经常是键盘盲打、多窗口并发。如果全量同步状态无效信令极多并且彻底失去了移动端“面对面对讲机”的特定语境。表情包不触发斗图时发表情包是单次点击触发不存在“持续输入”的过程直接走消息下发通道根本不触碰信令层。输入法缓冲池盲区如果对方在第三方输入法里“打了删删了打”只要他没把字真正上屏进入微信的输入框组件微信是无法捕获 keystroke 事件的你自然什么都看不到。第四层心法去中心化自毁破解弱网卡死之局这是整个设计的“封神”之笔。面试官最后的一击“如果 A 触发了状态B 的手机上也显示了‘正在输入’。这时候 A 突然拿着手机进了电梯彻底断网了没法发‘我输入完了’的信号。B 的屏幕是不是就永远卡死在‘正在输入’上了”如果你答“服务器用心跳包检测掉线了再通知 B”那你就太嫩了太耗费服务器资源了满分答案是客户端本地定时自毁机制。B 的客户端在收到“正在输入”的信令时压根不需要服务器来告诉它什么时候结束。客户端自己会默默启动一个5秒的倒计时。如果在这 5 秒内A 把消息发过来了新消息直接覆盖提示平滑消失。如果过了 5 秒A 还是没动静不管他是进电梯断网了还是在思考人生B 的客户端就会强制自己把提示隐藏掉。这种“单向信令下推 本地定时自毁”的设计既完美解决了弱网状态卡死的问题又省掉了 A 端续期状态的大量带宽成本。面试标准答案模板直接套用惊艳面试官“设计微信的‘正在输入’功能其核心本质不是技术实现有多难而是在海量并发下如何通过业务规则降噪和容错机制兜底实现极致的‘流量削峰’与状态同步。它体现了在海量社交系统中对体验、成本和安全的三角平衡思维。在架构设计上我们可以总结为四层防御神盾第一层神盾端侧策略降噪源头削峰微信通过‘收到消息后10秒内输入才触发’以及‘只有接收方保持在当前聊天视窗才触达’的产品规则结合客户端状态机防抖确保在 10 秒黄金周期内发送端无论敲击多少次键盘只会向服务端发送一次State1正在输入的轻量级信令在客户端直接拦截了超90%的无效高频网络请求。第二层神盾信令网关转发按需转发为了省电省流并没有采用维持高频数据通道的复用而是采用轻量级、短断续续的信令握手。消息网关Gateway接收到信令后不盲目透传。而是去高性能缓存如 Redis/Local Cache快速查询接收方状态是否在线当前活跃视窗是否为发送方若不匹配直接丢弃Drop Logic该信令将无谓的转发带宽降至极低。第三层神盾去中心化自毁兜底容错体验接收端在收到信令后显示‘正在输入...’同时启动一个5秒本地自毁计时器。计时器超时或收到新消息时会自动将该状态平滑覆盖和隐藏。这种下推单向信令配合本地定时自毁的设计完美避开了发送方断网、切后台导致服务器无感知而导致的状态卡死无需复杂的服务器心跳监测。第四层神盾多维隐私限制深度过滤此外架构设计必须通过产品策略前置过滤特定场景表情包发送不触发、PC端微信不触达因打字习惯不同、第三方输入法缓冲池盲区字未进聊天框前不捕捉keystroke。将用户体验限定在最核心的移动社交场景中。总结来说核心思想就是用产品策略前置削峰用缓存网关挡并发用本地超时做容错在极低的服务端成本下实现了降本增效与高可用体验的完美闭环。”Fox有话说技术的冰冷与人性的温度其实咱们搞技术的天天盯着并发、锁、微服务很容易陷入“技术自嗨”。很多人问过既然都能做“正在输入”了微信为什么不做“已读”功能因为“已读”意味着“看见了但没回”这会给社交带来极大的猜忌、焦虑和压迫感。没有已读是把“回应与否”的选择权体面地交还给用户。 而“正在输入”则是一种“有限度的透明”。它保留了对话的气口就像对方没有马上说话而是深吸了一口气张了张嘴。它在告诉你“我在线我在乎我正在回应。”顶级的系统架构永远不是生硬地堆砌中间件。它是技术的妥协也是产品的艺术它不瞎浪费一丝服务器资源最后只用最精简的代码去成全了人性的温度。这才是大厂面试官真正想听到的答案。