转载

如何安全可靠的处理后台任务

在越来越多的应用智能化,很多后台功能不能及时反馈给用户,但是又不影响用户的体验,大量的任务后台化,由服务器处理完之后再反馈给用户。

随着这种功能的广泛应用,任务到底有没有执行成为维护的难题,毕竟很多小公司开发和维护是一体的。

为了解决这种任务式的难题,特借鉴了张宴的架构思想: 轻量级开源简单队列服务 HTTPSQS 1.2 版本发布[原创] [张宴]

在这基础上,思考了几个问题:

1. HTTPSQS未记录任务信息

2. 任务失败后HTTPSQS数据被覆盖丢失

3. 任务处理过程中被中断又没有被catch到异常(导致变成脏任务)

4. 任务被重复put (多次执行,毫无意义)

在这基础上面辅助使用了Mysql+HTTPSQS+Mutex的模式来实现应用的稳定,任务处理并发性。

简单一架构图如下:

如何安全可靠的处理后台任务

Mutex Task :使用redis实现的一种互斥锁,主要功能用于并发、任务重复执行的控制。

流程步骤:

1. 同时在mysql和Httpsqs插入任务,任务的标识为WAIT。

2. 后台SERVICE从HTTPSQS中读取数据

3.Mutex Task任务标识为DOING

4. Mysql Task任务标识为DOING

5. 业务逻辑处理

6. 处理完毕,业务处理失败:Mutex Task为ERROR同时Mysql Task为ERROR。

辅助程序:

1. ERROR Task重新入HTTPSQS,执行以上步骤,根据业务需要控制重试次数,可扩展Mutex Task来实现重试次数

简单二架构图如下:

如何安全可靠的处理后台任务

流程步骤:

1. 在mysql插入任务,任务的标识为WAIT。

2. 辅助程序put任务进入HTTPSQS,Mysql Task标识为READY。

2. 后台SERVICE从HTTPSQS中读取数据

3.Mutex Task任务标识为DOING

4. Mysql Task任务标识为DOING

5. 业务逻辑处理

6. 处理完毕,业务处理失败:Mutex Task为ERROR同时Mysql Task为ERROR。

辅助程序:

1. 辅助程序put任务进入HTTPSQS,Mysql Task标识为READY。

2. ERROR Task更改任务状态ERROR => WAIT,辅助程序自动按照新任务执行。执行以上步骤,根据业务需要控制重试次数,可扩展Mutex Task来实现重试次数。

架构2已应用于正式环境。

正式环境实施有以下状况出现:

1. 任务DOING状态,由于PHP异常机制不是很完善,可以还原当时环境,测试修正。

2. 任务为READY状态,由于Mutex Task的控制,该任务为重复任务,是否继续执行看业务需要。

3. SERVICE无需写成while(true){//doing task} ,可以使用CRON定时+执行次数控制,可以并发,可以防止主程序僵死状态。

特推荐 Mutex Task (源码) :

Cache应用/任务Mutex,用于高并发任务处理经过多个项目使用

特推荐 Abstract Service (源码) :

可私信oShine索取

正文到此结束
Loading...