发明内容
有鉴于此,本发明提供一种处理异步任务的方法和系统,有助于克服现有技术中的上述种种不足。
为实现上述目的,根据本发明的一个方面,提供了一种处理异步任务的方法。
本发明的处理异步任务的方法包括:网关将接收到的任务数据插入Redis中的任务数据队列;异步任务处理程序从所述任务数据队列中获取任务数据,然后根据获取的任务数据执行任务。
可选地,所述将接收到的任务数据插入Redis中的任务数据队列的步骤包括:对任务数据字符串取一致性哈希值,对该哈希值按照任务数据队列的数目取模,将任务数据插入序号为该模的任务数据队列;所述根据获取的任务数据执行任务的步骤包括:从任务数据队列中取出预设数目条任务数据并进行去重处理,根据剩余的任务数据执行任务,在执行各件任务时,先将任务数据字符串的一致性哈希值作为键名保存到所述Redis中,在保存成功的情况下执行该任务然后删除作为键名的该一致性哈希值,在保存不成功的情况下放弃执行该任务。
可选地,在所述保存成功的情况下,还包括:所述异步任务处理程序向Redis提供过期时间,从所述保存完成时起经过该过期时间后,Redis删除作为键名的所述一致性哈希值。
可选地,所述异步任务处理程序从所述Redis中的队列中获取任务数据之前,还包括:所述异步任务处理程序判断所述Redis中的任务数据队列的数目是否超出预设阈值;若是,则进行所述根据获取的任务数据执行任务的步骤,否则不进行该步骤,而是将获取任务数据保存到数据库内,然后启动基于该数据库的处理程序。
根据本发明的另一方面,提供了一种处理异步任务的系统。
本发明的处理异步任务的系统包括:网关装置,用于将接收到的任务数据插入Redis中的任务数据队列;异步任务处理装置,用于从所述任务数据队列中获取任务数据,然后根据获取的任务数据执行任务。
可选地,所述网关装置还用于:对任务数据字符串取一致性哈希值,对该哈希值按照任务数据队列的数目取模,将任务数据插入序号为该模的任务数据队列;所述异步任务处理装置还用于:从任务数据队列中取出预设数目条任务数据并进行去重处理,根据剩余的任务数据执行任务,在执行各件任务时,先将任务数据字符串的一致性哈希值作为键名保存到所述Redis中,在保存成功的情况下执行该任务然后删除作为键名的该一致性哈希值,在保存不成功的情况下放弃执行该任务。
可选地,所述异步任务处理装置还用于:向Redis提供过期时间,以供所述Redis从所述保存完成时起经过该过期时间后,删除作为键名的所述一致性哈希值。
可选地,所述异步任务处理装置还用于:判断所述Redis中的任务数据队列的数目是否超出预设阈值;若是,则根据获取的任务数据执行任务,否则将获取任务数据保存到数据库内,然后启动基于该数据库的处理程序。
根据本发明的技术方案,采用Redis作为任务数据的首选存储,利用Redis本身支持队列(List)数据类型的特点,将异步任务数据存入Redis队列并由异步任务处理程序(worker)处理,不需要操作系统对应的数据库(Oracle,MySQl等),有助于降低数据库的连接数,并减轻其压力,增加其可靠性,并且提高异步任务的处理效率。另外实现了任务数据去重,也就是将任务数据字符串的一致性哈希值在任务执行前作为键名保存到Redis中,执行任务之后再删除该哈希值的处理,如果键名设置失败,就表明有相同的任务在执行,从而放弃该任务,保证了任务不被重复执行。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是根据本发明实施例的处理异步任务的方法的基本步骤的示意图。如图1所示,该方法主要包括步骤S11和步骤S12。
步骤S11:网关将接收到的任务数据插入Redis中的任务数据队列。这里的任务数据插入是根据一定的算法进行,将在下文中具体说明。
步骤S12:异步任务处理程序从Redis中的任务数据队列中获取任务数据,然后根据获取的任务数据执行任务。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了主从(master-slave)同步。
在图1所示的流程中采用了Redis存储任务数据,利用Redis支持队列(List)数据类型的特点,将异步任务数据存入Redis队列并由异步任务处理程序(worker)处理,不需要操作系统对应的数据库(通常采用Oracle,MySQL等),有助于降低数据库的连接数,并减轻其压力,增加其可靠性,并且提高异步任务的处理效率。以下对本实施例的技术方案的细节举例说明。
在worker启动时,从管理员提供的worker配置表中获取任务名称和队列数,并将配置表更新到Redis中;PDA网关启动后从Redis读取配置表,收到任务数据后进行任务数据的队列分配,即步骤S11。此时如果PDA网关从Redis读取配置表失败,则将处理模式切换到基于数据库任务表模式,以保证系统高可用。
在Redis中,任务队列的名称为“任务名称+队列编号”的形式,以保证队列名称的唯一性。PDA网关收到任务数据后是优先插入Redis队列,若Redis出现故障则PDA网关仍将任务数据插入系统对应的数据库任务表并切换处理模式。
PDA网关在将数据插入Redis队列时,首先对任务数据字符串取一致性哈希值,然后对该哈希值按照任务数据队列的数目取模,再将任务数据插入序号为该模的任务数据队列,例如取模结果是k,则将任务数据放入第k个任务数据队列,以保证相同的任务不被分别放入不同的队列。worker在根据获取的任务数据执行任务时,先任务数据队列中取出预设数目条任务数据并进行去重处理,例如利用Redis的Set集合进行去重,或采用其他的去重算法,然后根据去重之后剩余的任务数据执行任务。在执行任务时,先将任务数据字符串的一致性哈希值作为键名保存到Redis中,在保存成功的情况下执行该任务然后删除作为键名的该一致性哈希值,在保存不成功的情况下放弃执行该任务,因为保存不成功表示该任务正在被执行。这种措施保证了任务不被重复执行。
worker在上述的将任务数据字符串的一致性哈希值作为键名保存到Redis中之后,同时设置一个过期时间(该过期时间由管理员在编写worker时设置),从该保存完成时起经过该过期时间后,由于Redis本身特性,Redis会自动删除作为键名的上述一致性哈希值,这样就可以将该任务释放以供其他worker执行,从而避免了在worker出现故障的情况下其即将执行的任务一直得不到执行。
本实施例中,各个任务队列的长度预先设定,在PDA网关不断地将任务数据插入Redis的过程中,对任务队列的长度进行监控,超出预设的长度则报警。同时对Redis的异常进行报警。在PDA网关将任务数据插入Redis之前,可以先读取一个Redis开关变量,如果该开关变量由于Redis故障或者管理员的设置,其状态为关闭,则将任务数据插入系统对应的数据库(Oracle,MySQL等)任务表。
worker在从Redis中获取任务数据之前,可以先判断Redis数据库中的任务数据队列的数目是否超出预设阈值;若是,则根据获取的任务数据执行任务,否则不进行该步骤,而是将获取任务数据保存到系统对应的数据库(Oracle,MySQL等)内任务表,然后启动基于该数据库任务表的处理程序,这样使得基于Redis的worker和基于数据库的worker同时进行异步任务处理,从而提高了整个系统对异步任务的处理能力。
在布署Redis服务集群时可以采用主从切换的方式,并利用客户端进行负载均衡。在任务处理过程中可以将Redis中的数据持久化到磁盘中,这样可以进行灾难恢复。
图2是根据本发明实施例的处理异步任务的系统的基本结构的示意图。如图2所示,发明实施例的处理异步任务的系统20主要包括网关装置21和异步任务处理装置22。
网关装置21用于将接收到的任务数据插入Redis中的任务数据队列;异步任务处理装置22用于从所述任务数据队列中获取任务数据,然后根据获取的任务数据执行任务。
网关装置21还可用于:对任务数据字符串取一致性哈希值,对该哈希值按照任务数据队列的数目取模,将任务数据插入序号为该模的任务数据队列;这样,异步任务处理装置22还可用于:从任务数据队列中取出预设数目条任务数据并进行去重处理,根据剩余的任务数据执行任务,在执行各件任务时,先将任务数据字符串的一致性哈希值作为键名保存到所述Redis中,在保存成功的情况下执行该任务然后删除作为键名的该一致性哈希值,在保存不成功的情况下放弃执行该任务。
异步任务处理装置22还可用于向Redis提供过期时间,以供Redis从所述保存完成时起经过该过期时间后,删除作为键名的所述一致性哈希值。
所述异步任务处理装置还可用于从所述Redis中的任务数据队列中获取任务数据之前,判断该任务数据队列中任务的数目是否超出预设阈值;若是,则根据获取的任务数据执行任务,否则将获取任务数据保存到数据库内,然后启动基于该数据库的处理程序。
根据本发明实施例的技术方案,采用Redis作为任务数据的存储,利用Redis本身支持队列(List)数据类型的特点,将异步任务数据存入Redis队列并由worker处理,不需要操作系统对应的数据库(Oracle,MySQL等),有助于降低系统对应的数据库的连接数,并减轻其压力,增加其可靠性,并且提高异步任务的处理效率。另外采用任务数据去重以及将任务数据字符串的一致性哈希值在任务执行前作为键名保存到Redis中,执行任务之后再删除该哈希值的处理,如果键名设置失败,就表明有相同的任务在执行,从而放弃该任务,保证了任务不被重复执行。另外本实施例中的系统监控以及系统容灾等措施都有助于提高系统的可靠性。
以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本发明的方法和设备的全部或者任何步骤或者部件,可以在任何计算装置(包括处理器、存储介质等)或者计算装置的网络中,以硬件、固件、软件或者它们的组合加以实现,这是本领域普通技术人员在阅读了本发明的说明的情况下运用他们的基本编程技能就能实现的。
因此,本发明的目的还可以通过在任何计算装置上运行一个程序或者一组程序来实现。所述计算装置可以是公知的通用装置。因此,本发明的目的也可以仅仅通过提供包含实现所述方法或者装置的程序代码的程序产品来实现。也就是说,这样的程序产品也构成本发明,并且存储有这样的程序产品的存储介质也构成本发明。显然,所述存储介质可以是任何公知的存储介质或者将来开发出的任何存储介质。
还需要指出的是,在本发明的装置和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本发明的等效方案。并且,执行上述系列处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序执行。某些步骤可以并行或彼此独立地执行。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。