概述
在处理Web客户端发送的命令请求时,某些操作的执行时间可能会比我们预期的更长一些。通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能完成的操作,这种将工作交给任务处理器来执行的做法称为任务队列。
单任务队列
先进先出队列需要用到redis的列表结构。redis的列表结构允许用户通过RPUSH和LPUSH,以及RPOP和LOP,从列表的两端推入和弹出元素。
如下是最简单的单任务队列:
图1 把数据放入队列 图2 把数据从队列取出并处理数据多任务队列
BLPOP命令每次只会从队列里面弹出一包数据,所以待处理的数据不会重复处理。该工作进程要处理的任务是非常单一的。在某些情况下,为每种任务单独使用一个队列的做法并不少见,但是在另外一些情况下,如果一个队列能够处理多种不同类型的任务,那么事情会方便很多。
下面代码中展示的工作进程会监事用户提供的多个队列,并从多个已知的已注册回调函数里面,选出一个函数来处理json编码的函数调用。队列中每个待执行任务的格式都为['FUNCTION_NAME',[ARG1,ARG2,...]]。
图3 多任务队列任务优先级
在使用队列的时候,程序可能会需要让特定的操作优先于其他操作执行。假设现在我们需要为任务设置高、中、低3种优先级别,其中:高优先级任务在出现之后会第一时间被执行,而中等;优先级任务则会在没有任何高优先级任务存在的情况下被执行,而低优先级任务则会在既没有高优先级任务,又没有任何中等优先级任务的情况下被执行。实际上我们只需要修改worker_watch_queue()函数的两行代码,就可以给任务队列加上优先级特性。
图4 任务优先级同时使用多个队列可以降低实现优先级特性的难度。除此之外,多队列有时候也会被用于分隔不同的任务,在这种情况下,处理不同队列时可能会出现不公平的现象。为此,我们可以偶尔重新排列各个队列的顺序呢,使得针对队列的处理操作变得更公平一些——当某个队列的增长速度比其他队列的增长速度快的时候,这种重排操作尤为重要。
网友评论