场景介绍
今天的业务中遇到了这样一个场景:
- 某些类型的任务由专门的服务负责执行,且执行时间相对较长,因此需要对这些任务进行排队逐一处理。
- 此外,由于同种类型的两个任务之间可能需要按照先后顺序执行,因此还需要防止在集群环境下同一类型的多个任务出现并发执行的情况。
下面介绍我通过Redis解决上述两个问题的思路。
使用Redis实现任务队列
假设服务A为任务执行的调度方,服务B为任务的执行方,由服务A指定服务B需要执行哪些任务;当服务B集群中的机器全部都在执行任务时,后续来的任务需要在队列中按先后顺序进行排队,如图所示。
下面介绍Redis的两个命令:
- LPush :Redis LPush 命令将一个或多个值插入到列表头部。如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
- BRPop :Redis BRPop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
借助 Redis 的 List ,我们可以实现一个任务队列,由服务A执行入队操作ÿ