2

私は Flask+nginx+gunicorn アプリケーションを構築しました。このアプリケーションは、ペア zmq ソケットを介してサービスと通信し、次にリクエストを分散ワーカーに送信して結果を返します。

ただし、正しい情報がユーザーに返されていることを確認するために多くのチェックを行っていません。これは、ユーザー A とユーザー B がほぼ同時にデータを要求した場合、結果が間違ったユーザーのものになる可能性があることを意味します。

リクエストで何らかのコンテキスト(ユーザー名など)を送信する必要があると思います。結果が戻ってきたら、それをキューに入れ、ブラウザのリクエストがコンテキストに基づいて正しい結果を選択するようにします。

データが正当な所有者に送信されていることを確認するにはどうすればよいでしょうか?

コードは次のようになります。

@app.route('/restart', methods = ['POST'])
def restart():
    uuid = request.form['uuid']
    msg = json.dumps({'command': 'restart', 'uuid': uuid})
    send_to_master(msg)
    resp = Response(response=data, status=200, mimetype="application/json")
    return resp

def send_to_master(msg):
    context = zmq.Context()
    s = context.socket(zmq.PAIR)
    s.connect("tcp://localhost:9001")
    s.send(msg)

    # result received from the service
    data = s.recv()

    s.close()
    return data
4

1 に答える 1

1

send_to_master問題はおそらく、アプリケーション全体で一度に 1 つのペア ソケットのみが開かれるようにするために、ロックインを実装する必要があることです。

https://stackoverflow.com/a/10181810/288425で詳しく説明されているように、ロックの実装を試すことができ ます。

私はそれをテストしていませんが、ここに刺し傷があります:

from threading import Lock
lock = Lock()

def send_to_master(msg):
    context = zmq.Context()

    with lock:
        s = context.socket(zmq.PAIR)
        s.connect("tcp://localhost:9001")
        s.send(msg)

        # result received from the service
        data = s.recv()

        s.close()

    return data

...
于 2013-11-04T16:36:58.743 に答える