公告定时发送设计

341 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

背景

  • 用户使用公告管理时,发布公告的发布时间设定在某个时间点后,没有在所设定的时间点发布公告,导致用户使用无法正常实现公告的定时发送。
  • 设置每周具体哪一天可以自动通知用户,需要检查所有条件后然后再推送

分析

根据要求,可对任务可分为2种:

  • 延时任务:到一定时间点推送任务后结束
  • 定时任务:每此在设定的时间点时就会触发推送任务

这里推荐使用Quartz.net任务调度框架,理由如下:

  1. Quartz.net是市面上比较成熟的框架

  2. 适用于集群环境

  3. 支持持久化,防止重启服务时任务中断

  4. 高可用,在集群环境中若某台服务器中断而不影响使用

  5. 支持可视化任务管理

方案

总体设计

  • 新建表存储需要推送的消息,服务中启动一个调度任务线程Job,去遍历数据库将未处理的消息遍历,写入mq中;
  • 其中Job工作主要是读取DB中的数据,判断是延时任务还是定时任务。如果是延时任务则写入mq中,并将此任务消息标志未已处理则结束;如果是定时任务则从DB中读取并写入MQ,同时此消息内容重置成下个时间点待执行。
  • 定时任务是在全局配置中设置开启时写入数据库,全局配置设置不开启时,则将此任务状态置为已处理完毕
    大概流程图:

详细设计

表设计
Schema:{
  id      //
  type  //类型
  content  //推送内容
  globalSetting   //全局中配置项
  status //状态0-待执行,1-已执行
  executedIP  //执行ip
  executedTime  //执行时间
}

一个简单定时任务系统基本的设计,功能主要是对任务的定时调度执行。这样就可以完成基本的定时发送任务。