大促期间数据库cpu占用和并发量非常高

博客内容讲述了在运维中遇到数据库CPU和并发量异常升高问题,原因是20台服务器每20秒同时执行一个定时任务查询数据库。为解决此问题,提出了将@schedule单机定时任务转换为ElasticJob分布式定时任务的方案,并通过Redis广播消息同步内存缓存,确保所有节点数据一致。此外,还强调了启动时的初始化方法以避免数据空白期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题复现:

运维部分反馈数据库cpu占用和并发量非常高,看监控平台分析,cpu和并发规律是每隔20秒钟就升到极高,

分析:

初步判断是由于活动模块里面的优惠券模块里面的一个每隔20秒钟的定时任务查库造成的,每隔20秒钟这个定时任务会查库并将数据存到本地内存缓存,大促期间服务器节点在20台左右,这个定时任务用的是@schedule 单机的定时任务,相当于每隔20秒钟,20台机器同时查询。

解决方案:

1.将原来的@schedule 单机的定时任务改为ElasticJob分布式定时任务,这样只有1台机器查库,那怎么保证其他19台节点的内存缓存也能更新到数据呢?在定时任务内部,将数据查询先放到redis里面,然后发送一个广播消息(redis实现/mq实现),其余19个节点来消费,读取redis里面的数据,更新到本地缓存

2.注意启动的时候,加一个init方法,保证定时任务启动的20秒钟没有数据空白期

@Slf4j
@ElasticJob(cron = "0/10 * * * * ?", name = "", description = "优惠券商品同步缓存", eventTraceEnable = false)
public class SyncCouponCommodityCacheTask implements SimpleJob {

    @Autowired
    private CommodityCouponsCacheService cacheService;

    @Autowired
    private MessageService messageService;

    @Override
    public void execute(ShardingContext shardingContext) {
        log.info("SyncCouponCommodityCacheTask 开始");

        //同步redis缓存
        boolean result = cacheService.loadRedisCache(false);
        if (!result) {
            log.error("SyncCouponCommodityCacheTask 同步redis缓存失败");
            return;
        }

        //发送广播消息同步内存缓存
        messageService.publish(ModuleConsts.CHD_P_ACTIVITY_CACHE_REFRESH_CHANNEL,
                PlatformMessage.of(ActivityCacheRefreshMessageConsumer.MessageType.优惠券.getType()));

        log.info("SyncCouponCommodityCacheTask 结束");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值