2011-04-27 50 views
23

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

它有什么潜在的弱点,以及为了尽可能快地把重点放在哪些方面?

+6

首先得到的东西工作。其次,简介找到瓶颈。第三个重点是分析结果,以尽可能快地完成。 – 2011-04-28 01:21:01

回答

25

“它有什么潜在的弱点,还有一些需要关注的事情,以便尽可能快地实现它?”

的一件事,你可能会担心之路越走越是,这取决于你如何建立你的模型,并将它们连接到彼此,你可能会遇到在一个单一的页面产生很多很多的问题,许多查询。

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

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

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

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

选择另一个框架不会避免可伸缩性问题;这只会在不同的领域呈现出不同的困难。

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

+0

我绝对同意这个答案。在Django中是可行的,我已经做到了,不幸的是这个项目自那时起就被杀死了,但是Django不是问题所在。 我们使用了一个单独的搜索引擎来提高SQL调用的性能,并使用了大量的缓存。重要的是,并非所有事情都需要实时。 – 2011-05-04 11:51:41

0

This question谈论与Django缩放。这可能会提高你试图创建一个潜在的大型网站的信心。

4

把我的头......

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

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

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

编辑:发现这个,而我是谷歌搜索别的东西。

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

由卢克Sneeringer

提交你开始一个中等大 尺寸Django项目?您是否需要提前计划 并构建应用程序 ,这将对未预料的 需求做出反应?这次谈话涵盖了一些 技术和我遇到的问题 在写我的第一个合理的大型 Django网站,我做了 第二次我开始 一个项目。

+0

根据他们最近的帖子,Disqus拥有5亿独立访问者:http://blog.disqus.com/post/5192492910/the-numbers-of-disqus。他们也正在招聘django/python开发者:http://disqus.theresumator.com/apply/XFqhWa/Web-Engineer.html – zeekay 2011-05-04 18:36:10

2

Django当然可以用来构建一个社交网络,它提供了很好的性能增强功能,如caching。看到这篇文章在scaling

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

你也应该很方便的页面项目,你可能想要使用ajax仍然保持用户体验,并阻止用户加载页面只是为了看到更多的帖子。

0

这不仅是对Django的或Python的问题,它是一个事云和软件工程。对于10,000个用户,单独一台服务器可能会好,因为它们不是并发的,还有位置,这些用户是否在同一个城市?国家?

我相信Django非常好,我会在类似的项目中使用它,我的问题不是Django,而是IaaS,我将运行这个基础架构。

如果你仍然担心如果Python是答案,那么你可以研究Ruby on Rails和asp.net,甚至perl,php等等。对我来说,Python绝对是答案。

11

这个问题在2011年被问到,从那以后Django已经走过了很长的一段路。我以前在Django上建立了一个拥有200万用户的社交网络,并发现这个过程非常流畅。部分getstream.io的基础设施也在Django上运行,我们对此非常满意。以下是从Django安装中获得最大收益的一些提示。这个问题不太清楚,但我会假设你从一个完全未经优化的Django安装开始。

静态文件& CDN

开始通过托管在S3的静态文件,并在它的前面粘的Cloudfront CDN。从您的Django实例托管静态文件是一个可怕的想法,请不要这样做。

数据库& ORM:选择与

2最常见的错误是没有优化的ORM的使用。您需要查看关于选择相关的文档并根据需要应用它。在网站上的网页应该只需要2-3查询,而不是N次查询,你通常会看到,如果你不使用正确的选择有关: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

数据库:PGBouncer

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

基本监视&调试

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

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

分离关注

另一个第一步骤是分离出的担忧。你需要在自己的服务器上运行你的数据库,在自己的服务器上运行你的搜索服务器,在他们自己的服务器上运行web。如果你在一台机器上运行所有的东西,很难看到是什么导致你的应用程序崩溃。服务器很便宜,分开了一些东西。

负载平衡器

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

使用正确的工具

如果你正在做标签云,标签搜索或搜索使用专用工具,例如Elastic。

如果你有一个计数器,频繁改变或正在迅速发生变化,而不是你的数据库使用Redis的缓存最新版本

芹菜列表和RabbitMQ的

使用任务队列做任何不需要在后台完成的事情。最广泛使用的任务队列是芹菜: http://www.celeryproject.org/

进行非标准化的一切

你不想计算计数,如喜欢和评论读取。每次有人添加一个新的喜欢或评论时,简单地更新喜欢的评论和评论。这使得写入操作更重,但读取更轻。由于你可能有很多读取和很少的写入,这正是你想要的。

新闻提要和活动流

如果你正在构建饲料看看这项服务building news feeds & activity streamsopen source Stream-Framework

2011年,你必须建立自己的饲料技术,如今这是不再是这种情况。 Build a social network with PHP

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

CDN和2台装载

您已经使用的Cloudfront您的静态文件。作为下一步,您还需要将Cloudfront保持在您的网络流量前。这使您可以缓存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过滤。

死锁

随着大量的流量你最终会得到死锁。当postgress上的多个事务尝试锁定一条信息并且A等待B而B等待C和C等待A时,会发生这种情况。显而易见的解决方案是使用较小的事务。这减少了发生死锁的机会。接下来,您需要批量更新最流行的数据。 IE浏览器。每当有人喜欢某篇文章时,不要更新计数,而要每隔5分钟左右存储一份变化列表并将其同步到计数中。

这些是一些基本的技巧,有兴趣处理快速增长的社交网络:)