后台作业和工作线程
探索后台作业和工作进程如何处理异步、长时间运行以及非阻塞的后端任务。
为什么存在后台任务
有些任务在一次请求中执行时间太长,因此必须移出请求生命周期,以保持系统快速且响应及时。
- 长时间运行的任务会显著延迟对用户的响应。
- 常见示例包括发送电子邮件、生成报告和处理媒体文件。
- 后台任务允许这些任务独立于面向用户的请求运行。
详情
在典型的后端系统中,一个请求通常需要快速完成。用户一般期望在毫秒级或最多几秒内收到响应。然而,有些操作会耗时更久,例如处理上传的视频、生成大型报告,或者向许多用户发送通知。
如果这些任务直接在请求生命周期内执行,服务器就必须等待它们完成后才能响应。这会导致响应时间变慢,甚至可能引发超时,尤其是在高流量情况下。
这不仅会带来糟糕的用户体验,还会降低系统效率,因为资源会被长时间运行的操作占用,而不是用来处理新的请求。
为了解决这个问题,后端系统会把这些任务移到后台。服务器先快速向客户端返回响应,而长时间运行的任务则在请求生命周期之外异步继续执行。
这种分离是现代后端系统中的一种基础设计模式,它既能实现快速响应,又能可靠地处理复杂且耗时的操作。
Worker Processes
Worker 进程是专门用于在主 Web 服务器之外执行后台任务的程序。
- Worker 独立于 Web 服务器运行,只专注于处理任务。
- 它们会持续从队列中消费任务。
- 增加更多 worker 可以提高系统吞吐量和并行处理能力。
详情
Worker 进程负责执行存储在队列中的任务。与处理传入请求的 Web 服务器不同,worker 独立运行,并针对后台任务执行进行了优化。
每个 worker 会持续监听任务队列,并在有任务可用时拉取任务。任务被取出后,worker 会处理它,然后继续处理下一个任务。
由于 worker 作为独立进程运行,它们可以独立于主应用进行扩展。这使系统能够在不降低请求处理速度的情况下应对不断增长的工作负载。
增加更多 worker 可以通过让多个任务并行处理来提高吞吐量,这对于高效处理大量后台任务至关重要。
消息代理和队列系统
消息代理提供基础设施,用于存储、分发并可靠地将后台任务交付给 worker。
- 消息代理作为任务队列的底层系统。
- 常见技术包括 Kafka、RabbitMQ 和 AWS SQS。
- 它们确保任务被可靠地存储、传递和处理。
详情
消息代理是位于应用程序和 worker 进程之间的系统,负责管理任务流。当应用程序创建一个 job 时,它会将其发送到 broker,而不是直接发送给 worker。
broker 会持久化存储该 job,确保即使系统的某些部分发生故障,它也不会丢失。这对于可靠性至关重要,尤其是在故障可能发生在任何位置的分布式系统中。
然后,worker 会连接到 broker,并在准备好处理任务时拉取任务。这将应用程序与执行层解耦,使双方都可以独立扩展。
消息代理还支持分布式处理,使多个分布在不同机器上的 worker 能够并发处理任务,同时保持可靠的交付保证。
延迟任务
延迟任务允许将任务安排在稍后的时间执行,而不是立即运行。
- 任务可以被安排在特定延迟之后运行。
- 常见用例包括提醒和重试失败的任务。
- 这使后端系统能够实现基于时间的自动化。
详情
并非所有任务都需要立即执行。在很多情况下,需要将工作安排到稍后的时间执行,例如在 24 小时后发送提醒邮件,或者在短暂延迟后重试失败的操作。
延迟任务允许系统定义任务应该在什么时候执行,而不是立刻处理。任务会连同延迟时间或计划执行时间一起存储,系统会确保它在该时间到达时被执行。
这通常通过消息代理或调度系统来实现,这些系统会跟踪任务何时对 worker 可用。在延迟到期之前,任务保持非活动状态,不会被 worker 取走。
一旦到达计划时间,任务就会被移入活动队列,并像其他任务一样被处理。这个机制对于构建可靠的重试系统和基于时间的工作流至关重要。
延迟执行是现代后端系统中的关键特性,它能够实现自动化并提高容错能力,而无需人工干预。
Cron 作业
Cron 作业会按固定计划自动运行任务,无需人工干预即可实现重复性操作。
- Cron 作业会在预定义的时间间隔执行任务。
- 常见用例包括维护、报表和计费。
- 它们由调度器触发,而不是由用户请求触发。
详情
Cron 作业用于在特定时间或间隔重复运行任务,例如每晚、每天或每周。与由用户操作触发的后台作业不同,Cron 作业是由调度器发起的。
调度器通常也称为 cron,它会跟踪基于时间的规则,并在满足这些条件时触发任务。例如,系统可能会在每天午夜运行数据库清理任务,或者在每天早晨生成分析报表。
一旦被触发,计划任务通常会被发送到 worker 进程,或者作为后台作业执行。这样系统就可以处理重复性工作负载,而不会影响实时请求处理。
Cron 作业对于自动化日常操作至关重要,它能确保维护任务和周期性任务持续、稳定地执行,而无需人工操作。
后台任务中的失败处理
后台任务可能会失败,因此系统必须实现重试策略,以确保任务最终能够完成。
- 在分布式系统中,失败是预期内的,必须显式处理。
- 重试队列允许任务在失败后再次尝试。
- 死信队列会收集那些反复失败的任务。
详情
后台任务通常依赖数据库、API 或网络服务等外部系统,而这些系统可能会不可预测地失败。因此,失败处理是任何后台任务系统中的关键部分。
一种常见的方法是重试失败的任务。当某个任务失败时,它会被放回重试队列,并在一段延迟后再次尝试。如果失败只是暂时性的,这会提高成功的概率。
为了避免压垮系统,重试通常会使用指数退避来拉开间隔,也就是每次重试等待的时间都比上一次更长。这样可以防止连续快速失败带来额外负载。
如果某个任务失败次数过多,它会被移动到死信队列。这样工程师就可以检查和调试有问题的任务,而不会阻塞系统的其他部分。
这些模式可以确保后台处理即使在发生失败时也依然可靠,这对于构建健壮的后端系统至关重要。
问题部分
1 / 5
此课程属于高级内容
升级到高级版以去除模糊效果并解锁完整内容。