Python - отличный язык для создания потоков деятельности и новостных лент. Томмасо и я написали пакет Stream Framework.
https://github.com/tschellenbach/stream-framework
В настоящее время это наиболее используемое решение Python для создания новостных лент. Мы также предлагаем размещенное решение на https://getstream.io.. Клиент Django, безусловно, легче всего начать с:
https://github.com/GetStream/stream-django и python можно найти здесь (https://github.com/getstream/stream-python)
Шаблонная часть работает так
{% load stream_django %}
{% for activity in activities %}
{% render_activity activity %}
{% endfor %}
Это отобразит шаблон, расположенный в файле activity / tweet.html, с действием в качестве контекста. Например
{{ activity.actor.username }} said "{{ activity.object.body }} {{ activity.created_at|timesince }} ago"
Полные документы здесь:
https://github.com/GetStream/stream-django#templating
Stream Framework позволяет создавать новостные ленты любого типа, используя Redis или Cassandra. Он построен в масштабе и создает отдельные новостные ленты с помощью процесса разветвления.
Помимо Stream Framework (который я, очевидно, предпочитаю), существует множество других решений. Полный список доступен на пакетах django:
https://www.djangopackages.com/grids/g/activities/
Обратите внимание, что в новостных лентах есть несколько проблем, связанных с масштабированием.
В целом существует 3 общих подхода:
Стратегии денормализации
Прицепные
Большинство пользователей начинают таким образом. Открывая страницу канала, вы просто запрашиваете каналы у всех пользователей, на которых вы подписаны. Если пользовательские каналы хранятся в памяти, это будет продолжаться довольно долго. В конце концов, довольно трудно продолжать использовать такую стратегию, хотя вам часто приходится запрашивать большинство узлов, хранящих фиды вашего пользователя.
Нажмите
Пуш-подход записывает вашу активность во всех ваших фолловерах. Конечно, это означает, что вы тратите кучу ресурсов, но конечным результатом является предварительно рассчитанный фид на пользователя. Этот подход (хотя изначально не очень эффективный) хорошо масштабируется.
Комбинация
Некоторые оптимизированные системы используют комбинацию этих двух подходов. Также см. Статью Yahoo на эту тему.
Варианты хранения
С точки зрения хранения всех этих данных наиболее распространенными являются Redis, Cassandra и MongoDB.
Давайте быстро сравним это:
Redis
Redis чрезвычайно прост в настройке и обслуживании. Однако он хранит данные только в памяти. Это означает, что вам придется оптимизировать порядок сериализации данных и, возможно, использовать резервную базу данных для менее часто запрашиваемых данных. Другая проблема заключается в том, что добавлять компьютеры в кластер Redis нетривиально.
MongoDB
Mongo DB используется в основном несколькими проектами ruby, а также доступен в качестве бэкэнда для pump.io от e14n. Лично я никогда не запускал его в производстве, поэтому не могу правильно оценить этот вариант. Тем не менее, существует множество постов, посвященных проблемам производительности, масштабируемости и удобства обслуживания mongo.
Cassandra
Fashiolista, Instagram и Spotify все используют Cassandra. Наше решение также использует Cassandra в качестве бэкэнда. Это чрезвычайно экономически выгодно, и вы можете легко добавить больше узлов. Единственная проблема заключается в том, что его сложно настроить и поддерживать.
Статьи
Кроме того, взгляните на этот пост с высокой масштабируемостью, где мы объясняем некоторые из проектных решений:
http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html
Чтобы узнать больше о дизайне кормов, я настоятельно рекомендую прочитать некоторые статьи, на которых мы основывали Feedly: