Подтвердить что ты не робот

Django для социальных сетей

Я знаю, что это относительно широкий вопрос, но является ли Django достаточно надежным для создания социальной сети? Меня интересует в основном производительность/скорость. Например, для сайта с небольшой пользовательской базой (< 10 000 пользователей) можно создать сайт с поддержкой Django, который будет работать со скоростью, аналогичной Facebook?

Каковы его потенциальные недостатки и что нужно сосредоточить, чтобы сделать это как можно быстрее?

4b9b3361

Ответ 1

"Каковы его потенциальные недостатки и какие вещи нужно сосредоточить, чтобы сделать это как можно быстрее?"

Одна вещь, о которой вы, возможно, беспокоитесь о будущем, заключается в том, что в зависимости от того, как вы создаете свои модели и соединяете их друг с другом, вы можете столкнуться с проблемой, когда одна страница генерирует множество, много и много запросов.

Это особенно актуально, если вы используете модель, которая включает общее отношение.

Скажем, вы используете django-activity-stream, чтобы создать список последних событий (аналогично новостной ленте новостей Facebook). django-activity-stream в основном создает список общих отношений. Для каждого из этих общих отношений вам нужно будет запустить запрос, чтобы получить информацию об этом объекте. И, поскольку он является общим (т.е. Вы не пишете пользовательский запрос для каждого типа объекта), если у этого объекта есть свои отношения, которые вы хотите вывести, вы можете посмотреть что-то вроде 40-100 запросов для фида активности всего за 20-30 единиц.

Запуск 40-100 запросов для одного запроса не является оптимальным поведением.

Хорошей новостью является то, что Django на самом деле просто куча классов и функций, написанных на python. Почти все, что вы пишете на python, можно добавить в Django, поэтому вы можете всегда писать свои собственные функции или код для оптимизации заданного запроса.

Выбор другой структуры не позволит избежать проблемы масштабируемости; он просто собирается представить различные трудности в разных областях.

Кроме того, вы можете изучить кеширование , чтобы ускорить ответы и предотвратить загрузку сервера.

Ответ 2

Этот вопрос задавали в 2011 году, и с тех пор Django прошел долгий путь. Я ранее строил социальную сеть с 2 миллионами пользователей на Django и нашел, что процесс был довольно плавным. Часть инфраструктуры getstream.io также работает на Django, и мы очень довольны этим. Вот несколько советов, как получить максимальную отдачу от установки Django. Это было не совсем ясно из вопроса, но я начну с совершенно неоптимизированной установки Django.

Статические файлы и CDN

Начните с размещения своих статических файлов на S3 и придерживайтесь CloudNown CDN перед ним. Хостинг статических файлов из вашего экземпляра Django - ужасная идея, пожалуйста, не делайте этого.

База данных и ORM: выберите соответствующий

Вторая наиболее распространенная ошибка - это не оптимизация использования ORM. Вы захотите ознакомиться с документацией относительно выбора и применить ее по мере необходимости. Большинство страниц на вашем сайте должны принимать только 2-3 запроса, а не N запросов, как вы обычно видите, если вы не используете правильно выбранный выбор: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

База данных: PGBouncer

Создание нового подключения к вашей базе данных postgres - довольно тяжелая операция. Вы хотите запустить PGBouncer на localhost, чтобы убедиться, что у вас нет ненужных накладных расходов при создании соединений с базой данных. Это было более актуально с более ранними версиями Django, но в целом все еще хорошая идея.

Основной мониторинг и отладка

Затем вы захотите получить базовый мониторинг и отладки. Панель инструментов отладки django - ваш первый друг: https://github.com/jazzband/django-debug-toolbar

После этого вы захотите взглянуть на такие инструменты, как NewRelic, Datadog, Sentry и StatsD/Graphite, чтобы получить больше информации.

Отдельные проблемы

Еще один первый шаг - отделить проблемы. Вы захотите запустить свою базу данных на своем собственном сервере, на своем сервере поиска на своем собственном сервере, в Интернете на своих серверах и т.д. Если вы запустите все на одной машине, трудно понять, что заставляет ваше приложение ломаться. Серверы дешевы, разбить вещи.

Балансировщик нагрузки

Если вы никогда раньше не использовали балансировку нагрузки, начинайте здесь: https://aws.amazon.com/elasticloadbalancing/

Использовать нужные инструменты

Если вы используете облака тегов, поиск или поиск тегов используют выделенный инструмент, такой как Elastic для этого.

Если у вас есть счетчик, который часто меняется или быстро меняющийся список, используйте Redis вместо вашей базы данных для кэширования последней версии

Сельдерей и КроликMQ

Используйте очередь задач, чтобы делать все, что не нужно делать прямо сейчас в фоновом режиме. Наиболее широко используемая очередь задач - Celery: http://www.celeryproject.org/

Денормализовать все

Вы не хотите вычислять такие количества, как комментарии и комментарии к чтению. Простое обновление и комментарий подсчитываются каждый раз, когда кто-то добавляет новые комментарии или комментарии. Это делает операцию записи более тяжелой, но читатель легче. Поскольку у вас, вероятно, будет много чтений и очень мало записей, что именно вы хотите.

Каналы новостей и потоки активности

Если вы создаете каналы, посмотрите эту службу для создания новостных лент и потоков активности или с открытым исходным кодом Stream-Framework

В 2011 году вам нужно было создать собственную технологию подачи, в настоящее время это уже не так. Создайте социальную сеть с помощью PHP

Теперь, когда мы рассмотрели основы, рассмотрим несколько дополнительных советов.

CDN и двухступенчатая загрузка

Вы уже используете Cloudfront для своих статических файлов. В качестве следующего шага вам также понадобится использовать Cloudfront перед вашим веб-трафиком. Это позволяет кэшировать определенные страницы на CDN и уменьшать нагрузку на ваши серверы.

Вы даже можете кэшировать страницы для зарегистрированных пользователей на CDN. Просто используйте Javascript для загрузки во всех настройках страницы и конкретных данных пользователя после того, как страница будет отправлена ​​из CDN.

База данных: PGBadger

Инструменты, такие как PGBadger, дают вам представление о том, что делает ваша база данных. Вы хотите запускать ежедневные отчеты по части ваших данных журнала.

База данных: индексы

Вы хотите начать чтение индексов базы данных. Большинство ранних проблем масштабирования можно устранить, применив правильный индекс и немного оптимизировав базу данных. Если вы правильно указали свои индексы, вы будете лучше, чем большинство людей. Существует гораздо больше возможностей для оптимизации базы данных, и эти книги для 2-го квадранта являются удивительными. https://www.2ndquadrant.com/en/books/

База данных: настройка

Если вы не используете RDS, вы хотите запустить быструю проверку PGTune в своей базе данных. По умолчанию конфигурация postgres довольно вялая, PGTune сообщает вам правильные настройки: https://github.com/gregs1104/pgtune

Сбросить все

Масштабирование базы данных - это боль. В конце концов вы столкнетесь с наличием нескольких подчиненных баз данных, обработкой осколков и разбиения на разделы и т.д. Масштабирование вашей базы данных требует много времени, и ваш лучший способ избежать траты времени на это - кеширование. Redis - это ваш кэш в настоящее время, но memcached также является достойным вариантом. В принципе, вы захотите все кешировать. На странице показан список сообщений: Чтение из Redis, поиск профилей пользователей? Читайте у Редиса. Вы хотите как можно меньше использовать свою базу данных и накладывать большую часть нагрузки на свой уровень кэша, поскольку чрезвычайно просто масштабировать свой уровень кэша.

Смещения

Postgres не любит большие смещения. Используйте фильтрацию идентификаторов, когда вы разбиваете страницы на большие результирующие наборы.

Тупики

С большим количеством трафика вы в конечном итоге получите взаимоблокировки. Это происходит, когда несколько транзакций в postgress пытаются заблокировать часть информации, а A ждет B, а B ожидает, что C и C ожидают A. Очевидным решением является использование небольших транзакций. Это уменьшает вероятность возникновения взаимоблокировок. Затем вы захотите выпустить обновления для самых популярных данных. IE. Вместо того, чтобы обновлять подсчеты, когда кому-то нравится сообщение, вам нужно сохранить список, например, изменения и синхронизацию с подсчетом каждые 5 минут или около того.

Вот некоторые из основных советов, получайте удовольствие от быстро растущих социальных сетей:)

Ответ 3

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/

Ответ 4

С моей головой...

Pinax имеет профиль для сайта социальной сети.

Convore и Disqus использует Django для некоторых частей своих сайтов.

О масштабируемости Django - Является ли шкала Django?

Изменить: Нашел это, пока я искал что-то еще.

PyCon 2011: Django: Ловушки, с которыми я столкнулся и как их избежать

Представлено Люком Снерингером

Вы начинаете от умеренного до большого размер проекта Django? Нужно ли вам планировать вперед и создавать приложение что будет реагировать на непредвиденные потребности? Этот разговор охватывает некоторые методы и подводные камни, с которыми я столкнулся в письменной форме мой первый достаточно большой Сайт Django, и что я сделал по-разному, второй раз, когда я начал проект.

Ответ 5

Django, безусловно, может быть использован для создания социальной сети. Он предлагает отличные возможности для повышения производительности, такие как кеширование. См. Это сообщение в масштабировании.

Основным узким местом будет то, как вы разрабатываете свои модели. По моему опыту, создание глубоких вложенных внешних ссылок и многих подключений (многие отношения со многими) замедляется, когда вы выполняете сложные запросы. Вы должны попробовать listfields для таких случаев. Вы также можете исследовать пару ключ/значение, которую Google использует на своей большой таблице в appengine, она масштабирует больше, чем базы данных отношений.

Вы также должны использовать элементы страницы, вы можете использовать ajax, чтобы поддерживать пользовательский интерфейс и не позволять пользователям загружать страницы, чтобы увидеть больше сообщений.

Ответ 6

Этот вопрос говорит о масштабировании с Django. Это может повысить вашу уверенность в попытке создать потенциально большой сайт.

Ответ 7

Это не проблема только для Django или python, это облако и разработка программного обеспечения. Один сервер может быть в порядке для 10 000 пользователей, учитывая, что они не параллельны, а также местоположение, являются ли эти пользователи в одном городе? страна?

Я считаю, что Django очень хорош, и я буду использовать его сам в подобном проекте, моя проблема - не Django, а IaaS, инфраструктура, в которой я буду запускать это.

Если вы все еще обеспокоены, если Python является ответом, вы можете исследовать Ruby on Rails и asp.Net, даже perl, php, такие вещи. Для меня Python определенно является ответом.