扩展 Django 需要什么?

gx1*_*x14 -1 django scaling caching scalability web-applications

问题

所以我已经使用 Django 好几个月了*。我发现自己处于这样一个位置,我能够为任何目的编写 Django 网络应用程序,但我害怕我无法**提出如何为大型(大)观众。很高兴知道Django至少可以扩展。

我是怎么想的

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

有很多东西~~

所以有大量的解决方案和一堆组件。例如,有弹性魔豆的主持,Django的缓存框架,Memcached的和光油的缓存,卡桑德拉,Redis的和PostgreSQL的对数据库和uWSGI,Nginx的和Apache的进行部署。如果我认为是对的,无论如何。我还不确定。

我需要的

我渴望那个惊人的回应成为问题的规范答案,但也很感激从哪里开始的线索,或者解决问题的方法的建议,或者你扩展 Django 的方法。提前感谢您的智慧之言。<<编辑:所以不赞成 :(

全新且独家:关于堆栈溢出的问题!

我需要的

我应该做/实施的 3 件最重要/最有效的事情是什么,以提高我正在构建的 Django Web 应用程序的扩展能力?列出方法,并解释它们如何提供帮助会很好。


*我一直在作弊。我部署在 Pythonanywhere 上,到目前为止只使用过 Sqlite3。迄今为止,我还设法使我的手保持清洁 WSGI/Apache 部署的东西。

**使用 Django 是我第一次设法通过编程创造一些有价值的东西。之前,我只使用 Pascal 在 Runescape 和 Java 上作弊来制作一些糟糕的 Android 应用程序。这或许可以解释为什么我觉得这是一个很大的飞跃。

Mat*_*aly 5

一开始我真的不会太担心。也就是说,这里有一些关于如何扩展 Django 应用程序的想法。

缓存

根据您的应用程序是什么,缓存确实非常有用。当然,对于任何读写比例很高的应用程序,例如博客或内容管理系统,实现缓存是轻而易举的事。对于其他类型的站点,您可能需要更加小心,但是 Django 缓存框架可以直接为您的应用程序自定义缓存的工作方式。

Memcached 很容易使用 Django 缓存进行设置,而且它非常可靠。它可能应该是您作为缓存后端的默认选择。

 芹菜

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

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

理论上,当您的 Web 应用程序足够大时,可以在完全独立的机器上处理该任务。

网络服务器

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

  • Nginx 在端口 80 上运行。它提供所有静态文件并将其他所有内容反向代理到另一个端口
  • Gunicorn 在另一个端口上运行并提供动态内容,而 Supervisor 用于运行 Gunicorn 进程

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

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

数据库

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

正如我在上面所说的,在早期,扩展您的应用程序真的不应该太担心。但是,熟悉您需要使用的策略类型会有所帮助。