定时任务

定时任务:
需求描述:在现有的实时通知功能的基础上添加功能,能够定时发送通知

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

解决方案: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值