【发布时间】:2017-08-22 11:30:55
【问题描述】:
我在社交网站上工作,其中包括媒体内容的创建,还记录用户与创建的内容的交互。
问题背景 - 目前使用的方法
有一个名为 news-feed 的页面,它显示了他们在站点上关注的用户的内容和使用该内容完成的活动。
内容的显示顺序会随着用户交互的增加而变化(例如,如果帖子上的 cmets 数量较多,则可能会显示在 cmets 数量较少的帖子之上。但是,cmet 的数量只是用于对帖子进行排名的属性之一)。
我使用mysql(innodb)数据库来存储数据如下:
- activity_master : 允许作为新闻提要的一部分的活动(发布、评论等)
- activity_set : 用于聚合同一对象上的活动
- activity_feed:实际活动的详细信息
详细的ER图在问题的末尾
场景
- 一个用户(有 1000 个关注者)发布了一些内容,这会启动对过程的异步调用,以便在上述表格中为所有关注者插入相关条目(1000 行,1000 个关注者)。
- 一些追随者在上述调用完成之前开始评论(允许成为新闻提要的一部分的活动),这会启动对同一过程的另一次调用,以插入该活动的条目(x 他们自己的追随者总数)为其特定集合的追随者。 (例如用户 B 对此帖子发表了评论)
- 所有插入请求(似乎太多)都必须由 innodb 引擎在队列中处理
问题
- 有没有更好更有效的方法来做到这一点? (我绝对认为会有一个)
- innodb 在默认配置下可以处理多少个插入请求?
- 在这种情况下如何避免死锁(或数据库端的资源拥塞)
- 或者是否有任何其他类型的数据库最适合这种情况
感谢您通过阅读说明表现出您的兴趣,非常感谢您在这方面的任何帮助,如果需要任何进一步的详细信息,请告诉我,提前致谢!
ER Diagram of tables (not reputed enough to embed the image directly :( )
【问题讨论】:
-
有3种基本方式: 1. 1条帖子为1000个关注者创建1000行。 2. 1 个帖子 = 1 行,但当用户想查看他的时间线时,请加入关注者。 3. 1 和 2 的任意组合。通常(与您的问题一样广泛)有很多关于 twitter 和 facebook 如何做到这一点的文档。所以也许看看那个以获得灵感。他们都发布了特殊的 mysql 版本来满足他们的需求。他们也使用其他数据库系统(所以也许可以尝试一下)。要了解您的系统可以处理多少请求:测量它。对于简单的查询,它可能在 200/s 和 10k/s 之间。
-
@Solarflare 感谢您的回复。我已经阅读了 twitter 和 facebook 正在使用的方法,因此,我决定在写入时使用扇出并为 1000 个用户创建 1000 行。但是,这里提出的问题是不同的,如果在非常短的时间内对存储过程进行这样的调用,则会出现问题。如何处理这种情况是问题
-
如果您决定走那条路,剩下的将取决于您的要求。对您的系统进行基准测试,您将获得可以支持的推文*追随者/秒的估计。如果你例如只期望 1 个帖子/秒,它应该适用于每个系统。你可以通过获得更快的存储和更多的内存来改进它,尽管这种方法是有限的(首先是你的预算,然后是原则设计问题)。在某些时候,您需要找到方法来进行负载平衡/延迟写入和同步/分片/... MySQL,至少单独而言,将通过这种方式达到其极限(您可以通过编写自己的克隆来扩展)。跨度>
标签: mysql performance database-design scalability database-performance