4

需要一种方法来提高我网站的基于 SQL 的 Activity Feed 的性能。我们在 Heroku 上使用 Django。

现在我们正在使用 actstream,它是一个 Django 应用程序,它使用 Django ORM 中的通用外键实现活动提要。基本上,每个动作对于它的actor和它可能作用的任何对象都有通用的外键,像这样:

动作:(粘土-演员)在(安德鲁对星巴克的评论-目标)上写了一个(评论-动作对象

随着我们的扩展,它变得太慢了,这是可以理解的,因为它依赖于大而昂贵的 SQL 连接。

我看到至少两个选项:

  1. 在 SQL 数据库之上放置一个 Redis 层并从那里获取活动源。
  2. 尝试绕过 Django ORM 并在原始 SQL 中执行所有查询,我知道这可以提高性能。

任何人对这两个或其他想法有任何想法,我很想听听。

4

3 回答 3

1

您可能想查看物化视图。由于您在 Heroku 上,并且通常使用 PostgreSQL,因此您可以查看Materialized View Support for PostgreSQL。它不像其他数据库服务器那样成熟,但据我了解,它可以工作。要使用 Django ORM,您可能必须为提要创建一个新的“实体”(此处不熟悉 Django,因此请根据需要进行修改),然后对它进行查询,就好像它是一个表一样。视图的手动管理是一个考虑因素,因此在您提交之前仔细研究它。

希望这可以帮助!

于 2012-12-28T17:19:23.823 回答
1

你说redis?使用 redis 一切都会变得更好。

缓存是软件开发中最好的想法之一,如果您使用物化视图,您也应该考虑尝试缓存它们,相信我您的用户会注意到其中的差异。

于 2012-12-28T18:40:32.543 回答
1

采用一种结合了这两个建议的方法。

我们为数据库中的每个操作创建了一个主列表,其中包括我们需要的有关操作的所有信息,并将其保存在 Redis 中。给定一个动作 ID,我们现在可以对它进行 Redis 查找并获取一个准备好返回到前端的字典对象。

我们还创建了对应于用户可用的所有不同类型的活动流的操作 ID 列表。所以给定一个用户 id,我们有他朋友的活动,他自己的活动,最喜欢的地方活动等,可供查找。(我猜这些在某种程度上对应于物化视图,尽管它们在 Redis 中,而不是在 PSQL 中。)

因此,我们将用户的提要作为操作 ID 列表。然后我们通过查找主操作列表中的 id 来获取这些操作的详细信息。然后我们将提要返回到前端。

谢谢你们的建议,伙计们。

于 2013-01-07T18:16:22.960 回答