news 2026/4/17 16:55:34

查券返利机器人的异步任务调度:Java XXL-Job+Redis实现海量查券请求的分布式任务分发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
查券返利机器人的异步任务调度:Java XXL-Job+Redis实现海量查券请求的分布式任务分发

查券返利机器人的异步任务调度:Java XXL-Job+Redis实现海量查券请求的分布式任务分发

大家好,我是 微赚淘客系统3.0 的研发者省赚客!

在高并发场景下,用户通过查券返利机器人发起的优惠券查询请求可能瞬时达到数十万量级。为避免直接冲击核心接口并保障系统稳定性,我们采用“请求入队 + 异步消费”模式,基于 XXL-JOB 作为分布式调度中心,结合 Redis Stream 实现任务的可靠分发与削峰填谷。

整体架构设计

用户请求首先写入 Redis Stream,由多个消费者实例监听流数据;XXL-JOB 定时触发任务拉取器,动态调整消费速率,并支持失败重试、积压告警与人工干预。该方案解耦了请求入口与处理逻辑,提升系统弹性。

Redis Stream 任务队列定义

每个查券请求封装为一个结构化消息,写入名为coupon:query:stream的 Stream:

packagejuwatech.cn.task.model;publicclassCouponQueryTask{privateStringtaskId;// 全局唯一IDprivateStringuserId;// 用户IDprivateStringitemId;// 商品IDprivatelongtimestamp;// 请求时间戳privateintretryCount;// 重试次数// getters and setterspublicStringgetTaskId(){returntaskId;}publicvoidsetTaskId(StringtaskId){this.taskId=taskId;}publicStringgetUserId(){returnuserId;}publicvoidsetUserId(StringuserId){this.userId=userId;}publicStringgetItemId(){returnitemId;}publicvoidsetItemId(StringitemId){this.itemId=itemId;}publiclonggetTimestamp(){returntimestamp;}publicvoidsetTimestamp(longtimestamp){this.timestamp=timestamp;}publicintgetRetryCount(){returnretryCount;}publicvoidsetRetryCount(intretryCount){this.retryCount=retryCount;}}

生产者将任务推入 Redis:

packagejuwatech.cn.task.producer;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.data.redis.connection.stream.StreamRecords;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjava.util.HashMap;importjava.util.Map;@ComponentpublicclassCouponTaskProducer{privatefinalRedisTemplate<String,Object>redisTemplate;privatefinalObjectMapperobjectMapper=newObjectMapper();publicCouponTaskProducer(RedisTemplate<String,Object>redisTemplate){this.redisTemplate=redisTemplate;}publicvoidsubmitTask(juwatech.cn.task.model.CouponQueryTasktask)throwsException{Map<String,String>payload=newHashMap<>();payload.put("task",objectMapper.writeValueAsString(task));redisTemplate.opsForStream().add(StreamRecords.newRecord().ofObject(payload).withStreamKey("coupon:query:stream"));}}

XXL-JOB 调度任务配置

在 XXL-JOB 控制台注册执行器juwatech-coupon-job,并创建任务coupon-query-consumer,Cron 表达式设为0/5 * * * * ?(每5秒触发一次)。

对应的 JobHandler 实现如下:

packagejuwatech.cn.job;importcom.xxl.job.core.context.XxlJobHelper;importcom.xxl.job.core.handler.annotation.XxlJob;importorg.springframework.stereotype.Component;@ComponentpublicclassCouponQueryConsumerJob{privatefinaljuwatech.cn.task.consumer.CouponTaskConsumerconsumer;publicCouponQueryConsumerJob(juwatech.cn.task.consumer.CouponTaskConsumerconsumer){this.consumer=consumer;}@XxlJob("couponQueryConsumer")publicvoidexecute(){try{intconsumed=consumer.consumeBatch(100);// 每次最多消费100条XxlJobHelper.handleSuccess("Consumed "+consumed+" tasks");}catch(Exceptione){XxlJobHelper.handleFail(e.getMessage());}}}

Redis Stream 消费逻辑

消费者从 Stream 读取待处理任务,并调用查券服务:

packagejuwatech.cn.task.consumer;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.data.redis.connection.stream.*;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Service;importjava.time.Duration;importjava.util.Collections;importjava.util.List;importjava.util.Map;@ServicepublicclassCouponTaskConsumer{privatefinalRedisTemplate<String,Object>redisTemplate;privatefinaljuwatech.cn.service.CouponQueryServicecouponQueryService;privatefinalObjectMapperobjectMapper=newObjectMapper();publicCouponTaskConsumer(RedisTemplate<String,Object>redisTemplate,juwatech.cn.service.CouponQueryServicecouponQueryService){this.redisTemplate=redisTemplate;this.couponQueryService=couponQueryService;}publicintconsumeBatch(intbatchSize)throwsException{StreamReadOptionsoptions=StreamReadOptions.empty().count(batchSize).block(Duration.ofSeconds(2));// 阻塞等待新消息List<MapRecord<String,Object,Object>>records=redisTemplate.opsForStream().read(options,StreamOffset.create("coupon:query:stream",ReadOffset.lastConsumed()));if(records==null||records.isEmpty()){return0;}for(MapRecord<String,Object,Object>record:records){try{Map<Object,Object>value=record.getValue();StringtaskJson=(String)value.get("task");juwatech.cn.task.model.CouponQueryTasktask=objectMapper.readValue(taskJson,juwatech.cn.task.model.CouponQueryTask.class);// 执行查券couponQueryService.queryAndNotify(task.getUserId(),task.getItemId());// 确认消费(删除消息)redisTemplate.opsForStream().acknowledge("coupon:query:stream","coupon-group",record.getId());}catch(Exceptione){handleConsumeFailure(record,e);}}returnrecords.size();}privatevoidhandleConsumeFailure(MapRecord<String,Object,Object>record,Exceptione){// 可选:将失败任务写入重试队列或 DLQjuwatech.cn.util.AsyncLogger.logAsync("Failed to process task "+record.getId()+": "+e.getMessage());}}

消费者组与消息可靠性

初始化消费者组以支持多实例并行消费:

XGROUP CREATE coupon:query:stream coupon-group $ MKSTREAM

在应用启动时自动创建(可选):

packagejuwatech.cn.config;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;@ComponentpublicclassRedisStreamInit{privatefinalRedisTemplate<String,String>redisTemplate;publicRedisStreamInit(RedisTemplate<String,String>redisTemplate){this.redisTemplate=redisTemplate;}@PostConstructpublicvoidinitConsumerGroup(){try{redisTemplate.execute((connection)->{connection.streamCommands().xGroupCreate("coupon:query:stream".getBytes(),"coupon-group".getBytes(),org.springframework.data.redis.connection.stream.ReadOffset.from("0-0").getOffset().getBytes(),true);returnnull;});}catch(Exceptionignored){// Group already exists}}}

积压监控与弹性扩缩容

通过 Redis 命令XINFO GROUPS coupon:query:stream获取 pending 消息数,在 XXL-JOB 中上报指标,结合 Prometheus + Alertmanager 实现积压告警。当 pending > 10000 时,自动扩容消费者实例。

本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:50:46

亚马逊云科技获评弗若斯特沙利文《2025年在华外商企业云计算采用研究报告》领导者,四大优势赋能企业在华数智化转型升级

近期&#xff0c;弗若斯特沙利文&#xff08;Frost & Sullivan&#xff09;联合头豹研究院发布了《2025年在华外商企业云计算服务采用研究报告》&#xff0c;亚马逊云科技凭借其全球标准一致的技术、领先的安全合规能力和深厚的本地化运营经验等综合实力&#xff0c;在核心…

作者头像 李华
网站建设 2026/4/18 10:07:51

计算机毕业设计|基于springboot + vue仓库智能管理系统(源码+数据库+文档)

仓库智能管理 目录 基于springboot vue仓库智能管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue仓库智能管理系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/4/18 11:04:48

主流激光设备技术路线与应用成效对比分析

在激光加工这个领域当中&#xff0c;设备性能以及工艺稳定性&#xff0c;直接就决定了制造企业的生产效率&#xff0c;还有产品质量。当下市场上面&#xff0c;活跃着好多家具备深厚技术积淀的激光设备制造商&#xff0c;它们在不一样的应用领域&#xff0c;展现出各自的优势。…

作者头像 李华
网站建设 2026/4/18 8:30:00

自定义事件系统:$emit、$on、$off 的深度解析与实践应用

自定义事件系统&#xff1a; e m i t 、 emit、 emit、on、$off 的深度解析与实践应用 在前端开发中&#xff0c;组件化架构已成为构建复杂应用的核心范式。然而&#xff0c;组件间的通信问题始终是架构设计的关键挑战。传统的父子组件通信通过props和回调函数实现&#xff0c…

作者头像 李华
网站建设 2026/4/18 7:53:53

IE浏览器未过时,https://iebrowser-cn.com一键获取适配

虽微软已终止IE浏览器技术支持&#xff0c;但它在特定场景中仍不可替代。诸多企业内部系统、政府平台及老旧网站依赖IE专属兼容性设计与控件&#xff0c;无法在现代浏览器运行&#xff0c;是这类场景的办公办事必备工具。 当前用户难在电脑中找到IE&#xff0c;微软为推广Edge…

作者头像 李华
网站建设 2026/4/18 7:04:07

港科校友|廖家俊:全球科技探索之旅

从科大博士到卡塔尔科技园掌舵人廖家俊博士的职业生涯堪称非凡。作为卡塔尔科技园&#xff08;QSTP&#xff09;的总裁&#xff0c;他横跨创业与学术两界。兼任科大电子与计算机工程学系兼职教授及荣誉研究员&#xff0c;同时还在香港交易所&#xff08;HKEX&#xff09;和香港…

作者头像 李华