周末三天,林远全泡在西厢房。
小艾三个分身同时运转。工作站主体全力备战。消息队列压测调到六千封每秒,延迟压到八点三毫秒。贝叶斯过滤器准确率停在九十一。七,到顶了,再往上需要真实用户数据。
够了。
六月九日,周一。
下午一点十五分,林远换了件干净t恤。远程看不到人,但仪式感不能少。
他坐在工作站前,打开qq。一点五十八分,张智勇邀请添加多人语音通话。
林远点击接受。
耳机里先是一阵电流杂音,然后几个人低声说话。2003年的qq语音采样率低、带宽窄,人声像蒙了层薄纱。
上次去腾迅是一月份,亲自飞到深圳,马化腾在宝安机场举着”sw”的牌子接机。那回只有几个人知道他到了深圳。这次更省事——sars困在北京,连飞机都不用坐。
”守望,在吗?”
”在。”
”我这边四位。产品总监李峻,架构师方河、陈思远。评审流程:你先讲方案二十分钟,然后现场演示,最后技术质询。全程不超过一个半小时。”
”没问题。”
”qq邮箱的内核痛点,三个。”林远语速平稳。
”第一,垃圾邮件泛滥。现有规则基于关键词黑名单,误判率高漏判更高,占比超过百分之四十。第二,高峰投递延迟严重。去年除夕消息队列堆积超两百万封,延迟最长达四十分钟。第三,架构扩展性差,单线程处理,加机器没用。”
”方案分三个模块。分布式消息队列引擎解决延迟和扩展性,贝叶斯过滤器解决垃圾邮件识别,动态负载均衡让系统自动扩缩容。”
他通过qq远程协助把屏幕共享过去,点开消息队列引擎的架构图。
”内核设计是分区顺序写入。消息按收件人id做哈希分区,同一分区顺序写盘,跨分区并行。持久化用写前日志加分区快照——先写wal再入内存队列,异步刷盘。进程崩溃从wal恢复,零丢失。”
”单队列吞吐每秒十万条。”
”第二个模块,贝叶斯过滤器。”
命令行窗口打开,日志刷出。
”十二万封标注邮件,十折交叉验证。准确率九十一。七,召回率八十八。二,精确率九十四。五。现有规则过滤系统准确率七十三。六,提升超过十个百分点。”
”更关键的是误判率——正常邮件被误判的概率低于千分之三。用户最恨这个。”
”下面现场压测。”
压测终端打开。
”双路至强三点零六吉赫兹,四个g内存,三块scsi磁盘raid 5。仿真十万并发用户,每人每秒一封,持续六十秒。”
回车。
终端数据滚动——投递速率、平均延迟、队列深度、磁盘io。
”当前三千二百封每秒,延迟六毫秒。”
数字跳动。三千五,四千,四千五——逼近五千。
五千封每秒。稳住。围绕五千波动,延迟始终低于十毫秒。
六十秒结束。平均速率五千零二十三封每秒,延迟八点三毫秒,零丢失。
截图,qq文档传输发过去。
耳机里沉默五秒。
”压测数据可以复现吗?”陈思远问。
”随时。脚本和配置都可以给。”
质询环节。
方河先开口:”消息队列的持久化用wal,刷盘策略是什么?同步还是批量?”
”批量。五十毫秒或一百条触发一次。崩溃最多丢五十毫秒的消息,但发送端超三秒无回执自动重发,最终不丢。”
”重试风暴呢?”
”指数退避,首次一秒,之后翻倍,最大五分钟。峰值不超正常流量百分之十五。”
方河没再追问。
陈思远接上:”贝叶斯过滤器的训练数据从哪来?”
”enron语料库和spaassass公开样本。”
”问题就在这。”陈思远语气锐利起来,”enron是企业内部邮件,spaassass是英文样本。qq邮箱用户是中文环境,分布差异大。泛化能力怎么保证?”
”三个策略。字符n-gra加词性标注混合,中英文通用。部署后收集用户标记数据每周重训练。再加迁移学习——公开数据预训练,真实数据微调。”
”n-gra的n取多少?”
”二元三元混合。实测比单一n值提升两个百分点。”
第三个问题还是方河:”这套方案能撑多大用户规模?”
”设计目标两亿用户,日均投递五亿封。消息队列通过增加分区水平扩展,理论上节点数不受限。”
”两亿?qq邮箱现在不到一亿。”
”为未来三年留馀量。等涨到两亿再改架构,代价是现在的十倍。”
李峻一直没说话。
直到这时他才开口:”守望,我问一个。”
”请说。”
”你的贝叶斯过滤器没有集成到