2016-11-27 1 views
2

私のDjango + postgresqlのWebサイトでは、すべてがオンラインであることを公然と示す必要があります(ソーシャルウェブサイトです)。これはどうすればいいですか?たとえば、過去10分間に自分のnginxウェブサーバーにヒットしたすべてのログインユーザーを列挙する方法がありますか?そのようなことが働く可能性があります。私は初心者で、現時点では実行可能な解決策を探しています。Djangoのウェブサイト(postgresqlバックエンド、nginxウェブサーバー)のオンラインユーザーのスナップショットを記録する


現在、これを実現するために、私はセッションがenumeratableにするためにデータベース、using an external libraryにセッションを保存。これにより、ある時点でオンラインになっているユニークユーザーの数を問い合わせることができます。

しかし、このスキームは多くの不必要なDBトラフィックを作成します。その結果、ロギングおよびプルーニングログは無効になりました。さらにpgFouineは、私のウェブサイトが現在持っている最大のパフォーマンスのボトルネックであることをセッション関連のDB呼び出しと見せてくれます。

提案されている解決策はhereですが、データベースを使用しています。

答えて

0

現在、私は別のアプローチを試みています。私はミドルウェアを書いています。ミドルウェアは、各リクエスト時に、ユーザのuser_idがグローバルソートセットのstoredです。認証されている場合にのみこれを行います。私はredisのKey-Valueストアを使用して、すべてが驚くほど速くなるようにします。

解決策はまだ生きていません。私はここでさらに報告し、終わったら完全な答えを出すつもりです。私はまた、正しい解決策を示す前に、ここで与えられた他の答えを考慮します。

0

django-user-sessionsを使用している場合、Session modelにはlast_activityフィールドがあります。あなたが何か行うことができるかもしれません

from user_sessions import Session 
from datetime import datetime, timedelta 

time_threshold = datetime.now() - timedelta(minutes=10) 
qs = Session.objects.filter(last_activity__gt=time_threshold) 

もののを、django-user-sessionsは、ユーザー/セッションの非常に多くを持っている場合、つまり、フィールド上のデータベースインデックス、そのクエリを持っていません難しくて時間がかかるかもしれません。より複雑な答えには、cronジョブでリフレッシュするマテリアライズドビュー(ポストグルを使用している場合)を作成する必要があります。

1

djangoのcache frameworkを使用して、dbクエリの結果をメモリに保存します。そうすれば、すべてのページレンダリングで高価なデータベースクエリを実行する必要はありません。

from django.core.cache import cache 

def count_current_users(): 
    users = cache.get('users') 
    if users is None: 
     # last count has timed out 
     users = do_expensive_db_query() 
     cache.set('users', users, timeout=500) 
    return users 

https://docs.djangoproject.com/en/1.10/topics/cache/#basic-usage

またTemplate fragment cachingを使用して、キャッシュが古くなっている場合のみ、DBクエリを実行するカスタムテンプレートタグを書くことができます。結果は500秒間キャッシュされます。

{% cache 500 logged_in_users %} 
    {% expensive_query_db_for_logged_in_users %} 
{% endcache %} 

ユーザカウントをよりリアルタイムにするには、おそらくdjangoのキャッシュフレームワークをバイパスし、Redisと直接通信する必要があります。 ログインした各ユーザーを、設定された有効期間のキーとして保存します。 Redisから現在アクティブなキーのリストを取得することは、SQLデータベースに対する同等のクエリよりもずっと安いでしょう。 Pythonコードのほんの数行で実装することもできます。

関連する問題