Files
hsa/Html/apps/_docs/ACK_SUPPORT_GUIDE.md
2025-12-13 18:16:34 +08:00

4.0 KiB
Raw Permalink Blame History

ACK机制支持指南

概述

客户端已实现基于emit机制的ACK确认功能允许客户端在发送消息后等待服务器确认从而支持同步和异步两种通信模式。

客户端改动

1. 新增参数

客户端的三个主要发送方法 send_textsend_voicesend_image 都新增了以下参数:

  • wait_for_ack: bool = False - 是否等待服务器ACK确认
  • timeout: int = 5 - 等待ACK的超时时间

2. 消息格式变化

客户端发送的消息中新增了 ack_id 字段,格式为 {id}_{timestamp},其中:

  • id 是客户端ID
  • timestamp 是当前时间的格式化字符串(精确到微秒)

3. ACK事件

客户端监听 ack 事件,用于接收服务器的确认消息。

后端WebSocket服务器需要的支持

1. 接收消息处理

当服务器收到客户端发送的消息时,需要:

  1. 检查消息中是否包含 ack_id 字段
  2. 如果包含 ack_id立即发送ACK确认消息不需要等待后续业务逻辑执行
  3. 继续执行后续的业务逻辑

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

注意事项

  1. 向后兼容:客户端的改动保持了向后兼容性,现有代码无需修改即可继续使用。
  2. 超时处理客户端会在指定的超时时间后停止等待ACK并返回False。
  3. 资源清理客户端会在收到ACK或超时时清理相关的ACK状态避免内存泄漏。
  4. 唯一标识ack_id 确保了每个消息的唯一性避免ACK混淆。
  5. 性能考虑等待ACK会阻塞当前线程建议仅在必要时使用同步模式。

总结

通过实现基于emit机制的ACK确认功能客户端和服务器之间的通信可以灵活支持同步和异步两种模式。服务器需要做的改动非常简单只需要在收到消息后立即发送ACK确认即可。

这种设计既保证了通信的可靠性,又不会影响业务逻辑的执行效率,是一种高效且可靠的通信方式。