后台进程和后台任务
2016-07-16 16:27
253 查看
在构建一个高性能可伸缩的 Web 应用的时候,你可以使用后台任务将一些耗时的操作从 HTTP 请求的处理中分解出来,放到后台进程中去异步执行。大部分的 Web 请求应该在 500ms 内完成,如果你发现你的应用有大于这个甚至有花费一两秒才能完成的请求,那么这个时候你应该考虑使用使用后台任务,将这些耗时的请求放到后台进程中去执行。
比如:发送邮件、读取比较慢的 API 接口、上传数据到云存储中,这些任务都应该放到后台任务中去执行,前端的 Web 进程应该添加完后台任务后立刻回复客户端,然后客户端可以轮询检查更新来确认任务是否已经完成了。
我们以一个 Web RSS 阅读器为例,这类应用都会有一个让用户添加新的 Feed URL 的功能,添加完成后用户会被转到一个显示这个新 Feed 内容的页面。实现以上功能最简单的方法,是在 HTTP 请求中的处理进程中直接读取第三方的 Feed 并返回。但是,读取 RSS Feed 的内容是个很耗时的操作,取决于这个 Feed 的响应速度,慢的话几秒,如果提供 Feed 的服务有问题,甚至可能导致几十秒(取决于设置的超时时间)。这些会导致应用的页面卡死或者请求超过 Web 进程的处理时间上线而被杀死从而导致请求失败,用户体验会非常差。
![](https://images2015.cnblogs.com/blog/617717/201607/617717-20160716162553639-1518908028.png)
解决方法就是使用后台任务,将后台任务放到后台进程中去执行,Web 进程添加完任务后立刻返回。后台进程不处理 HTTP 请求,只是不停的从任务队列里取任务并执行。下面是改进后的 Feed 添加流程。
![](https://images2015.cnblogs.com/blog/617717/201607/617717-20160716162606748-416282897.png)
Procfile 文件每一行声明一条需要运行的后台进程,格式如下:
name 为后台进程名, command 为启动后台进程的命令。
下面时一个 Python 应用启动一个后台任务进程的配置信息:
在代码提交后,你可以在『应用/后台进程』页面看到所有后台进程的运行状态,进程刚创建时默认只会运行一个实例,你可以根据需要来增加实例数。
![](https://images2015.cnblogs.com/blog/617717/201607/617717-20160716162620764-1317936359.png)
比如:发送邮件、读取比较慢的 API 接口、上传数据到云存储中,这些任务都应该放到后台任务中去执行,前端的 Web 进程应该添加完后台任务后立刻回复客户端,然后客户端可以轮询检查更新来确认任务是否已经完成了。
我们以一个 Web RSS 阅读器为例,这类应用都会有一个让用户添加新的 Feed URL 的功能,添加完成后用户会被转到一个显示这个新 Feed 内容的页面。实现以上功能最简单的方法,是在 HTTP 请求中的处理进程中直接读取第三方的 Feed 并返回。但是,读取 RSS Feed 的内容是个很耗时的操作,取决于这个 Feed 的响应速度,慢的话几秒,如果提供 Feed 的服务有问题,甚至可能导致几十秒(取决于设置的超时时间)。这些会导致应用的页面卡死或者请求超过 Web 进程的处理时间上线而被杀死从而导致请求失败,用户体验会非常差。
![](https://images2015.cnblogs.com/blog/617717/201607/617717-20160716162553639-1518908028.png)
解决方法就是使用后台任务,将后台任务放到后台进程中去执行,Web 进程添加完任务后立刻返回。后台进程不处理 HTTP 请求,只是不停的从任务队列里取任务并执行。下面是改进后的 Feed 添加流程。
![](https://images2015.cnblogs.com/blog/617717/201607/617717-20160716162606748-416282897.png)
后台进程
应用可以通过应用代码根目录下的 Procfile 文件指定运行的后台进程。Procfile 文件每一行声明一条需要运行的后台进程,格式如下:
name: command
name 为后台进程名, command 为启动后台进程的命令。
下面时一个 Python 应用启动一个后台任务进程的配置信息:
worker: python vendor/rq/cli.py worker
在代码提交后,你可以在『应用/后台进程』页面看到所有后台进程的运行状态,进程刚创建时默认只会运行一个实例,你可以根据需要来增加实例数。
![](https://images2015.cnblogs.com/blog/617717/201607/617717-20160716162620764-1317936359.png)
如何实现后台任务
在新浪云上你可以通过 Redis/ 数据库+后台进程+第三方任务队列库 轻松实现后台任务。下表中为一些常见的实现。语言 | 实现方案 |
---|---|
PHP | 使用 PHP-Resque 实现后台任务 |
Python | 使用 RQ 实现后台任务 |
相关文章推荐
- FXAA
- session如何加入mysql库
- 设计模式之装饰模式
- 前端开发人员必须了解的七大技能图谱
- Android 微博分享及其注意事项
- WebViewClient与常用事件监听
- Maven项目:Malformed POM expected START_TAG or END_TAG ........
- First Missing Positive
- thinkphp的model三大自动功能
- hdu 2844 coins DP多重背包
- 用正则表达式检验输入框内容是否合法
- Android知识结构树
- 我一定要努力幸福
- poj3090欧拉函数求和
- APP开发实战86-View动画
- java之单例模式
- 菜鸟浅谈C、C++
- Java ArrayList学习
- C#画图解决闪烁问题
- AC自动机