延迟任务通知服务的开发设计

一、背景需求

作为平台的基础服务之一,延迟任务都是必不可少的,它的作用主要是延迟,解决我们常遇到的订单定时关闭,自动上下架等业务需求。

由业务方来调用延迟任务通知服务,可以新增、编辑或删除任务,由延迟任务通知服务返回任务ID。业务方可以主动查询任务的状态,是调度成功还是失败。

二、目标

  • 1、支持任务的持久化
  • 2、支持任务的失败重试
  • 3、延迟回调的及时性,最大延迟不超过1秒
  • 4、具备监控告警,能直观看出每个任务的执行情况,对回调异常的数据进行告警
  • 5、不同的回调地址之间的任务执行互不影响,采用多个线程池隔离。

三、术语

1、任务

业务方需要在指定时间点,回调的接口及参数,被当做任务存储起来。类似于一个Postman的机器人,你事先告知它,你要在什么时间调用哪个接口,入参是什么。

  • 一般是mysql/mongodb等数据库

2、冷缓存区

将回调时间是在当天的任务,抽离至某个存储区域,我们把这个区域,叫做冷缓存区。这个区域的要求是减少数据量,从而加速筛选出热数据的时间。与之相对的是热缓存区。见下。

我们会在每天的0点0时0分,把当天的任务放入冷缓存区。

  • 可以是mysql/mongodb等数据库,也可以是redis内存数据库

3、热缓存区

热与冷相比较而言,是指回调时间将在最近N分钟后。我们把这样的数据从冷数据区抽离至热数据区。热数据的要求是遍历要快,除了数据量少之外,最好还是内存这样的介质,减少IO次数。

  • 内存,至少是redis分布式的内存数据库,最好是JVM内存。
  • 如果是JVM内存,需要面临并发重复执行的问题,怎么协调各个节点上的任务执行。好处是循环遍历,压力比redis要小得多。
  • 如果是redis,由于是分布式的,不用考虑各节点之间的协调问题了,但是可能因为数据量大而导致大key,每N秒拉取一次的频率,还是会产生N秒的延迟。

四、数据的流转图

image.png

下面是以新增任务为示例的一个流程:


image.png

五、任务的状态机

image.png

六、数模设计

image.png
  • “任务表”只有在任务执行成功的时候,才会归档至“任务归档表”
  • 冷数据缓存区的有效期一般为24小时
  • 热数据缓存区,每次拿取的任务如果是到了调度时间,那么就删除该任务。至于执行失败的任务,则会进入到下一次的重试流程。

七、主流程图

image.png
  • 1、热数据缓存区,使用jvm内存存储,开启一个线程,循环读取待执行的任务列表。
  • 2、需要考虑分布式环境下,多个节点之间的并发问题。这里我们采用的redis分布式锁,竞争锁失败的时候,采取快速失败的机制,不进行重试,既忽略执行。(说明其他节点已获取锁,已经在执行中)
  • 3、在加入到线程池前,以及执行任务前,都要判断任务的状态是否已删除或已完成,忽略掉无需执行的任务。
  • 4、为了并发执行任务,这里针对不同的Url地址,转入到不同的线程池。通过线程池隔离,做到不同的业务之间互不影响。
  • 5、任务执行失败时,重试次数+1,并计算下次重试时间,建议这个重试时间是指数级的。然后更新任务的重试次数和下次重试时间。

八、接口设计

1、新增任务

支持批量新增,List<TaskDTO>

[
    {
        "content":"",
        "notifyUrl":"",
        "notifyTime":"",
    }
]

返回任务ID给业务方

1003

2、编辑任务

支持批量编辑,必须传入taskId。后面的删除和查询也一样。

[
    {
        "content":"",
        "notifyUrl":"",
        "notifyTime":"",
        "taskId":""
    }
]

返回成功还是失败

3、删除任务

传入多个任务ID,List<String> taskIds

["1003","2003"]

返回成功还是失败

4、查询任务

传入多个任务ID,List<String> taskIds

["1003","2003"]

返回任务的详情

[
    {
        "content":"",
        "notifyUrl":"",
        "notifyTime":"",
        "taskId":"1003"
    },
    {
        "content":"",
        "notifyUrl":"",
        "notifyTime":"",
        "taskId":"2003"
    }
]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容