后台进程和后台任务
在构建一个高性能可伸缩的 Web 应用的时候,你可以使用后台任务将一些耗时的操作从 HTTP 请求的处理中分解出来,放到后台进程中去异步执行。大部分的 Web 请求应该在 500ms 内完成,如果你发现你的应用有大于这个甚至有花费一两秒才能完成的请求,那么这个时候你应该考虑使用使用后台任务,将这些耗时的请求放到后台进程中去执行。
比如:发送邮件、读取比较慢的 API 接口、上传数据到云存储中,这些任务都应该放到后台任务中去执行,前端的 Web 进程应该添加完后台任务后立刻回复客户端,然后客户端可以轮询检查更新来确认任务是否已经完成了。
我们以一个 Web RSS 阅读器为例,这类应用都会有一个让用户添加新的 Feed URL 的功能,添加完成后用户会被转到一个显示这个新 Feed 内容的页面。实现以上功能最简单的方法,是在 HTTP 请求中的处理进程中直接读取第三方的 Feed 并返回。但是,读取 RSS Feed 的内容是个很耗时的操作,取决于这个 Feed 的响应速度,慢的话几秒,如果提供 Feed 的服务有问题,甚至可能导致几十秒(取决于设置的超时时间)。这些会导致应用的页面卡死或者请求超过 Web 进程的处理时间上线而被杀死从而导致请求失败,用户体验会非常差。
解决方法就是使用后台任务,将后台任务放到后台进程中去执行,Web 进程添加完任务后立刻返回。后台进程不处理 HTTP 请求,只是不停的从任务队列里取任务并执行。下面是改进后的 Feed 添加流程。
后台进程
应用可以通过应用代码根目录下的 Procfile 文件指定运行的后台进程。
Procfile 文件每一行声明一条需要运行的后台进程,格式如下:
name: command
name 为后台进程名, command 为启动后台进程的命令。
下面时一个 Python 应用启动一个后台任务进程的配置信息:
worker: python vendor/rq/cli.py worker
在代码提交后,你可以在『应用/后台进程』页面看到所有后台进程的运行状态,进程刚创建时默认只会运行一个实例,你可以根据需要来增加实例数。
如何实现后台任务
在新浪云上你可以通过 Redis/ 数据库+后台进程+第三方任务队列库 轻松实现后台任务。下表中为一些常见的实现。
语言 | 实现方案 |
---|---|
PHP | 使用 PHP-Resque 实现后台任务 |
Python | 使用 RQ 实现后台任务 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构