首页 文章

如何在社交网络中实现活动流

提问于
浏览
124

我正在开发自己的社交网络,我还没有在网上找到用户操作流的实现示例...例如,如何过滤每个用户的操作?如何存储动作事件?我可以将哪种数据模型和对象模型用于操作流和自己的操作?

6 回答

  • 11

    Summary :对于大约100万活跃用户和1.5亿个存储活动,我保持简单:

    • 使用关系数据库存储唯一活动(每个活动1条记录/ "thing that happened")使记录尽可能紧凑 . 结构,以便您可以按活动ID或使用一组具有时间限制的朋友ID快速获取一批活动 .

    • 每当创建活动记录时,将活动ID发布到Redis,将ID添加到"activity stream"列表中,作为应该看到活动的朋友/订阅者的每个用户 .

    查询Redis以获取任何用户的活动流,然后根据需要从db中获取相关数据 . 如果用户需要及时浏览(如果你提供这个),请回到查询数据库的时间


    我使用一个普通的MySQL表来处理大约1500万个活动 .

    它看起来像这样:

    id             
    user_id       (int)
    activity_type (tinyint)
    source_id     (int)  
    parent_id     (int)
    parent_type   (tinyint)
    time          (datetime but a smaller type like int would be better)
    

    activity_type 告诉我活动的类型, source_id 告诉我活动与之相关的记录 . 因此,如果活动类型表示"added favorite",那么我知道source_id指的是收藏记录的ID .

    parent_id / parent_type 对我的应用程序很有用 - 它们告诉我这些活动与之相关 . 如果书籍被收藏,那么parent_id / parent_type会告诉我该活动与具有给定主键(id)的书籍(类型)相关

    我在 (user_id, time) 上编制索引并查询 user_id IN (...friends...) AND time > some-cutoff-point 的活动 . 放弃id并选择不同的聚簇索引可能是一个好主意 - 我没有尝试过 .

    非常基本的东西,但它很有效,很简单,随着需求的变化,它很容易使用 . 此外,如果您不使用MySQL,您可以在索引方面做得更好 .


    为了更快地访问最近的活动,我一直在试验Redis . Redis将其所有数据存储在内存中,因此您无法将所有活动放在那里,但您可以存储足够的大部分网站上常见的屏幕 . 每个用户最近100个或类似的东西 . 使用Redis,它可能会像这样工作:

    • 创建MySQL活动记录

    • 对于创建活动的用户的每个朋友,将ID推送到Redis中的活动列表 .

    • 将每个列表修剪为最后的X项

    Redis速度很快,并提供了一种在一个连接上管理命令的方法 - 因此将活动推送到1000个朋友需要几毫秒 .

    有关我正在谈论的内容的更详细解释,请参阅Redis的Twitter示例:http://redis.io/topics/twitter-clone

    Update February 2011 我've got 50 million active activities at the moment and I haven' t改变了什么 . 做类似的事情的一个好处是它使用紧凑的小行 . 我正在计划进行一些更改,这些更改将涉及更多活动和对这些活动的更多查询,我肯定会使用Redis来保持速度 . 我在其他领域使用Redis,它确实适用于某些类型的问题 .

    Update July 2014 我们're up to about 700K monthly active users. For the last couple years, I'已经使用Redis(如项目符号列表中所述)存储每个用户的最后1000个活动ID . 系统中通常有大约1亿个活动记录,它们仍然存储在MySQL中,并且仍然是相同的布局 . 这些记录让我们可以减少Redis内存,它们可以作为活动数据的记录,如果用户需要及时回页以查找内容,我们会使用它们 .

    这不是一个聪明或特别有趣的解决方案,但它对我很有帮助 .

  • 21

    这是我使用mysql实现的一个活动流 . 有三个类:Activity,ActivityFeed,Subscriber .

    Activity表示一个活动条目,其表格如下所示:

    id
    subject_id
    object_id
    type
    verb
    data
    time
    

    Subject_id 是执行操作的对象的id, object_id 接收操作的对象的id . typeverb 描述了操作本身(例如,如果用户为文章添加注释,它们分别是"comment"和"created"),数据包含其他数据以避免连接(例如,它可以包含主题名称和姓氏) ,文章 Headers 和网址,评论主体等) .

    每个Activity都属于一个或多个ActivityFeeds,它们通过如下所示的表关联:

    feed_name
    activity_id
    

    在我的应用程序中,我为每个用户提供了一个提要,每个项目有一个提要(通常是博客文章),但它们可以是您想要的任何内容 .

    订阅者通常是您站点的用户,但它也可以是对象模型中的任何对象(例如,文章可以订阅其创建者的feed_action) .

    每个订阅者都属于一个或多个ActivityFeeds,并且,如上所述,它们通过这种链接表相关:

    feed_name
    subscriber_id
    reason
    

    这里的 reason 字段解释了订户订阅订阅源的原因 . 例如,如果用户为博客帖子添加书签,原因是'bookmark' . 这有助于我稍后过滤用户通知的操作 .

    要检索订阅者的活动,我会对这三个表进行简单连接 . 加入很快,因为我选择了几个活动,这要归功于现在的 WHERE 条件 - time > some hours . 由于Activity表中的数据字段,我避免了其他连接 .

    有关 reason 字段的进一步说明 . 例如,如果我想要向用户过滤电子邮件通知的操作,并且用户为博客帖子添加了书签(因此他订阅了帖子Feed的原因'bookmark'),我不会't want that the user receives email notifications about actions on that item, while if he comments the post (and so it subscribes to the post feed with reason '评论')我希望他收到通知当其他用户向同一帖子添加评论时 . reason字段帮助我进行这种歧视(我通过ActivityFilter类实现了它)以及用户的通知首选项 .

  • 223

    目前的活动流格式是由一群知名人士开发的 .

    http://activitystrea.ms/ .

    基本上,每个活动都有一个演员(执行活动),一个动词(活动的动作),一个对象(演员在其上执行)和一个目标 .

    例如:Max发布了一条指向Adam墙的链接 .

    他们的JSON规范在撰写本文时已达到1.0版,它显示了您可以应用的活动模式 .

    他们的格式已被BBC,Gnip,Google Buzz Gowalla,IBM,MySpace,Opera,Socialcast,Superfeedr,TypePad,Windows Live,YIID等采用 .

  • 0

    我认为关于通知系统如何在大型网站上运行的解释可以在Jeremy Wall的答案中的堆栈溢出问题how does social networking websites compute friends updates?中找到 . 他建议使用 Message Qeue ,他指出了两个实现它的开源软件:

    另见问题What’s the best manner of implementing a social activity stream?

  • 1

    您绝对需要一个高性能和分布式的消息队列 . 但它不会在那里结束,你必须决定存储什么作为持久数据和什么作为瞬态等 .

    无论如何,如果你追求的是高性能和可扩展的系统,那么我的朋友真的是一项艰巨的任务 . 但是,当然一些慷慨的工程师已经分享了他们的经验 . LinkedIn最近将其消息队列系统Kafka开源 . 在此之前,Facebook已经向开源社区提供了Scribe . Kafka是用Scala编写的,起初它需要一些时间来运行它,但我测试了几个虚拟服务器 . 它真的很快 .

    http://blog.linkedin.com/2011/01/11/open-source-linkedin-kafka/

    http://incubator.apache.org/kafka/index.html

  • 13

    您可以查看通过API使用的第三方服务,而不是自己滚动 . 我创建了一个名为Collabinate(http://www.collabinate.com)的应用程序,它具有图形数据库后端和一些相当复杂的算法,可以高度并发,高性能的方式处理大量数据 . 虽然它不具备Facebook或Twitter所具有的广泛功能,但它足以满足您需要在应用程序中构建活动流,社交订阅源或微博功能的大多数用例 .

相关问题