Отправление правильной информации из распределенной работы по параллельным запросам

Я создал приложение 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

1 ответ

Решение

Проблема, вероятно, в том, что вам нужно реализовать блокировку в send_to_master чтобы убедиться, что только одна пара сокетов открыта одновременно в вашем приложении.

Вы можете попробовать реализовать блокировку, как описано по адресу: /questions/28330761/rabotaya-s-globalnyim-singltonom-vo-flask-wsgi-nuzhno-li-mne-bespokoitsya-o-sostoyanii-gonki/28330770#28330770

Вот удар, хотя я не проверял его:

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

...
Другие вопросы по тегам