关闭

定时任务

标签: 需求redis
204人阅读 评论(0) 收藏 举报
定时任务:
需求描述:在现有的实时通知功能的基础上添加功能,能够定时发送通知

需求背景:由于在系统中存在正常逻辑的发送通知的接口,并在调用发送通知的接口时会同时调用其他服务的实时接口,所以为了避免其他服务为了这个需求增加工作量,所以在发送任务的入口做判断,进行定时任务的逻辑

解决方案:1.接受客户端发过来的请求和头信息,判断是否为定时通知的请求,并将头信息和请求包专为二进制保存至redis中;

                     问题:在保存二进制的过程中,存在两个问题:

                             a是不能直接将信息保存至redis,因为redis遇到/0操作符时会理解为回车

                             b调用string2bin的接口时,由于该接口是宏定义,所以在编译时直接分配地址,所以在传参的时候必须传一个变量,二不能直接传一个零时变量的地址进去,在宏里面调用结束,进入下一层时,零时变量会析构,所以一旦内存被其他变量占用,那么就会出现问题;


                  2.解析请求包中的发送时间,并根据时间信息(精确到分钟)保存在缓存中,如201605301200代表2016年5月30日12点00分,该字段的member为待发送任务的零时Id;


                  3.新开一个线程,按照10秒中一次(时间根据实际情况定)的规则,在缓存中查找当前时间的字段,如果没有,continue,如果有,就依次将id取出来,并根据id在缓存中取出请求包和头信息,并保存至零时变量中;


                  4.修改请求包中的发送时间(为正常逻辑的时间),在新开的线程中调用正常逻辑,并将请求包和头信息传入;


                  5.发送成功之后,删除收件箱中的id以及id关联的相关信息(如果任务已被删除,在时间队列中扫描到该id,判断id找不到关联信息而跳过);

改进方案:经测试,上诉方案能支持一分钟一台服务器千条级别的任务同时发送,当任务数量剧增时,可用一下方案改进;
                 在上诉方案中增加一个发送任务的线程,具体实现为:从时间队列中取出id之后判断id的合法性,如果id合法,那么将id扔到消息队列中,时间队列本身不用关心任务的发送情况,任务的发送在专门处理发送的消息队列中处理
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1904次
    • 积分:115
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类