Python всъщност е страхотен език за изграждане на потоци от дейности и емисии с новини. Tommaso и аз написахме пакета 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:
person
Thierry
schedule
07.10.2014