【问题标题】:Django for social networking [closed]用于社交网络的 Django [关闭]
【发布时间】:2011-08-14 05:02:42
【问题描述】:

我知道这是一个相对广泛的问题,但是 Django 是否足够强大,可以在其上构建社交网络?我主要关心性能/速度。例如,对于一个用户群较小(

它的潜在弱点是什么,以及需要重点关注哪些方面才能使其尽可能快?

【问题讨论】:

  • 首先让事情发挥作用。二是剖析寻找瓶颈。第三,关注分析结果,使其尽可能快。

标签: python django


【解决方案1】:

“它的潜在弱点是什么,以及需要重点关注的事情以使其尽可能快?”

您以后可能会担心的一件事是,根据您创建模型并将它们相互连接的方式,您可能会遇到一个问题,即单个页面会生成许多、许多、许多 查询。

如果您使用的模型涉及generic relation,则尤其如此。

假设您使用django-activity-stream 创建最近事件列表(类似于 Facebook 的新闻提要)。 django-activity-stream 基本上创建了一个通用关系列表。对于这些通用关系中的每一个,您都必须运行查询以获取有关该对象的信息。而且,由于它是通用的(即您没有为每种对象编写自定义查询),如果该对象具有您要输出的自己的关系,您可能正在查看类似 40-100 查询的活动提要只有 20-30 件物品。

为单个请求运行 40-100 个查询并不是最佳行为。

好消息是,Django 实际上只是一堆用 python 编写的类和函数。几乎任何你用 python 编写的东西都可以添加到 Django 中,所以你总是可以编写自己的函数或代码来优化给定的请求。

选择另一个框架并不能避免可伸缩性问题;它只是会在不同的领域提出不同的困难。

此外,您可以查看 caching 之类的内容,以加快响应速度并防止服务器负载。

【讨论】:

  • 我绝对同意这个答案。它在 Django 中是可行的,我已经做到了,遗憾的是该项目从那以后就被终止了,但 Django 不是问题。我们使用单独的搜索引擎来提高 SQL 调用的性能并使用大量缓存。重要的是,并非所有事情都需要实时。
【解决方案2】:

这个问题是在 2011 年提出的,从那时起 Django 已经走了很长一段路。我之前在 Django 上建立了一个拥有 200 万用户的社交网络,发现过程非常顺利。 getstream.io 的部分基础设施也在 Django 上运行,我们对此非常满意。这里有一些技巧可以帮助你充分利用 Django 安装。问题不是很清楚,但我假设您从完全未优化的 Django 安装开始。

静态文件和 CDN

首先将您的静态文件托管在 S3 上,然后将 Cloudfront CDN 放在它前面。从 Django 实例托管静态文件是一个糟糕的主意,请不要这样做。

数据库和 ORM:选择相关

第二个最常见的错误是没有优化您对 ORM 的使用。您需要查看有关选择相关的文档并根据需要应用它。您网站上的大多数页面应该只接受 2-3 个查询而不是 N 个查询,因为如果您没有正确使用 select related,您通常会看到: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

数据库:PGBouncer

创建与您的 postgres 数据库的新连接是一项相当繁重的操作。您需要在 localhost 上运行 PGBouncer 以确保在创建数据库连接时没有任何不必要的开销。这对于旧版本的 Django 来说更为紧迫,但总的来说仍然是一个好主意。

基本监控和调试

接下来,您需要启动和运行一些基本的监控和调试。 django 调试工具栏是你的第一个朋友: https://github.com/jazzband/django-debug-toolbar

之后,您会想看看 NewRelic、Datadog、Sentry 和 StatsD/Graphite 等工具,以获得更多见解。

单独关注

另一个第一步是分离关注点。你会想在自己的服务器上运行你的数据库,在它自己的服务器上运行你的搜索服务器,在他们自己的服务器上运行 web 等等。如果你在一台机器上运行所有东西,很难看出是什么导致你的应用程序崩溃。服务器很便宜,把东西分开。

负载平衡器

如果您以前从未使用过负载平衡器,请从这里开始: https://aws.amazon.com/elasticloadbalancing/

使用正确的工具

如果您正在做标签云、标签搜索或搜索,请使用 Elastic 等专用工具。

如果您有一个频繁更改的计数器或一个快速更改的列表,请使用 Redis 而不是您的数据库来缓存最新版本

Celery 和 RabbitMQ

使用任务队列在后台执行任何不需要立即执行的操作。使用最广泛的任务队列是 Celery: http://www.celeryproject.org/

非规范化一切

您不想在读取时计算喜欢和 cmets 等计数。每次有人添加新的喜欢或评论时,简单地更新喜欢和评论计数。这使得写操作更重,但读更轻。由于您可能会进行大量读取而写入很少,这正是您想要的。

新闻提要和活动流

如果您正在构建提要,请查看building news feeds & activity streamsopen source Stream-Framework 的此服务

在 2011 年,您必须构建自己的 Feed 技术,而现在情况已不再如此。 Build a social network with PHP

现在我们已经了解了基础知识,让我们回顾一些更高级的技巧。

CDN 和 2 阶段加载

您已经将 Cloudfront 用于静态文件。作为下一步,您还需要将 Cloudfront 置于您的网络流量之前。这允许您在 CDN 上缓存某些页面并减少服务器上的负载。

您甚至可以在 CDN 上缓存已登录用户的页面。从 CDN 提供页面后,只需使用 Javascript 加载所有页面自定义和用户特定详细信息。

数据库:PGBadger

诸如 PGBadger 之类的工具可以让您深入了解您的数据库实际在做什么。您需要针对部分日志数据生成每日报告。

数据库:索引

您需要开始阅读数据库索引。大多数早期的扩展问题可以通过应用正确的索引和稍微优化你的数据库来解决。如果你的索引正确,你会比大多数人做得更好。数据库优化还有很多空间,第二象限人的这些书很棒。 https://www.2ndquadrant.com/en/books/

数据库:调优

如果您不使用 RDS,则需要对您的数据库运行快速 PGTune 检查。默认情况下,postgres 的配置非常缓慢,PGTune 会告诉您使用正确的设置: https://github.com/gregs1104/pgtune

缓存所有内容

扩展您的数据库是一件痛苦的事。最终,您将开始拥有多个从属数据库,处理分片和分区等。扩展您的数据库非常耗时,而避免在这方面花费大量时间的最佳方法是缓存。 Redis 现在是你的首选缓存,但 memcached 也是一个不错的选择。基本上你会想要缓存所有的东西。一个页面显示了一个帖子列表:从 Redis 读取,查找用户配置文件?从 Redis 读取。您希望尽可能少地使用数据库并将大部分负载放在缓存层上,因为扩展缓存层非常简单

偏移量

Postgres 不喜欢大的偏移量。在对大型结果集进行分页时使用 ID 过滤。

死锁

在大量流量的情况下,您最终会遇到死锁。当 postgress 上的多个事务尝试锁定一条信息并且 A 等待 B 而 B 等待 C 而 C 等待 A 时,就会发生这种情况。显而易见的解决方案是使用较小的事务。这减少了发生死锁的机会。接下来,您需要批量更新您最常用的数据。 IE。与其在有人喜欢帖子时更新计数,不如存储一个更改列表,并每 5 分钟左右将其同步到计数。

这些是一些基本技巧,玩得开心处理快速发展的社交网络 :)

【讨论】:

  • 好帖子,我有一个后续问题。是否可以通过一个简单的 API 解决很多这些数据库难题?比如postgREST?
【解决方案3】:

Pinterest 和 Instagram 使用 django,我相信它是可扩展的,对于大多数加载的部分,例如活动提要,您可以使用 Redis 等内存存储。

django 上的高负载网站

Disqus http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus

Pinterest http://www.slideshare.net/eonarts/mysql-meetup-july2012scalingpinterest

Instagram http://instagram-engineering.tumblr.com/

【讨论】:

    【解决方案4】:

    我的脑袋...

    Pinax 拥有一个社交网站的个人资料。

    Convore 和 Disqus 在其网站的某些部分使用 Django。

    关于 Django 可扩展性 - Does Django Scale ?

    编辑:在我搜索其他内容时发现了这个。

    PyCon 2011: Django: Pitfalls I Encountered and How to Avoid Them

    卢克·斯内林格介绍

    您是从中等到大型 大小的Django项目?你需要 提前计划并构建应用程序 会对意外做出反应 需要?本次演讲涵盖了一些 我遇到的技巧和陷阱 在写我的第一个相当大的 Django 站点,以及我所做的 我第二次开始时有所不同 一个项目。

    【讨论】:

      【解决方案5】:

      Django 当然可以用来构建社交网络,它提供了强大的性能增强功能,例如caching。请参阅scaling 上的此帖子。

      主要瓶颈在于您如何设计模型。根据我的经验,当您运行复杂的查询时,创建深层嵌套的外部链接和许多连接(多对多关系)会减慢速度。对于这种情况,您应该尝试listfields。您还可以在appengine 中调查 Google 在其大表上使用的键/值对,它的扩展性比关系数据库更大。

      您还应该方便地对项目进行分页,您可能希望使用 ajax 来保持用户体验并防止用户加载页面只是为了查看更多帖子。

      【讨论】:

        【解决方案6】:

        This question 谈论使用 Django 进行扩展。这可能会增强您尝试创建潜在大型网站的信心。

        【讨论】:

          【解决方案7】:

          这不仅仅是 Django 或 python 的问题,它是云和软件工程的问题。仅一台服务器就可以满足 10,000 个用户的需求,因为它们不是并发的,而且是位置,这些用户是否在同一个城市?国家?

          我相信 Django 非常好,我会在一个类似的项目中自己使用它,我的问题不是 Django,而是 IaaS,我将在其中运行它的基础设施。

          如果您仍然担心 Python 是否是答案,那么您可以研究一下 Ruby on Rails 和 asp .Net,甚至 perl、php 之类的东西。对我来说,Python 绝对是答案。

          【讨论】:

            猜你喜欢
            • 2011-05-08
            • 2011-03-23
            • 1970-01-01
            • 1970-01-01
            • 2016-10-06
            • 2013-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多