Убедитесь, что сообщения сокетов были отправлены с помощью flask-socketio, redis - PullRequest
0 голосов
/ 11 января 2019

У меня есть сервер flash-socketio, работающий на нескольких модулях, использующих redis в качестве очереди сообщений. Я хочу убедиться, что излучения от внешних процессов достигают цели 100% времени, или чтобы знать, когда они потерпели неудачу.

Когда процесс A отправляет событие в сокет, подключенный к процессу B, событие передается клиенту через очередь сообщений для процесса B. Можно ли как-то перехватить исходящий выброс в процессе B? В идеале я бы использовал работника, чтобы через несколько секунд проверить, пришло ли сообщение клиенту (через событие подтверждения, отправленное клиентом), или оно будет отправлено снова.

Этот код выполняется в процессе A:

@app.route('/ex')
def ex_route():
    socketio.emit('external', {'text': f'sender: {socket.gethostname()}, welcome!'}, room='some_room')
    return jsonify(f'sending message to room "some_room" from {socket.gethostname()}')

Это результат процесса A

INFO:socketio.server:emitting event "external" to some_room [/]
INFO:geventwebsocket.handler:127.0.0.1 - - [2019-01-11 13:33:44] "GET /ex HTTP/1.1" 200 177 0.003196

Это вывод процесса B

INFO:engineio.server:9aab2215a0da4816a45e3fdc1e449fce: Sending packet MESSAGE data 2["external",{"text":"sender: *******, welcome!"}]

1 Ответ

0 голосов
/ 11 января 2019

К сожалению, в настоящее время нет механизма для выполнения того, что вы просите.

Я думаю, у вас есть два подхода к этому:

  1. Всегда запускайте свои эмиссии с основного (ых) сервера (ов). Если вам нужно выполнить излучение из вспомогательного процесса, используйте механизм IPC, чтобы уведомить сервер, чтобы он мог запустить emit от своего имени. И теперь вы можете использовать обратные вызовы.

  2. Игнорировать обратные вызовы и вместо этого попросить клиента подтвердить получение события, отправив его обратно на сервер.

Кстати, добавление поддержки обратного вызова для вспомогательных процессов не должно быть очень сложным. Я никогда не нуждался в этой функции сам, и вы первый, кто спрашивает об этом. Может быть, я должен рассмотреть это в какой-то момент.

Редактировать : после некоторых раздумий я предложил третий вариант:

Вы можете подключить ваш внешний процесс к серверу в качестве клиента, вместо использования опции «только для отправки». Если этот процесс является клиентом, он может отправлять событие на сервер, который, в свою очередь, сервер может передавать на внешний клиент. Когда клиент отвечает на сервер, сервер может еще раз передать ответ внешнему процессу, который не является другим клиентом и имеет полные возможности отправки и получения.

...