关于python:用于社交网络的Django

Django for social networking

我知道这是一个相对宽泛的问题,但姜戈是否足够强大,足以建立一个社交网络?我主要关注性能/速度。例如,对于用户基数较小(<10000个用户)的网站,是否可以创建一个类似于Facebook的Django支持的网站?

它的潜在弱点是什么,以及为了尽快实现它而需要关注的事情?


"它的潜在弱点是什么,以及为了尽快实现它而需要关注的事情?"

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

如果您使用的模型涉及通用关系,这一点尤其正确。

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

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

好消息是,django实际上只是用python编写的一系列类和函数。几乎任何用python编写的内容都可以添加到django中,因此您可以始终编写自己的函数或代码来优化给定的请求。

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

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


这个问题是在2011年被问到的,从那时起,姜戈已经走了很长的路。我之前在Django上建立了一个拥有200万用户的社交网络,发现这个过程非常顺利。作为Getstream的一部分,IO的基础设施也在Django上运行,我们对此非常满意。以下是一些让您的Django安装发挥最大作用的提示。这个问题不太清楚,但我假设你从一个完全未经优化的Django安装开始。好的。

静态文件和cdn好的。

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

数据库窗体:选择相关好的。

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

数据库:PGBOUNCER好的。

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

基本监控和调试好的。

接下来,您将需要进行一些基本的监视和调试并运行。Django调试工具栏是您的第一个朋友:https://github.com/jazzband/django-debug-toolbar好的。

之后,你会想看看诸如newrelic、datadog、sentry和statsd/graphite之类的工具,以获得更多的见解。好的。

单独关注好的。

另一个第一步是分离关注点。你需要在自己的服务器上运行你的数据库,在自己的服务器上运行你的搜索服务器,在自己的服务器上运行web等等。如果你在一台机器上运行所有的东西,很难看到是什么导致你的应用程序崩溃。服务器很便宜,可以拆分。好的。

负载平衡器好的。

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

使用正确的工具好的。

如果你在做标签云,标签搜索或搜索使用一个专门的工具,如弹性。好的。

如果您有经常更改的计数器或快速更改的列表,请使用redis而不是数据库来缓存最新版本。好的。

芹菜和拉比多好的。

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

取消所有内容的规范化好的。

你不想计算诸如喜欢和评论之类的阅读次数。每次有人添加新的like或comment时,简单地更新like和comment计数。这使得写操作更重,但读操作更轻。因为你可能会有大量的阅读和写作,这正是你想要的。好的。

新闻源和活动流好的。

如果您正在构建提要,请查看此服务以构建新闻提要和活动流或开放源代码流框架。好的。

在2011年,你必须建立自己的饲料技术,现在不再是这样了。用PHP构建社交网络好的。

既然我们已经介绍了基础知识,那么让我们回顾一些更高级的技巧。好的。

cdn和2阶段加载好的。

您已经在为静态文件使用cloudfront了。作为下一步,您还需要将CloudFront放在Web流量前面。这允许您在cdn上缓存某些页面,并减少服务器上的负载。好的。

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

数据库:PGBadger好的。

pgbadger等工具可以让您深入了解数据库的实际工作。您需要对日志数据的一部分运行每日报告。好的。

数据库:索引好的。

您将要开始读取数据库索引。大多数早期的缩放问题都可以通过应用正确的索引并稍微优化数据库来解决。如果索引正确,你会比大多数人做得更好。还有更多的空间来优化数据库,第二象限的人写的这些书非常棒。https://www.2ndquadrant.com/en/books网站/好的。

数据库:优化好的。

如果您不使用rds,您将希望对数据库运行一个快速的pgtune检查。默认情况下,Postgres的配置相当缓慢,pgtune会告诉您要使用的正确设置:网址:https://github.com/gregs1104/pgtune好的。

缓存所有内容好的。

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

偏移量好的。

Postgres不喜欢大的偏移量。在大结果集中分页时使用ID筛选。好的。

死锁好的。

有了大量的流量,最终会出现死锁。当Postgres上的多个事务试图锁定一条信息,而A等待B,而B等待C,C等待A时,就会发生这种情况。显而易见的解决方案是使用较小的事务。这就减少了死锁发生的机会。接下来,您将需要批量更新最流行的数据。也就是说,当有人喜欢一篇文章时,你不需要更新计数,而是需要存储一个类似于更改的列表,并每隔5分钟左右将其与计数同步。好的。

这些是一些基本的技巧,在处理快速增长的社交网络时很有趣:)好的。好啊。


Pinterest&Instagram使用django,我确信它是可伸缩的,对于大多数加载的部分,如活动提要,您可以在Redis等内存存储中使用。

Django上的高负荷站点

迪斯科http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus

Pinteresthttp://www.slideshare.net/eonarts/mysql-meetup-july2012scalingpinterest

一款图片分享应用http://instagram-engineering.tumblr.com/


离开我的头…

Pinax有一个社交网站的简介。

护航队和国防部科学技术情报研究所在其网站的某些部分使用Django。

关于django的可扩展性-django是否可扩展?

编辑:我在谷歌搜索其他东西时发现了这个。

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

Presented by Luke Sneeringer

Are you starting a moderate to large
sized Django project? Do you need to
plan ahead and build an application
that will react to unanticipated
needs? This talk covers some
techniques and pitfalls I encountered
in writing my first reasonably large
Django site, and what I did
differently the second time I started
a project.


Django当然可以用于构建社交网络,它为缓存等性能增强提供了强大的功能。请看这篇关于缩放的文章。

主要的瓶颈将随着你如何设计你的模型而来。根据我的经验,在运行复杂查询时,创建深度嵌套的外部链接和许多联接(许多关系)会减慢速度。对于这种情况,您应该尝试使用listfields。您还可以研究Google在AppEngine中的大表上使用的键/值对,它的规模大于关系数据库。

您还应该方便地页面项目,您可能希望使用Ajax来保持用户体验,并防止用户为了看到更多文章而加载页面。


这不仅仅是django或python上的问题,而是云和软件工程的问题。一台服务器对于10000个用户来说可能是可以的,因为它们不是并发的,也不是位置,这些用户在同一个城市吗?国家?

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

如果您仍然担心Python是否是答案,那么您可以研究RubyonRails和ASP.NET,甚至Perl、PHP之类的东西。对我来说,python绝对是答案。


这个问题讨论了如何与Django进行缩放。这可能会增强你创建一个潜在大型网站的信心。