前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式任务调度(01)--分布式锁

分布式任务调度(01)--分布式锁

作者头像
JavaEdge
发布2023-11-08 10:08:10
2380
发布2023-11-08 10:08:10
举报
文章被收录于专栏:JavaEdge

Quartz集群模式可水平扩展,也可分布式调度,但需业务方在数据库中添加对应表,有强侵入性。于是探索分布式锁模式。

1 超时关单

通常做定时任务每2min检查前半小时的订单,将待支付订单列表查出,然后对订单中的商品进行库存的恢复,然后将该订单设置为无效。

Spring Schedule定时任务。

代码语言:javascript
复制
@Scheduled(cron = "0 */2 * * * ? ")
public void doTask() {
   log.info("定时任务启动");
   //执行关闭订单的操作
   orderService.closeExpireUnpayOrders();
   log.info("定时任务结束");
 }

单服务器运行正常,考虑到高可用,业务量激增,架构演进成集群模式,在同一时刻有多个服务执行一个定时任务,可能导致业务紊乱。

2 解决方案

任务执行时,Redis分布式锁:

代码语言:javascript
复制
Explain@Scheduled(cron = "0 */2 * * * ? ")
public void doTask() {
    log.info("定时任务启动");
    String lockName = "closeExpireUnpayOrdersLock";
    RedisLock redisLock = redisClient.getLock(lockName);
    // 加锁,最多等3s,上锁后300s自动解锁
    boolean locked = redisLock.tryLock(3, 300, TimeUnit.SECONDS);
    if(!locked){
        log.info("没有获得分布式锁:{}" , lockName);
        return;
    }
    try{
       //执行关闭订单的操作
       orderService.closeExpireUnpayOrders();
    } finally {
       redisLock.unlock();
    }
    log.info("定时任务结束");
}

Redis读写性能极好,分布式锁也比Quartz数据库行级锁更轻量级。

小型项目定时任务框架(Quartz/Spring Schedule)和 分布式锁(redis/zookeeper)不错。

3 问题

  • 定时任务在分布式场景下有空跑情况,而且任务也无法做到分片
  • 想手工触发任务,须添加额外代码
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 超时关单
  • 2 解决方案
  • 3 问题
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档