Python は、Activity Streams と Newsfeeds を構築するための優れた言語です。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 つの一般的なアプローチがあります。
非正規化戦略
プル
ほとんどのユーザーはこの方法で始めます。フィード ページを開くと、フォローしているすべてのユーザーからのフィードをクエリするだけです。ユーザーのフィードがメモリに保存されている場合、これはかなりの時間機能し続けます。ユーザーのフィードを保存しているほとんどのノードにクエリを実行する必要があることが多いため、最終的にはこのような戦略を使い続けることは非常に困難です。
プッシュ
プッシュ アプローチでは、すべてのフォロワー フィードにアクティビティが書き込まれます。もちろん、これは大量のリソースを浪費していることを意味しますが、最終的にはユーザーごとに事前に計算されたフィードになります。このアプローチは (最初はあまり効率的ではありませんが) うまくスケーリングします。
組み合わせ
最適化されたシステムの中には、これら 2 つのアプローチを組み合わせて使用するものがあります。このトピックに関する Yahoo の論文も参照してください。
ストレージ オプション
このすべてのデータを格納するという点で、最も一般的なオプションは、Redis、Cassandra、および MongoDB です。これらを簡単に比較してみましょう。
Redis
Redis は、セットアップと保守が非常に簡単です。ただし、メモリにデータを保存するだけです。これは、データをシリアル化する方法を最適化し、クエリの頻度が低いデータについてはデータベースにフォールバックする必要があることを意味します。もう 1 つの問題は、マシンを Redis クラスターに追加するのが簡単ではないことです。
MongoDB
Mongo DB は主にいくつかの ruby プロジェクトで使用されており、e14n による pump.io のバックエンドとしても利用できます。個人的には本番環境で実行したことがないため、このオプションを適切に評価することはできません。ただし、mongo のパフォーマンス、スケーラビリティ、および保守性に関する問題をカバーするブログ投稿が多数あります。
Cassandra
Fashiolista、Instagram、Spotify はすべて Cassandra を使用しています。私たちのホストされたソリューションは、バックエンドとして Cassandra も使用します。運用コストが非常に高く、ノードを簡単に追加できます。唯一の問題は、セットアップと保守が難しいことです。
記事
さらに、この高スケーラビリティの投稿を見て、関連する設計上の決定事項のいくつかを説明しました:
http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic- feeds.html
フィードの設計についてさらに学ぶには、Feedly の元になった次の記事を読むことを強くお勧めします。