What does it take to scale Django?

Problem

So I've been Django-ing for a number of months*. I find myself in a position where, I'm able to code up a Django web app for whatever, but am terrified by my inability** to come up with solutions as to how to go about building a Django web app for a large (LARGE) audience. Good to know that Django scales, at least.

How I'm thinking about it

It seems like there would need to be a relatively large leap of knowledge to understand how to (let alone actually execute) scale a Django web app. I say this because my research has given me the impression that scaling (or, enabling scalability) is a process of fitting aftermarket solutions to the different components of your web app to enhance the performance of each of these components.

There'sjustsomanythings~~

So there's a ton of solutions, and a bunch of components . For instance, there's Elastic Beanstalk for hosting , Django's cache framework, Memcached and Varnish for caching , Cassandra, Redis and PostgreSQL for databases , and uWSGI, Nginx and Apache for deployment . If what I think is right, anyway. I'm still not sure.

What I Need

I crave that amazing response that becomes the canonical answer to the question, but would also appreciate leads on where to begin, or suggestions of an approach to take to solve the problem, or your approach to scale Django. Thank you in advance for your been-there-done-that words of wisdom. << Edit: SO disapproves :(

BRAND NEW & EXCLUSIVE: A QUESTION FOR STACKOVERFLOW!

What I need

What are the 3 most important/effective things I should do/implement to improve the preparedness for scaling of the Django web apps that I'm building? List the approach, and explaining how they help would be nice.


*I've been cheating. I deploy on Pythonanywhere and have only used Sqlite3 up till now. I have also managed to keep my hands clean of WSGI/Apache deployment stuff to date.

**With Django is when I first managed to create something of value through programming. Before, I had only used Pascal to cheat at Runescape and Java to make some shitty Android apps. Which could perhaps explain why I feel this is that large of a leap.


I really wouldn't worry too much about it initially. That said, here are some ideas for how you might want to think about scaling your Django apps.

Caching

Depending on what your application is, caching can be very useful indeed. Certainly for any application that has a high proportion of reads to writes, such as a blog or content management system, then implementing caching is a no-brainer. For other types of sites, you may have to be a bit more careful, however the Django caching framework makes it straightforward to customise how caching works for your application.

Memcached is easy to set up with the Django caching, and it's solid and reliable. It should probably be your default choice as the caching backend.

Celery

If your web app does any appreciable number of tasks in the background that need not be done during the same HTTP requests, then you should consider using Celery to carry them out in a separate task.

Case in point: on a Django app I built, there was the option to send an email to a client with a PDF copy of a report attached. Because the email need not be sent within the same HTTP request, then I handed that task off to Celery. Now, when the app receives the HTTP request, it just pushes the request to send that email onto the messaging queue. The Celery process picks up this task and handles it separately.

In theory that task could be handled on an entirely separate machine when your web app gets big enough.

Web server

It seems to be generally accepted that serving static content and dynamic content with Django is a bad idea. The solution I use seems to be fairly typical and employs two web servers:

  • Nginx runs on port 80. It serves all the static files and reverse proxies everything else to another port
  • Gunicorn runs on that other port and it serves the dynamic content, and Supervisor is used to run the Gunicorn process
  • There are variants of this general idea, but this kind of two server approach seems to be common. You could also consider using something like Amazon's S3 to host static files.

    It's also well worth your while taking the time to minify your static files to improve their performance. Using a tool like Grunt it's quite easy to concatenate and minify your JavaScript and CSS files so that only one of each need be downloaded, rather than including many files that need to be downloaded individually.

    Database

    Either MySQL or Postgresql will be fine. Both are solid databases that are used in production on many websites.

    As I said higher up, scaling your app shouldn't really be too much of a concern early on. However, it helps to be familiar with the kind of strategies you'll need to use.

    链接地址: http://www.djcxy.com/p/53444.html

    上一篇: 'METHODNAME'作为客户端方法与irc

    下一篇: Django的规模如何?