聊聊技术探索与实践:一个快手老架构师的碎碎念

机器学习厨子
2025-12-19 09:23
阅读 719

大家好,我是老K,坐标杭州,目前在快手干了快6年架构师。从0到1搭过推荐中台、直播信令系统、还有现在主攻的短视频内容理解平台。说白了,就是那种“产品一句话,我掉十斤肉”的角色。

最近被朋友问得最多的问题是:“你们大厂是不是天天搞高大上的新技术?是不是人均LLM+Rust+eBPF?”
我只能苦笑:现实是,90%的时间在修祖传代码、对齐PRD、和运维吵架,剩下10%才轮到技术探索。

但正是那10%,让我觉得这活儿还没干废。


起因:一个“不可能”的需求

事情发生在去年双11前两周(别问为什么快手也搞双11,电商化你懂的)。产品突然提了个需求:要在3秒内完成千万级视频的多模态标签打标,并支持实时增量更新。

我当时第一反应是:“你是不是把我们当成阿里通义千问团队了?”
但转头一看排期——deadline就在11月10号晚上23:59,而那天是周五。
懂的都懂:这意味着周末泡汤,还得搭上测试同学的生日。

更扎心的是,老系统用的还是单机Python脚本 + MySQL,跑10万条就得半小时。别说千万级,十万级都卡成PPT。

那一刻,我真的想砸电脑。


技术选型:不是炫技,是求生

既然要重构,就得动真格的。我和团队开了个“生死会”,定了几个原则:

  1. 不碰业务逻辑,只做基础设施加速(避免和产品扯皮)
  2. 必须能灰度、能回滚(运维大哥的底线)
  3. 尽量复用现有中间件(省得重新申请资源)

于是我们盯上了三个方向:

  • 向量计算加速:用FAISS替代手写余弦相似度
  • 流批一体处理:Flink + Kafka 替代 cron job
  • 特征存储优化:Redis + RocksDB 混合缓存

但最头疼的其实是模型推理部分。原来的PyTorch模型加载一次就要4GB内存,还不能并发。线上机器就32G,光这个就能把资源吃干。

这时候,ChatGPT救了我一命
我直接丢给它一段报错:

RuntimeError: CUDA out of memory. Tried to allocate 2.10 GiB (GPU 0; 15.78 GiB total capacity)

它反问我:“你试过 torch.compilevLLM 吗?或者考虑 Triton Inference Server?”

说实话,之前我一直觉得AI辅助编程是噱头,但那次之后,我真香了。Claude甚至帮我画了个推理流水线图(虽然不能贴图,但脑补一下)

最后我们选了 Triton + ONNX Runtime 组合:

  • 模型提前转ONNX,减小体积
  • Triton自动批处理(dynamic batching)
  • GPU显存占用从4G压到1.2G,QPS从8提升到220+

踩坑实录:那些凌晨三点的崩溃瞬间

当然,过程没那么顺利。分享两个血泪教训:

坑1:Flink状态后端配置翻车

为了支持实时增量,我们用Flink做特征聚合。本地跑得好好的,一上生产就OOM。

查了半天,发现是 state.backend: rocksdb 没配 rocksdb.block.cache-size,默认只有8MB。千万级key进来直接爆掉。

# 正确姿势
state.backend: rocksdb
state.rocksdb.localdir: /data/flink/rocksdb
state.rocksdb.options.cache-block-size: 512MB  # 关键!

运维看到日志直接@我:“你这是要把SSD写穿?”

坑2:Redis缓存雪崩

我们用Redis缓存热门视频的标签结果。结果某天一个大V发视频,瞬间10w+请求打过来,缓存miss,全压到后端模型服务。

当场雪崩。

解决方案很简单:加随机过期时间 + 本地缓存兜底

# Python伪代码
def get_tags(video_id):
    cache_key = f"tags:{video_id}"
    tags = redis.get(cache_key)
    if not tags:
        # 兜底:先查本地LRU(比如cachetools)
        tags = local_cache.get(video_id)
        if not tags:
            tags = model_infer(video_id)
            # 过期时间加随机抖动:300 ± 60秒
            redis.setex(cache_key, 300 + random.randint(0, 60), tags)
        local_cache[video_id] = tags
    return tags

效果对比:数字不会骗人

上线一周后,我们拉了份数据(已脱敏):

指标 旧系统 新系统 提升
单视频打标耗时 1.2s 45ms 26x
千万级全量耗时 ~8小时 22分钟 21x
P99延迟 3.8s 180ms 21x
GPU利用率 15% 78% -

最爽的是,双11当天零故障。产品请我们吃了顿火锅(虽然报销上限200,但心意到了)。


开发心得:技术探索不是闭门造车

回头想想,这次项目能成,靠的不是什么黑科技,而是几点朴素的认知:

  1. 问题驱动,不是技术驱动
    别一上来就“我们要上Service Mesh!”、“必须用Rust重写!”。先搞清楚瓶颈在哪。我们最初以为是算法慢,结果发现是IO和缓存策略烂。

  2. 善用AI,但别当甩手掌柜
    ChatGPT能给你思路,但不能替你调参、看监控、背锅。它是指南针,不是船。

  3. 留退路,保命最重要
    所有新架构都做了双写+开关控制。一旦出事,5分钟切回老系统。这招在快手内部叫“留后门”,是血泪换来的文化。

  4. 和SRE/测试做朋友
    这次能快速定位Flink问题,全靠SRE提前帮我们埋了Prometheus指标。测试同学甚至写了混沌工程脚本,模拟缓存击穿场景——他们才是幕后英雄。


写在最后

有人说,杭州互联网卷成麻花了,阿里网易字节快手都在抢人。我确实也在看机会(别告诉老板),但跳槽不是目的,成长才是

而成长,往往就藏在那些“不可能”的项目里——当你被deadline追着跑,被bug逼到墙角,反而会激发出最强的技术直觉。

所以,别怕接烂活。每个屎山背后,都藏着一座金矿,就看你愿不愿意挖。

对了,上周五晚上我又加班到凌晨两点,修一个诡异的Kafka重复消费Bug。
但搞定那一刻,看着监控曲线平稳如西湖水面,突然觉得——
这班,加得值。


作者:老K,快手6年老架构,现居杭州,主业搭系统,副业研究怎么用AI少写代码。欢迎同行交流,但别找我修祖传Java项目,除非请我喝瑞幸。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝