代码之家  ›  专栏  ›  技术社区  ›  mikl

如何实现个性化的事件流?

  •  5
  • mikl  · 技术社区  · 15 年前

    我将在一个非政府组织的灵感网站上工作,我希望实现一些类似Facebook的事件流,比如Michael推荐的事件。 苹果馅饼 __,__john评论 巧克力蛋糕 艾尔,艾尔 焦糖软糖 8小时前由Alice__等发布。

    问题是,这些活动是基于兴趣的,所以有人只对焦糖和樱桃感兴趣,不应该看到苹果派或巧克力蛋糕。对于这一点,有很多排列方式,动态生成用户的个性化事件流意味着一些相当昂贵的数据库查询。

    所以我的想法是,在接收用户和发布的事件(可能是一个简单的SQL联接表)之间预先生成一个关系,通过在任何时候操作事件发生时进行某种后台处理。

    衡量数百个用户对某个事件的偏好所需的工作肯定是大量的,因此它不能作为触发该工作的Post请求的一部分来完成,因此我必须在不同的过程中完成大量的工作。我现在在看 Gearman 对于这项任务,我非常愿意接受建议。

    我不想找人帮我工作,但如果有人有建造这类东西的经验,我想听听你的想法。

    5 回复  |  直到 9 年前
        1
  •  2
  •   Ben James    15 年前

    我有在社交网站上构建新闻流的一些经验,是的,当您有多种类型的事件和多个兴趣级别(或隐私设置或用户权限)时,查询会很快变得非常复杂。

    假设事件的查看频率比生成的频率高,那么在事件发生时进行非规范化并计算事件的潜在查看者,而不是每次有人请求新闻流时,都是有意义的。

    我建议运行一个后台进程,将这些事件对象(与其创建者相关)转换为更简单的消息对象(与其读卡器相关,以及在新闻流中看到它们的人相关)。每个事件可能会有许多消息,但这将使对前端的请求更快,并将工作卸载到后台进程。

    我没有使用Gearman,但是如果这是一种允许你在后台进程中加载应用程序环境并通过队列接收要处理的事件的方法,那么这可能是个好主意。

    我的简单解决方案是使用我自己的 beanstalkd 以及我自己的PHP脚本。

        2
  •  1
  •   user187291    15 年前

    不知道你的数据库是如何构造的(你可能想告诉我们更多),但有一些明显的

    SELECT events.* FROM events, event_tags, user_tags
         WHERE event_tags.event_id = events.id 
             AND event_tags.tag_id = user_tags.tag_id
             AND  user_tags.user_id = <$user_id>
    

    我觉得不太重,假设你的指数到处都是

        3
  •  1
  •   troelskn    15 年前

    这听起来像是可以用适当的索引来解决的问题。我将围绕数据库能够处理它的假设构建解决方案,但将服务放在数据库前面,让所有客户机都经历这一点。如果事情发展得太慢,可以在此层中引入各种类型的缓存。和大多数性能决策一样,尝试提前做可能不是一个好主意。

        4
  •  1
  •   Rob West    15 年前

    Facebook开发了他们自己的数据库来做这类事情,并开放源代码,我对它不太了解,但我猜可能是 worth a look .

        5
  •  1
  •   Pierre.Vriens Krzysztof J    9 年前

    你看过吗 Activity 模块?以下是其项目页面的摘录:

    …跟踪人们在您的站点上所做的事情,并在块、专用表和RSS中提供这些活动的迷你提要。该模块是可扩展的,因此任何其他模块都可以与之集成。生成的消息可通过管理界面自定义,并且与上下文相关。

    我会对你的想法感到好奇,因为在不远的将来需要做类似的事情。