try fix nextchapter bug
This commit is contained in:
124
Html/apps/_docs/ACK_SUPPORT_GUIDE.md
Normal file
124
Html/apps/_docs/ACK_SUPPORT_GUIDE.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# 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` 是客户端ID
|
||||
- `timestamp` 是当前时间的格式化字符串(精确到微秒)
|
||||
|
||||
### 3. ACK事件
|
||||
|
||||
客户端监听 `ack` 事件,用于接收服务器的确认消息。
|
||||
|
||||
## 后端WebSocket服务器需要的支持
|
||||
|
||||
### 1. 接收消息处理
|
||||
|
||||
当服务器收到客户端发送的消息时,需要:
|
||||
|
||||
1. 检查消息中是否包含 `ack_id` 字段
|
||||
2. 如果包含 `ack_id`,立即发送ACK确认消息,不需要等待后续业务逻辑执行
|
||||
3. 继续执行后续的业务逻辑
|
||||
|
||||
### 2. ACK消息格式
|
||||
|
||||
服务器需要向客户端发送 `ack` 事件,消息格式如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"ack_id": "客户端发送的ack_id值"
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 发送ACK的时机
|
||||
|
||||
**非常重要**:服务器必须在收到客户端消息后**立即**发送ACK确认,而不是在业务逻辑执行完成后发送。这样可以确保客户端能够快速收到确认,继续执行后续操作。
|
||||
|
||||
### 4. 实现示例(Python Socket.IO)
|
||||
|
||||
```python
|
||||
# 服务器端示例代码
|
||||
@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)
|
||||
|
||||
```python
|
||||
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)
|
||||
|
||||
```python
|
||||
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确认即可。
|
||||
|
||||
这种设计既保证了通信的可靠性,又不会影响业务逻辑的执行效率,是一种高效且可靠的通信方式。
|
||||
Reference in New Issue
Block a user