高性能架构设计-分布式定时任务

前言背景

在分布式架构中涉及到定时任务总是让人感觉到头疼,为了应对不断增长的定时任务数量,需要横向扩展节点线性的提升任务处理数量。本章节简要概述两种设计方案。一切只为高性能!

一、数据结构设计

数据存在redis当中(设计方案不同redis版本不同),数据结构采用有序集合,score存放任务执行的时间戳,value存放将要执行的任务的taskId,排序按照score升序排序。

高性能架构设计-分布式定时任务_第1张图片
分布式定时任务表结构

二、程序架构设计

1、抢占式

技术组件:redis(版本任意)

设计思想:每个分布式实例均开启一个分布式定时任务的专有线程,方式采用抢占式,先到先得,每秒钟去redis中查询当前时刻以及之前的所有任务(根据score中存放的时间戳字段),查询后删掉防止其他实例获得(此处需要redis事务操作)。

相关redis命令:

watch key

multi

ZRANGEBYSCORE key -inf now()

ZREMRANGEBYSCORE key -inf now()

exec

2、调度式

技术组件:redis5.0(版本至少是5.0,因为5.0版本增加了zpopmin命令)、消息中间件(这里用rocketMQ)

设计思想:抢占式的方案有明显缺点,如果任务集中在某一个时刻过多,有可能该时刻处理不完,所以方案需要优化就有了-调度式。实现一个调度系统专门用来处理任务调度,通过zcount命令查询出当前时间内可用的任务数量,然后除以实例数量,可以计算出每个实例处理多少任务,之后通过mq发送广播,这样每个实例收到广播消息知道对应的处理任务数,之后通过zpopmin命令(5.0版本新增)pop出任务数根据taskId执行即可。

高性能架构设计-分布式定时任务_第2张图片
调度式分布式定时任务架构图

本文章严禁转载!

你可能感兴趣的:(高性能架构设计-分布式定时任务)