关于缓存:如何扩展Django?

What does it take to scale Django?

问题

所以我已经坐了几个月了。我发现自己处于这样的境地:我能够为任何东西编写Django Web应用程序代码,但我害怕自己无法为大量(大量)观众提供有关如何构建Django Web应用程序的解决方案。很高兴至少知道姜戈天平。

我是怎么想的

似乎要理解如何(更不用说实际执行)扩展Django Web应用程序需要一个相对较大的知识飞跃。我之所以这么说是因为我的研究给了我这样的印象:扩展(或启用可扩展性)是一个将售后市场解决方案与Web应用程序的不同组件相匹配的过程,以提高每个组件的性能。

有很多东西~~

所以有大量的解决方案和一堆组件。例如,有用于托管的弹性Beanstalk、Django的缓存框架、用于缓存的Memcached和Varnish、用于数据库的Cassandra、Redis和PostgreSQL,以及用于部署的Uwsgi、Nginx和Apache。不管怎样,如果我认为是对的。我还是不确定。

我需要什么

我渴望得到令人惊叹的回答,这将成为问题的标准答案,但也会感谢有关从何处开始的线索,或解决问题的方法的建议,或是你衡量Django的方法。提前感谢你在那里所做的智慧之言。<全新独家:StackOverflow的问题!我需要什么

为了提高我正在构建的Django Web应用程序的扩展准备度,我应该做/实施的三件最重要/最有效的事情是什么?列出方法,并解释它们是如何帮助我们的。

*我一直在作弊。我部署在pythonanywhere上,到目前为止只使用sqlite3。到目前为止,我还设法清理了wsgi/apache部署工具。

**在Django中,我第一次尝试通过编程创造一些有价值的东西。以前,我只使用Pascal在RunSudio和Java上作弊,制作了一些糟糕的Android应用程序。这也许可以解释为什么我觉得这是一个巨大的飞跃。


一开始我真的不会担心太多。也就是说,这里有一些关于如何考虑扩展你的django应用的想法。

高速缓存

根据您的应用程序是什么,缓存确实非常有用。当然,对于任何读写比例很高的应用程序,例如博客或内容管理系统,实现缓存都是一件很简单的事情。对于其他类型的站点,您可能需要更加小心,但是django缓存框架使得定制应用程序的缓存工作方式变得非常简单。

Memcached很容易与Django缓存一起设置,而且非常可靠。它可能是您作为缓存后端的默认选择。

芹菜

如果您的Web应用程序在后台执行了大量在相同HTTP请求期间不需要执行的任务,那么您应该考虑使用芹菜在单独的任务中执行这些任务。

举个例子:在我构建的Django应用程序上,可以选择向客户发送一封电子邮件,附带一份PDF格式的报告副本。因为电子邮件不需要在同一个HTTP请求中发送,所以我将该任务交给了芹菜。现在,当应用程序接收到HTTP请求时,它只是将请求推送到消息队列中。芹菜的过程接受这个任务并单独处理。

理论上,当你的网络应用足够大时,任务可以在一台完全独立的机器上处理。

网络服务器

人们似乎普遍认为,为Django提供静态内容和动态内容是一个坏主意。我使用的解决方案似乎相当典型,使用两个Web服务器:

  • nginx在端口80上运行。它服务于所有静态文件,并将其他所有内容反向代理到另一个端口。
  • gunicorn在另一个端口上运行,它提供动态内容,并使用supervisor运行gunicorn进程。

这种一般思想有很多变体,但这种双服务器方法似乎很常见。您还可以考虑使用类似于Amazon的S3的东西来承载静态文件。

在花时间缩小静态文件以提高其性能的同时,这也是非常值得的。使用像grunt这样的工具可以很容易地连接和缩小你的javascript和css文件,这样每个文件只需要下载一个,而不需要包含许多需要单独下载的文件。

数据库

MySQL或者PostgreSQL都可以。这两个都是可靠的数据库,在许多网站上用于生产。

正如我之前所说的,扩展你的应用程序在早期不应该太令人担忧。但是,熟悉你需要使用的策略会有所帮助。