在分布式系统和高并发场景中,异步任务处理是提升系统吞吐量的关键技术方案。不同于同步请求的即时响应模式,异步任务将耗时操作从主流程中剥离,通过任务队列实现削峰填谷。本方案将深入分析三种主流异步通知机制:轮询(Polling)、WebSocket长连接和回调通知(Callback),并给出可落地的PRD(产品需求文档)编写范式。
选择异步通知机制时需综合评估四个维度:
最简轮询可通过定时请求实现:
javascript复制// 前端轮询示例
const pollTaskStatus = (taskId) => {
const interval = setInterval(async () => {
const res = await fetch(`/api/tasks/${taskId}`);
if (res.status === 'completed') {
clearInterval(interval);
handleCompletion(res.data);
}
}, 3000); // 3秒间隔
}
关键参数说明:轮询间隔建议2-5秒,过短增加服务端压力,过长影响用户体验
指数退避算法:失败后逐步拉大轮询间隔
python复制def next_poll_interval(attempt):
base = 2
max_wait = 60
return min(base ** attempt, max_wait)
长轮询(Long Polling):服务端hold连接直到状态变更或超时
java复制@GetMapping("/tasks/{id}")
public DeferredResult<TaskResult> longPollTask(
@PathVariable String id) {
DeferredResult<TaskResult> deferred = new DeferredResult<>(30000L);
taskService.subscribe(id, deferred::setResult);
return deferred;
}
前端建立WS连接:
javascript复制const socket = new WebSocket('wss://api.example.com/tasks');
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
updateTaskUI(data);
};
服务端维护连接池(以Spring为例):
java复制@ServerEndpoint("/tasks")
public class TaskEndpoint {
private static Set<Session> sessions =
ConcurrentHashMap.newKeySet();
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
}
}
javascript复制// 客户端心跳
setInterval(() => {
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({type: 'ping'}));
}
}, 25000); // 25秒间隔
// 服务端断连检测
@Scheduled(fixedRate = 30000)
public void checkAlive() {
sessions.removeIf(sess -> !sess.isOpen());
}
典型回调请求体:
json复制{
"task_id": "TASK_20230815_001",
"status": "success",
"result_url": "https://storage.example.com/results/001.pdf",
"signature": "sha256=abc123..."
}
签名验证:
python复制def verify_signature(payload):
secret = os.getenv('CALLBACK_SECRET')
sig = hmac.new(secret.encode(),
payload.encode(), 'sha256').hexdigest()
return sig == request.headers['X-Signature']
重试机制:
markdown复制## 异步任务通知方案
### 技术选型
- 采用WebSocket为主方案
- 降级方案:智能轮询(初始间隔3s,最大60s)
- 回调地址:HTTPS POST + HMAC-SHA256签名
### 状态定义
| 状态码 | 描述 | 可转换状态 |
|--------|---------------|------------------|
| 100 | 排队中 | 200,500 |
| 200 | 执行中 | 300,500 |
网络中断处理:
服务端超时控制:
yaml复制# 服务端配置
task:
timeout: 3600 # 1小时超时
retry_policy:
max_attempts: 3
backoff: 5000ms
json复制{
"op": "patch",
"path": "/progress",
"value": 85
}
css复制.progress-pulse {
animation: pulse 1.5s ease-in-out infinite;
}
核心监控看板应包含:
Prometheus示例配置:
yaml复制metrics:
websocket:
active_connections: gauge
messages_received: counter
task:
state_changes: histogram
iOS后台限制:
Nginx超时配置:
nginx复制proxy_read_timeout 3600s; # 长轮询超时
proxy_send_timeout 3600s;
心跳包优化: