Отправление правильной информации из распределенной работы по параллельным запросам
Я создал приложение 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
...