我知道这是一个相对广泛的问题,但Django是否足够健壮以构建社交网络?我主要关心的是性能/速度.例如,对于用户群较小(<10,000个用户)的站点,是否可以创建一个Django支持的站点,其速度与Facebook类似?
它有哪些潜在的弱点,以及需要关注的事情,以尽可能快地实现它?
"它有哪些潜在的弱点,以及需要关注的事情,以尽可能快地实现它?"
您可能会担心的另一件事是,根据您创建模型的方式并将它们彼此连接,您可能会遇到单个页面生成许多很多查询的问题.
如果您使用的是涉及通用关系的模型,则尤其如此.
假设您正在使用django-activity-stream创建最近事件列表(类似于Facebook的新闻Feed).django-activity-stream基本上创建了一个通用关系列表.对于这些通用关系中的每一个,您将不得不运行查询以获取有关该对象的信息.并且,因为它是通用的(即,您不是为每种对象编写自定义查询),如果该对象具有您想要输出的自己的关系,您可能会查看类似于活动提要的40-100个查询只有20-30项.
对单个请求运行40-100个查询不是最佳行为.
好消息是Django实际上只是一堆用python编写的类和函数.您在python中编写的几乎任何内容都可以添加到Django中,因此您始终可以编写自己的函数或代码来优化给定的请求.
选择另一个框架不会避免可扩展性问题; 它只会在不同领域呈现出不同的困难.
此外,您可以查看缓存等内容,以加快响应速度并防止服务器负载.
这个问题在2011年被问到,Django从那时起已经走了很长一段路.我以前在Django上建立了一个拥有200万用户的社交网络,并发现这个过程非常流畅.getstream.io的部分基础设施也在Django上运行,我们对此非常满意.以下是一些有关如何充分利用Django安装的技巧.从问题中不太清楚,但我会假设你从一个完全没有优化的Django安装开始.
静态文件和CDN
首先在S3上托管您的静态文件,然后将Cloudfront CDN粘贴在它前面.从Django实例托管静态文件是一个糟糕的主意,请不要这样做.
数据库和ORM:选择相关
第二个最常见的错误是没有优化ORM的使用.您需要查看有关选择相关的文档并根据需要应用它.您网站上的大多数页面应该只需要2-3个查询而不是N个查询,因为您通常会看到如果您没有正确使用选择相关:https: //docs.djangoproject.com/en/1.11/ref/models/查询集/
数据库: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而不是数据库来缓存最新版本
芹菜和RabbitMQ
使用任务队列可以在后台执行任何不需要立即执行的操作.最广泛使用的任务队列是Celery:http: //www.celeryproject.org/
使一切都变形
您不希望计算诸如喜欢和读取注释之类的计数.每当有人添加新的喜欢或评论时,简单更新类似和评论计数.这使得写入操作更重,但读取更轻.因为你可能会有大量的读取和很少的写入,这正是你想要的.
新闻提要和活动流
如果您正在构建订阅源,请查看此服务以构建新闻订阅源和活动流或开源Stream-Framework
在2011年,你必须建立自己的饲料技术,现在已不再是这种情况.使用PHP构建社交网络
现在我们已经了解了基础知识,让我们回顾一些更高级的技巧.
CDN和2阶段加载
您已经在使用Cloudfront作为静态文件.下一步,您也希望将Cloudfront放在Web流量之前.这允许您缓存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分钟左右同步一次.
这些是一些基本技巧,有趣处理快速增长的社交网络:)
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/
我的脑袋......
Pinax有一个社交网站的个人资料.
Convore和Disqus将Django用于其网站的某些部分.
关于Django可扩展性 - Django规模吗?
编辑:在谷歌上搜索其他内容时找到了这个.
PyCon 2011:Django:我遇到的陷阱以及如何避免陷阱
由Luke Sneeringer主讲
你正在开始一个中等到大型的Django项目吗?您是否需要提前计划并构建一个能够应对意外需求的应用程序?这个讲座涵盖了我在编写我的第一个相当大的Django站点时遇到的一些技术和陷阱,以及我第二次启动项目时所做的不同.