Python è in realtà un ottimo linguaggio per la costruzione di flussi di attività e newsfeed. Tommaso ed io abbiamo scritto il pacchetto Stream Framework. https://github.com/tschellenbach/stream-framework Attualmente è la soluzione Python più utilizzata per la creazione di newsfeed. Offriamo anche una soluzione hosted allo https://getstream.io. Il cliente Django è di gran lunga il più facile per iniziare con: https://github.com/GetStream/stream-django e pitone può essere trovato qui (https://github.com/getstream/stream-python)
La parte template funziona così
{% load stream_django %}
{% for activity in activities %}
{% render_activity activity %}
{% endfor %}
Questo renderà un modello situato in attività/tweet.html con l'attività come contesto. Per esempio
{{ activity.actor.username }} said "{{ activity.object.body }} {{ activity.created_at|timesince }} ago"
La documentazione completa sono qui: https://github.com/GetStream/stream-django#templating
Il quadro flusso consente di costruire qualsiasi tipo di newsfeed utilizzando Redis o Cassandra. È costruito per scalare e creare i singoli flussi di notizie utilizzando un processo di fanout.
Oltre al framework Stream (che ovviamente preferisco) ci sono molte altre soluzioni là fuori.Un elenco completo è disponibile sui pacchetti django: https://www.djangopackages.com/grids/g/activities/
Si noti che con i newsfeed ci sono alcuni problemi di ridimensionamento da tenere a mente. in generale ci sono 3 approcci comuni:
strategie Denormalizzazione
Pull La maggior parte degli utenti comincia in questo modo. Quando apri la pagina del feed, interroghi semplicemente i feed da tutti gli utenti che segui. Se i feed degli utenti sono archiviati in memoria, questo continuerà a funzionare per parecchio tempo. Alla fine è piuttosto difficile continuare ad usare la strategia, dato che spesso devi interrogare la maggior parte dei nodi che memorizzano i feed dell'utente.
Push L'approccio push scrive la tua attività su tutti i feed dei tuoi follower. Ovviamente questo significa che stai sprecando una tonnellata di risorse, ma il risultato finale è un feed pre-calcolato per utente. Questo approccio (sebbene inizialmente non molto efficiente) si adatta bene.
Combinazione Alcuni sistemi ottimizzati utilizzano una combinazione di questi due approcci. Vedi anche il documento di Yahoo su questo argomento.
opzioni di archiviazione
In termini di memorizzare tutti questi dati le opzioni più comuni sono Redis, Cassandra e MongoDB. Let confrontare rapidamente questi:
Redis Redis è estremamente facile da installare e mantenere. Tuttavia memorizza solo i dati in memoria. Ciò significa che dovrai ottimizzare la modalità di serializzazione dei dati e, eventualmente, il fallback sul database per i dati sottoposti a query meno frequenti. Un altro problema è che non è banale aggiungere macchine al tuo cluster Redis.
MongoDB Mongo DB viene utilizzato principalmente da alcuni progetti rubino ed è anche disponibile come backend per pump.io da e14n. Personalmente non l'ho mai eseguito in produzione, quindi non posso valutare correttamente questa opzione. Esistono tuttavia numerosi post sul blog che trattano problemi con le prestazioni, la scalabilità e la manutenibilità di mongo.
Cassandra Fashiolista, Instagram e Spotify utilizzano Cassandra. Anche la nostra soluzione hosted utilizza Cassandra come back-end. È estremamente conveniente operare ed è possibile aggiungere più nodi con facilità. L'unico problema è che è difficile da configurare e mantenere.
articoli
Inoltre dare un'occhiata a questo post elevata scalabilità sono stati ci spiegano alcune delle decisioni di progettazione coinvolti: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html
Per saperne di più sul design di alimentazione mi raccomando di leggere alcuni dei articoli quali abbiamo basato sulla Feedly:
Date un'occhiata un t come facciamo il template qui: https://github.com/GetStream/stream-django#templating Il tag del modello personalizzato rende tutto molto pulito. – Thierry