5

我将在一个非政府组织的灵感网站上工作,我希望实现某种 Facebook 式的事件流,例如“迈克尔推荐苹果派”、“约翰评论巧克力蛋糕”、“< em>Caramel fudge 是 Alice 8 小时前发布的”等。

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

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

权衡数百个用户的偏好与一个事件所需的工作必然是大量的,因此它不能作为触发工作的 POST 请求的一部分来完成,所以我必须在一个不同的过程。我目前正在为这项任务寻找Gearman,但我非常愿意接受建议。

我不是在找人为我做我的工作,但如果有人以前有过建造这类东西的经验,我很想听听你的想法。

4

5 回答 5

2

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

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

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

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

我的简单解决方案是使用beanstalkd和我自己的 PHP 脚本自行开发。

于 2009-12-06T15:04:16.683 回答
1

不知道您的数据库的结构(您可能想告诉我们更多信息),但是很明显,例如

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>

对我来说似乎不是很重,假设你到处都有索引

于 2009-12-06T15:04:19.150 回答
1

这听起来像是可以通过适当的索引来解决的问题。我将围绕数据库能够处理它的假设构建解决方案,但在数据库前面放置一个服务并让所有客户端都通过这一点。如果事情开始变得太慢,您可以在这一层引入各种类型的缓存。与大多数性能决策一样,尝试提前进行可能不是一个好主意。

于 2009-12-06T15:06:04.683 回答
1

Facebook 开发了自己的数据库来做这类事情并开源,我对此了解不多,但我猜它可能值得一看

于 2009-12-06T15:08:06.207 回答
1

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

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

我会很好奇你想出什么,因为在不久的将来需要做这样的事情。

于 2009-12-07T16:32:10.057 回答