4.0 KiB
4.0 KiB
ACK机制支持指南
概述
客户端已实现基于emit机制的ACK确认功能,允许客户端在发送消息后等待服务器确认,从而支持同步和异步两种通信模式。
客户端改动
1. 新增参数
客户端的三个主要发送方法 send_text、send_voice 和 send_image 都新增了以下参数:
wait_for_ack: bool = False- 是否等待服务器ACK确认timeout: int = 5- 等待ACK的超时时间(秒)
2. 消息格式变化
客户端发送的消息中新增了 ack_id 字段,格式为 {id}_{timestamp},其中:
id是客户端IDtimestamp是当前时间的格式化字符串(精确到微秒)
3. ACK事件
客户端监听 ack 事件,用于接收服务器的确认消息。
后端WebSocket服务器需要的支持
1. 接收消息处理
当服务器收到客户端发送的消息时,需要:
- 检查消息中是否包含
ack_id字段 - 如果包含
ack_id,立即发送ACK确认消息,不需要等待后续业务逻辑执行 - 继续执行后续的业务逻辑
2. ACK消息格式
服务器需要向客户端发送 ack 事件,消息格式如下:
{
"ack_id": "客户端发送的ack_id值"
}
3. 发送ACK的时机
非常重要:服务器必须在收到客户端消息后立即发送ACK确认,而不是在业务逻辑执行完成后发送。这样可以确保客户端能够快速收到确认,继续执行后续操作。
4. 实现示例(Python Socket.IO)
# 服务器端示例代码
@sio.on('text_message') # 根据实际事件名调整
def handle_text_message(sid, data):
# 1. 立即发送ACK确认
if 'ack_id' in data:
sio.emit('ack', {'ack_id': data['ack_id']}, room=sid)
# 2. 执行后续业务逻辑(可能耗时较长)
# ... 业务逻辑代码 ...
@sio.on('voice_message') # 根据实际事件名调整
def handle_voice_message(sid, data):
# 1. 立即发送ACK确认
if 'ack_id' in data:
sio.emit('ack', {'ack_id': data['ack_id']}, room=sid)
# 2. 执行后续业务逻辑(可能耗时较长)
# ... 业务逻辑代码 ...
@sio.on('image_message') # 根据实际事件名调整
def handle_image_message(sid, data):
# 1. 立即发送ACK确认
if 'ack_id' in data:
sio.emit('ack', {'ack_id': data['ack_id']}, room=sid)
# 2. 执行后续业务逻辑(可能耗时较长)
# ... 业务逻辑代码 ...
使用示例
客户端同步调用(等待ACK)
client = ASEngineClient(server_url, namespace, id)
client.connect()
# 同步调用:等待ACK确认后再继续执行
result = client.send_text('text_message', 'Hello', wait_for_ack=True, timeout=3)
if result:
print("消息已被服务器确认收到")
# 执行后续操作
else:
print("等待ACK超时")
客户端异步调用(不等待ACK)
client = ASEngineClient(server_url, namespace, id)
client.connect()
# 异步调用:发送后立即返回,不等待ACK
result = client.send_text('text_message', 'Hello', wait_for_ack=False)
if result:
print("消息已发送")
# 执行后续操作,不需要等待ACK
注意事项
- 向后兼容:客户端的改动保持了向后兼容性,现有代码无需修改即可继续使用。
- 超时处理:客户端会在指定的超时时间后停止等待ACK,并返回False。
- 资源清理:客户端会在收到ACK或超时时清理相关的ACK状态,避免内存泄漏。
- 唯一标识:
ack_id确保了每个消息的唯一性,避免ACK混淆。 - 性能考虑:等待ACK会阻塞当前线程,建议仅在必要时使用同步模式。
总结
通过实现基于emit机制的ACK确认功能,客户端和服务器之间的通信可以灵活支持同步和异步两种模式。服务器需要做的改动非常简单,只需要在收到消息后立即发送ACK确认即可。
这种设计既保证了通信的可靠性,又不会影响业务逻辑的执行效率,是一种高效且可靠的通信方式。