[Instagram] Async job Fanout 的问题

课上老师说如果celebrity 的 followers 很多, push model 中的 async job fanout 会拖垮系统。 可否在这个job之后加个distributed service 来去写每一个follower 的 信息到feed table 中:


因为是distributed service 所以很多workers 可以并行update 不同 follower 的 feed message, 这样是不是就可以解决海量fanout的问题了?

另外一种类似做法是不添加这个distributed writers, async job 在写每个follwer 的数据时fire and forget, NoSQL 数据库一般应该都可以分布式处理每条要添加的数据,所以应该也会scale.

这里的 async job 跟你说的 distributed worker 起到的作用是一样的,就是并行 update 不同 follower 的 feed message。当有大型 fanout 发生的时候,我们需要写的数据库的行数是固定过的,follow 越多,写得就越多,我们并不想在短时间内做这么多写 (Bursty Traffic),因为 NoSQL database 每秒写 QPS 是有上限的。因此 Hybrid approach 在这里更合适。

课上说这个feed table是按照user_id来partition的, 而里边的user_id实际上就是follower_id, 所以如果fanout 的 follower 很多, 分摊到casandra每台机器上的应该比较少吧? 而且如果每台机器无法处理traffic 还可以增加机器数,极端情况下对于1M 的 follower, 如果casandra机群也有1M 那么每台的写qps 就差不多是 1/s?

我又想了下,这样处理的问题是不是比较浪费,因为用户上传照片并不频繁,加了那么多机器多数时间会闲置?

你理解是对的。增加机器数量肯定能解决问题,只是不经济,特别是买了很多机器只是为了应对 Peak traffic。