
1) 【一句话结论】:在视频处理任务队列设计中,任务提交场景需采用CP(强一致性+可用性),通过数据库事务保证数据强一致并即时反馈;任务获取场景采用AP(高可用性+分区容错性),利用消息队列实现高可用,容忍数据最终一致,通过业务层去重解决重复消费问题。
2) 【原理/概念讲解】:CAP理论是分布式系统三大属性的权衡,核心是一致性(C)、可用性(A)、分区容错性(P)。
3) 【对比与适用场景】:
| 组合 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| CP(C+A) | 强一致性 + 可用性 | 分区时节点不可用(停止服务),保证数据一致 | 需要强一致性的场景(如用户提交任务需即时确认,金融交易等) | 分区时系统不可用,用户体验差 |
| AP(A+P) | 高可用性 + 分区容错性 | 分区时节点继续服务,数据可能不一致(最终一致) | 对可用性要求高,容忍数据不一致的场景(如消息队列、任务队列,消费者断开连接后重新连接) | 数据可能不一致,需业务层处理(如去重) |
| CA(C+A) | 理论不可行 | - | - | -(P存在时C和A不能同时满足) |
4) 【示例】:
任务提交(用户上传视频,提交处理任务):
INSERT INTO tasks (video_id, task_type, status) VALUES (?, ?, 'pending')),然后提交事务。高并发下,MySQL InnoDB的行锁(如乐观锁或悲观锁)处理并发冲突,比如两个用户同时提交相同视频的任务,事务隔离级别设为REPEATABLE READ,避免脏读,确保数据一致。POST /api/tasks
{
"video_id": "vid-123",
"task_type": "transcode",
"priority": "high",
"task_id": "task-001"
}
任务获取(消费者(如视频处理节点)从队列获取任务):
task_id)作为唯一标识,实现幂等性。消费者处理前检查任务状态(如数据库中status是否为“completed”),若已处理则跳过,避免重复执行。GET /api/tasks?topic=video-transcode
def process_task(task_id):
# 检查任务是否已处理
if check_task_status(task_id, 'completed'):
return # 跳过,避免重复
# 执行任务(如视频转码)
transcode_video(task_id)
# 更新任务状态为完成
update_task_status(task_id, 'completed')
5) 【面试口播版答案】:
“面试官您好,关于CAP理论在视频处理任务队列中的应用,核心是根据业务场景选择不同的CAP组合。首先,CAP理论中P(分区容错性)是分布式系统的基本要求,任何系统都必须能容忍网络分区。然后,一致性(C)和可用性(A)是权衡项。
比如任务提交场景,用户上传视频后需要立即确认,此时我们选择CP(强一致性+可用性):系统将任务写入数据库(通过事务保证数据强一致,比如MySQL的InnoDB事务,高并发下用行锁避免冲突),用户提交后能立即收到成功提示,因为用户需要即时反馈。而任务获取场景,视频处理节点需要持续获取任务,即使网络分区(比如节点断开),队列需要继续工作,此时选择AP(高可用+分区容错性):通过消息队列(如Kafka),节点继续服务,即使分区,队列仍能处理任务,可能存在重复消费,但系统可用。
具体来说,任务提交时,我们用数据库事务保证数据强一致,用户提交后能立即收到成功;任务获取时,用Kafka实现高可用,消费者断开重连后通过任务ID去重,避免重复处理。这样既满足了用户对提交反馈的需求,又保证了处理节点的持续工作,平衡了系统性能和可靠性。”
6) 【追问清单】:
task_id)或幂等性设计(检查任务状态是否已处理,若已处理则跳过),确保重复消费不导致错误结果。7) 【常见坑/雷区】: