Sla*_*ish 5 mysql database-design feeds scalability social-networking
情况:
我目前正在为社交网站设计一个供稿系统,每个用户都有一个朋友活动的供稿.我有两种可能的方法来生成Feed,我想问一下哪种方法最适合扩展.
所有用户的事件都收集在一个中央数据库表中event_log.用户在表格中与朋友配对friends.我们使用的RDBMS是MySQL.
标准方法:
当用户请求它们的饲料页,系统产生由内加入进料event_log用friends.然后缓存结果并在5分钟后设置为超时.通过改变此超时来实现缩放.
假设方法:
任务在后台运行,对于每个新的未处理项目event_log,它在数据库表中创建条目,将该user_feed事件与发起事件的用户的所有用户配对.一个表行将一个事件与一个用户配对.
标准方法的问题是众所周知的 - 如果很多人的缓存同时到期会怎么样?该解决方案也无法很好地扩展 - 简要介绍了尽可能接近实时更新的订阅源
我眼中的假设解决方案似乎好多了; 所有处理都是脱机完成的,因此没有用户等待生成页面,也没有连接,因此数据库表可以跨物理机进行分片.但是,如果用户有100,000个朋友并在一个会话中创建20个事件,则会导致将2,000,000行插入数据库.
题:
问题归结为两点:
我认为你假设的系统生成了太多数据;首先,在全球范围内,随着用户群变得越来越大、相互联系越来越紧密,对 user_feed 的存储和索引需求似乎呈指数级增长(这对于社交网络来说可能是理想的);其次,考虑一下如果在一分钟内 1000 个用户每个人都输入了一条新消息,并且每个用户都有 100 个朋友 - 那么您的后台线程有 100 000 个插入要做,并且可能很快就会落后。
我想知道您提出的两个解决方案之间是否可以做出妥协,其中后台线程更新表last_user_feed_update,该表包含每个用户的单行以及上次更改用户提要的时间戳。
然后,虽然需要完全连接和查询来刷新 feed,但对 last_user_feed 表的快速查询将告诉您是否需要刷新。这似乎减轻了标准方法的最大问题,并避免了存储大小的困难,但后台线程仍然有很多工作要做。