2011-04-27 20 views
23

Sé que esta es una pregunta relativamente amplia, pero ¿es Django lo suficientemente robusta para construir una red social? Me preocupa principalmente el rendimiento/velocidad. Por ejemplo, para un sitio con una base de usuarios pequeña (< 10,000 usuarios), ¿es posible crear un sitio respaldado por Django que funcione a una velocidad similar a la de Facebook?Django para las redes sociales

¿Cuáles son sus debilidades potenciales y las cosas que deben enfocarse para hacerlo lo más rápido posible?

+6

Primero pongo manos a la obra. Segundo, perfil para encontrar cuellos de botella. En tercer lugar, concéntrese en los resultados de los perfiles para hacerlo lo más rápido posible. –

Respuesta

25

"¿Cuáles son sus debilidades potenciales y las cosas que deben enfocarse para hacerlo lo más rápido posible?"

Lo único que le puede preocupar más adelante es que, dependiendo de cómo cree sus modelos y los conecte entre sí, puede encontrarse con un problema en el que una sola página genera muchos, muchos, muchos consultas.

Esto es especialmente cierto si utiliza un modelo que implica un generic relation.

Digamos que está utilizando django-activity-stream para crear una lista de eventos recientes (similar a la fuente de noticias de Facebook). django-activity-stream básicamente crea una lista de relaciones genéricas. Para cada una de estas relaciones genéricas, tendrá que ejecutar una consulta para obtener información sobre ese objeto. Y, dado que es genérico (es decir, no está escribiendo una consulta personalizada para cada tipo de objeto), si ese objeto tiene sus propias relaciones que desea generar, es posible que esté buscando entre 40 y 100 consultas para un feed de actividad. con solo 20-30 elementos

Ejecutar 40-100 consultas para una sola solicitud no es un comportamiento óptimo.

La buena noticia es que Django es en realidad un conjunto de clases y funciones escritas en python.Casi todo lo que escribes en python se puede agregar a Django, por lo que siempre puedes escribir tus propias funciones o código para optimizar una solicitud determinada.

La elección de otro marco no va a evitar el problema de escalabilidad; solo presentará diferentes dificultades en diferentes áreas.

Además, puede buscar cosas como caching para acelerar las respuestas y evitar la carga del servidor.

+0

Definitivamente estoy de acuerdo con esta respuesta. Es factible en Django, lo he hecho, por desgracia, el proyecto fue asesinado desde entonces, pero Django no era el problema. Utilizamos un motor de búsqueda por separado para mejorar el rendimiento de las llamadas SQL y usamos mucho almacenamiento en caché. La parte importante es que no todo debe ser en tiempo real. –

0

This question habla sobre escalar con Django. Eso puede aumentar su confianza al tratar de crear un sitio potencialmente grande.

4

de mi cabeza ...

Pinax tiene un perfil en la red social.

Convore y Disqus usan Django para algunas partes de sus sitios web.

Sobre Django escalabilidad - Does Django Scale ?

Editar: encontrado esto mientras yo estaba buscando en Google para otra cosa.

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

Presentado por Lucas Sneeringer

¿Estás comenzando un moderado a grande proyecto de Django tamaño ? ¿Necesita planificar y crear una aplicación que responda a las necesidades no previstas de ? Esta charla cubre algunas técnicas y errores que encontré al escribir mi primer sitio razonablemente grande Django, y lo que hice de manera diferente la segunda vez que comencé un proyecto.

+0

Disqus tiene 500 millones de visitantes únicos/mes según su publicación reciente: http://blog.disqus.com/post/5192492910/the-numbers-of-disqus. También están contratando desarrolladores de django/python: http://disqus.theresumator.com/apply/XFqhWa/Web- Engineer.html – zeekay

2

Django sin duda se puede utilizar para construir una red social, ofrece grandes características para mejoras de rendimiento como caching. Ver esta publicación en scaling.

El principal cuello de botella vendrá con la forma de diseñar sus modelos. En mi experiencia, la creación de enlaces externos anidados profundos y muchas uniones (relaciones muchomomany) se ralentiza cuando se ejecutan consultas complejas. Deberías probar listfields para tales casos. También puede investigar el par de clave/valor que Google usa en su gran tabla en appengine, escala más que las bases de datos de relaciones.

También debe conviently elementos de página, es posible que desee utilizar AJAX para seguir manteniendo la experiencia del usuario y evitar que los usuarios de las páginas de carga sólo para ver más mensajes.

0

Esto no es un problema sólo de Django o Python, es una cosa de ingeniería de nube y software. Un solo servidor puede estar bien para 10,000 usuarios, dado que no son concurrentes, también la ubicación, ¿estos usuarios están en la misma ciudad? ¿país?

Creo que Django es muy bueno y lo utilizaré yo mismo en un proyecto similar, mi problema no es Django, sino IaaS, la infraestructura donde ejecutaré esto.

Si todavía está preocupado si Python es la respuesta, entonces puede investigar acerca de, Ruby on Rails, y asp .Net, incluso perl, php, cosas así. Para mí, Python es definitivamente la respuesta.

11

Esta pregunta se hizo en 2011 y Django ha recorrido un largo camino desde entonces. Anteriormente, construí una red social con 2 millones de usuarios en Django y encontré que el proceso era bastante sencillo. Parte de la infraestructura de getstream.io también se ejecuta en Django y estamos muy contentos con ella. Aquí hay algunos consejos para aprovechar al máximo su instalación de Django. No quedó del todo claro a partir de la pregunta, pero supongo que debes comenzar desde una instalación de Django completamente no optimizada.

archivos estáticos & CDN

Empiece por alojar sus archivos estáticos en S3 y pegar el Cloudfront CDN frente a ella. Hospedar archivos estáticos de tu instancia de Django es una idea terrible, por favor no lo hagas.

& base de datos ORM: Seleccionar relacionado

El segundo error más común no es la optimización de su uso del ORM. Deberá echar un vistazo a la documentación relacionada con la selección relacionada y aplicarla según sea necesario. La mayoría de las páginas de su sitio sólo deben tomar 2-3 consultas y no consultas N como se le suele ver si no se utiliza correctamente seleccione relacionados: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

Base de datos: PGBouncer

Creación de un nuevo la conexión a su base de datos postgres es una operación bastante pesada. Deseará ejecutar PGBouncer en localhost para asegurarse de que no tenga ninguna sobrecarga innecesaria al crear conexiones de bases de datos. Esto era más urgente con versiones anteriores de Django, pero en general sigue siendo una buena idea.

monitoreo básico & Depuración

Seguidamente se le quiere conseguir algo monitoreo básico y depuración en funcionamiento. La barra de herramientas de depuración de Django es su primer amigo: https://github.com/jazzband/django-debug-toolbar

Después de que usted va a querer echar un vistazo a herramientas como NewRelic, Datadog, Sentry y StatsD/grafito para conseguir más puntos de vista.

preocupaciones separados

Otra primer paso es la separación de preocupaciones. Querrá ejecutar su base de datos en su propio servidor, su servidor de búsqueda en su propio servidor, la web en sus propios servidores, etc. Si ejecuta todo en una sola máquina, es difícil ver qué causa la ruptura de la aplicación. Los servidores son baratos, dividen las cosas.

equilibrador de carga

Si usted nunca ha usado un equilibrador de carga antes, comience aquí: https://aws.amazon.com/elasticloadbalancing/

utilizar las herramientas adecuadas

Si usted está haciendo las nubes de etiquetas, búsqueda de etiquetas o búsqueda use una herramienta dedicada como Elastic para esto.

Si usted tiene un contador que se están modificando o una lista que está cambiando rápidamente Redis uso en lugar de su base de datos para almacenar en caché la versión más reciente

apio y RabbitMQ

Utilice una cola de tareas que hacer todo lo que no necesita hacerse ahora en segundo plano. La cola de tareas más utilizado es Apio: http://www.celeryproject.org/

Desnormalizar todo

Usted no desea calcular el recuento como gustos y comentarios en las lecturas. Actualiza simplemente el me gusta y el recuento de comentarios cada vez que alguien agrega un nuevo me gusta o comentario. Esto hace que la operación de escritura sea más pesada, pero la lectura más clara.Dado que es probable que tenga muchas lecturas y muy pocas escrituras, eso es exactamente lo que quiere.

noticias y Flujos de actividad

Si se alimenta la construcción de echar un vistazo a este servicio para building news feeds & activity streams o la open source Stream-Framework

En 2011 había que construir su propia tecnología de alimentos, hoy en día esto es ya no es el caso. Build a social network with PHP

Ahora que hemos pasado por alto lo básico, revisemos algunos consejos más avanzados.

CDN y 2 etapa de carga

Usted ya está usando Cloudfront para sus archivos estáticos. Como paso siguiente, también querrás incluir Cloudfront frente al tráfico web. Esto le permite almacenar en caché ciertas páginas en el CDN y reducir la carga en sus servidores.

Incluso puede almacenar en caché las páginas de los usuarios que inician sesión en el CDN. Simplemente use Javascript para cargar en todas las personalizaciones de página y detalles específicos del usuario una vez que la página se haya servido desde el CDN.

base de datos: PGBadger

Herramientas como PGBadger le dan grandes ideas en lo que su base de datos está haciendo realidad. Deseará ejecutar informes diarios en parte de sus datos de registro.

Base de datos: índices

Usted querrá empezar a leer sobre los índices de bases de datos. La mayoría de los problemas iniciales de escalado se pueden solucionar aplicando el índice correcto y optimizando un poco su base de datos. Si obtiene sus índices correctos, estará mejor que la mayoría de las personas. Hay mucho más espacio para la optimización de la base de datos y estos libros de la gente del segundo cuadrante son impresionantes. https://www.2ndquadrant.com/en/books/

Base de datos: Afinación

Si usted no está utilizando RDS usted querrá realizar una verificación de PGTune rápida en su base de datos. Por la configuración por defecto postgres es bastante lento, PGTune le indica la configuración correcta de usar: https://github.com/gregs1104/pgtune

caché todo

Escalado su base de datos es un dolor. Con el tiempo, tendrás varias bases de datos esclavas, manejo de fragmentación y particiones, etc. Escalar tu base de datos lleva mucho tiempo y la mejor forma de evitar el gasto de mucho tiempo es el almacenamiento en caché. Redis es tu caché en la actualidad, pero memcached también es una opción decente. Básicamente, querrás guardar en caché todo. Una página muestra una lista de publicaciones: Leer de Redis, ¿Buscar perfiles de usuario? Lea de Redis. Que desee utilizar la base de datos lo menos posible y poner la mayor parte de la carga en la capa de caché, ya que es muy fácil de escalar su capa de caché

compensaciones

Postgres no le gustan los grandes desplazamientos. Use el filtro de ID cuando está paginando a través de grandes conjuntos de resultados.

interbloqueos

Con una gran cantidad de tráfico que finalmente va a obtener los puntos muertos. Esto sucede cuando varias transacciones en el postgreso intentan bloquear una parte de la información y A espera por B mientras que B espera por C y C espera por A. La solución obvia es usar transacciones más pequeñas. Eso reduce la posibilidad de que ocurran interbloqueos. A continuación, querrás actualizar por lotes tus datos más populares. ES DECIR. En lugar de actualizar los recuentos cuando a alguien le gusta una publicación, querrá almacenar una lista como cambios y sincronizarla con el recuento cada 5 minutos más o menos.

Esos son algunos de los consejos básicos, diviértete lidiando con las redes sociales en rápido crecimiento :)

Cuestiones relacionadas