2016-05-30 1 views
1

私はmyanimelist.net API(sample)からユーザーのXMLを取得して処理し、いくつかのデータを返すFlaskアプリケーションを開発中です。返されるデータは、ユーザーが表示しているFlaskページによって異なる場合がありますが、各リクエストが常に同じ前に行われる最初のプロセス(XMLの取得、Userオブジェクトの作成など)は異なります。FlaskリクエストにHTTP接続(またはその他のデータ)を保持することはできますか?

現在、myanimelist.netからXMLを取得することは、私のアプリケーションのパフォーマンスのボトルネックになり、各リクエストに500-1000msの良好なパフォーマンスを追加します。すべてのアプリケーションのリクエストはmyanimelistサーバーにあるので、http接続を維持する方法があるかどうかを知りたいので、最初のリクエストが行われると、後続のリクエストのロードに時間がかかりません。データが頻繁に変更されるため、XML全体をキャッシュする必要はありません。ここで

は私のアプリの一般的な概要です:

from flask import Flask 
from functools import wraps 
import requests 

app = Flask(__name__) 


def get_xml(f): 
    @wraps(f) 
    def wrap(): 
     # Get the XML before each app function 
     r = requests.get('page_from_MAL') # Current bottleneck 
     user = User(data_from_r) # User object 
     response = f(user) 
     return response 
    return wrap 


@app.route('/one') 
@get_xml 
def page_one(user_object): 
    return 'some data from user_object' 


@app.route('/two') 
@get_xml 
def page_two(user_object): 
    return 'some other data from user_object' 

if __name__ == '__main__': 
    app.run() 

だから私が述べたように、接続を永続化する方法はありますか?私が正しい方向からこれに近づいているかどうか教えてください。

+0

なぜ、get_xmlをタスクハンドラに配布して、Celeryなどのバックグラウンドでプロセスを実行しないのですか? – glls

+0

キャッシュと同じ方法で古い結果を返さないでしょうか?それは避けられないのでしょうか? – Noah

答えて

0

あなたは正しい方向からアプローチしていないと思うのですが、アプリケーションをmyanimelist.netのプロキシとしてあまりにも多く置いているからです。

ユーザーが2000人の場合はどうなりますか?あなたのアプリはmyanimelist.netにたくさんのリクエストをしてしまいますし、平均的なユーザーはあなたのアプリをDoSしてしまうかもしれません(またはDoS myanimelist.netにそれを使用することもできます)。

これは非常にきれいな方法の私見です:

  • サーバー側:

    • はWebSocketのサーバーを作成します(例:https://github.com/aaugustin/websockets/blob/master/example/server.py)ユーザーはWebSocketのサーバーに接続すると
    • 、追加クライアントをリストに追加し、切断時にリストから削除します。すべての接続ユーザーの場合
    • 、頻繁に、すべてのXML文書の
    • 関連するXML(多分低度数あなたが得るより多くのオンラインユーザー)を取得するためにmyanimelist.netを確認し、サーバーのローカルバージョンとの差分を作成し、送信しますwebsocketチャネルを使用してクライアントにdiffします(diffがあると仮定します)。差分を受信する
    • クライアント側の差異とローカルXMLを更新します。私はあなたがはるかに良いmyanimelist.netは「プッシュを提供していないと仮定すると何かを行うことができます疑う

を再接続するためのインタフェース上のボタンを追加切断+非アクティブのn秒後のWebSocketから

  • 切断API。

  • +0

    明確にする - 接続されたユーザーの更新のみ(変更が見つかった場合)、一定間隔で更新しますか? 「ローカル」XML(更新間)は、ユーザー要求とキャッシュの間にどこに格納されますか? – Noah

    +0

    はい、固定されたインターフェースで接続されたユーザーの更新のみです。そして、更新の間、またはディスク上にxmlをRAMに保存することもできますが、それはある種のキャッシュです。 –

    関連する問題