
文章插图
大规模推送虽然我们已经将推送 Feed 的任务转移给了 MQ Worker 来处理,但面对将 Feed 推送给上百万粉丝这样庞大的任务, 单机的 Worker 还是很难处理 。而且一旦处理中途崩溃就需要全部重新开始 。
我们可以将大型推送任务拆分成多个子任务,通过消息队列发送到多台 MQ Worker 上进行处理 。

文章插图
因为负责拆分任务的 Dispatcher 只需要扫描粉丝列表负担和故障概率大大减轻 。若某个推送子任务失败 MQ 会自动进行重试,也无需我们担心 。
总结至此,我们完成了一个关注 Feed 流系统的设计 。总结一下本文我们都讨论了哪些内容:
- 基本模型有两种 。推模型:发布新 Feed 时推送到每个粉丝的 Timeline; 拉模型:打开 Timeline 时拉取所有关注的人发布的 Feed,重新聚合成粉丝的 Timeline 。推模型读取快,但是推送慢,粉丝数多的时候峰值负载很重 。拉模型没有峰值问题,但是读取很慢用户打开 Timeline 时要等待很久,读极多写极少的环境中消耗的计算资源更多 。
- 头部用户的几十上百万粉丝中活跃用户比例很少,所以我们可以只将他们的新 Feed 推送给活跃用户,不活跃用户等回归时再使用拉模型重建 Timeline.即通过「在线推、离线拉」的模式解决推模型的峰值问题 。
- 虽然关注 Timeline 数据很多但实际上是一种缓存,没必要全部存储 。我们按照缓存的思路只存储活跃用户、最近一段时间的数据即可,没有缓存的数据在用户阅读时再通过拉模型重建 。
- Timeline 推荐使用 Redis 的 SortedSet 结构存储,Member 为 FeedID,Score 为时间戳 。给缓存设置自动过期时间,不活跃用户的缓存会自动被清除 。使用「在线推,离线拉」时只给 Timeline 缓存未失效的用户推送即可
- 在 Redis 内存不足时可以使用 Cassandra 作为 Redis 的二级缓存 。
经验总结扩展阅读
- 2023年1月27日训狗黄道吉日 2023年1月27日训狗好吗
- 2023年农历正月初六训马吉日 2023年1月27日训马黄道吉日
- 2023年1月27日剪指甲好吗 2023年1月27日剪指甲好不好
- 2023年1月27日剃头行吗 2023年农历正月初六剃头吉日
- 2023年1月27日遇见贵人好吗 2023年1月27日是遇见贵人的黄道吉日吗
- 2023年1月27日适合堵蚁穴吗 2023年农历正月初六宜堵蚁穴吗
- 2023年1月27日是清扫房屋吉日吗 2023年1月27日清扫房屋好吗
- 2023年1月27日上学吉日一览表 2023年1月27日上学好不好
- 2023年农历正月初六宜开学吗 2023年1月27日开学吉日一览表
- 2023年农历正月初六开学典礼吉日 2023年1月27日开学典礼吉日一览表