18

ユーザーのステータス更新を処理する再利用可能な Django アプリを作成したいと思います。Facebookの「ニュースフィード」によく似ています。

ユースケースには、たとえば次のようなものがあります。

  • 教授は特定の日付により課題を作成できます。すべての学生は、課題が作成されたこと、簡単な説明、期限日、完全な説明を表示するためのリンクを含むニュース フィードで確認できます。
  • また、生徒にとって興味深いと思われる新しい PDF をアップロードすることもできます。ニュース フィードには、これに関する情報 (pdf の説明、ダウンロードへのリンク、プレビューへのリンクなど) が表示されます。
  • YouTube 動画へのリンクを投稿したり、ニュース フィードに小さなサムネイルを表示したりできます。クリックすると、JavaScriptを使用して動画が埋め込まれ、ユーザーはすぐに視聴できます。

1 つの懸念事項は、さまざまな種類の更新を処理し、適切な "html スニペット" を表示する方法です。もう1つは、この「Django流」のモデルをどのように設計するかということです。

前者については、次の 2 つの方法が考えられます。

  1. モデル継承の使用;
  2. ジェネリック リレーションの使用。

ここに投稿する前に検索しましたが、何も見つかりませんでした。Pinax に実装されているかどうかを確認しましたが、実装されていません。だから、私はここで、これを素晴らしく非ハックな方法で処理する方法についての提案を探しています。

前もって感謝します、

4

4 に答える 4

17

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 の元になった次の記事を読むことを強くお勧めします。

于 2014-10-07T13:37:43.893 に答える
9

私は2つの方法で考えることができます:

まず、モデル、、、のフィードを作成しライブラリフィードパーサーを使用してニュースビューに埋め込むことができます。これは、テンプレートで新しいアクティビティの種類ごとのコードを定義できるため、簡単な方法です。AssigmentsPdfFilesYoutube link

私が考えることができる2番目のことはクラスを作ることですActivity

class Activity(models.Model):
    date = models.DateTimeField(auto_now_add = True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

そして、シグナルを介して、新しい割り当て、PDFアップロード、またはYouTubeリンクがあるたびに、アクティビティの新しいインスタンスを作成します。クラスごとに、次のようなメソッドを作成render_to_htmlします。このように、ビューで、アクティビティを超えて呼び出します。メソッドrender_to_html

于 2010-01-24T22:22:49.183 に答える
5

diegueus9が言及し、以前は考えもしなかった1 つの役立つキーワード (「アクティビティ」) をさらにグーグル検索した結果、より関連性の高い資料を見つけることができました。

まず、フレームワークを使用して django を使用してタンブルブログを構築する方法に関する 2 つのブログ投稿ContentType:

その後、(1 + n) クエリの問題を軽減する方法に関する提案を提供する別の投稿 (最初は私の懸念事項の 1 つでしたが、質問が煩雑になるのを避けるために言及しませんでした)。

最後に、私が必要としていたいくつかの機能を備えた、再利用可能な Django アプリです。これは、後で参照するのに役立ちます。

于 2010-01-25T00:14:28.097 に答える
3

一般的な関係は、ここに行く方法です。更新テーブルに対して結合するのではなく、必ず自分でモデルを解決してください。

于 2010-01-24T21:19:09.317 に答える