python - 确保使用 flask-socketio、redis 发送套接字消息

标签 python redis flask-socketio

我有一个在多个 pod 上运行的 flask-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. 始终从主服务器运行您的发射。如果您需要从辅助进程发出,请使用 IPC 机制通知服务器,以便它可以代表它运行发出。现在您可以使用回调。

  2. 忽略回调,而是让客户端通过发送回服务器来确认收到事件。

顺便说一句,为辅助进程添加回调支持应该不是特别困难。我自己从来不需要该功能,而您是第一个询问它的人。也许我应该在某个时候研究一下。

编辑:经过深思熟虑,我想到了第三个选项:

您可以将外部进程作为客户端连接到服务器,而不是使用“仅发射”选项。如果这个进程是一个客户端,它可以向服务器发出一个事件,然后服务器可以将事件转发给外部客户端。当客户端回复服务器时,服务器可以再次将响应中继到外部进程,外部进程不是另一个客户端并且具有完整的发送和接收能力。

关于python - 确保使用 flask-socketio、redis 发送套接字消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145899/

相关文章:

python - Redis 中的键值对

redis - redis.conf 中的 maxmemory 参数

redis - 将列表存储在 redis 中会比很多键更有效吗?

python - 使用socket.io显示实时数据

python - 通过他们的 API 跟踪 Github 帐户事件的最佳方式是什么?

python - 如何在数字列表上实现模数?

python - Flask SocketIO 从服务器发送消息到房间

python - Flask中使用eventlet管理socketio

python - Boto3 S3 列表对象在 AWS lambda 中抛出错误

python - 缺少 mysql.sock;产生 OperationalError : (2002, "Can' t 通过套接字 '/tmp/mysql.sock' (2)"连接到本地 MySQL 服务器"