阿里云消息队列 RocketMQ:给商会系统做异步解耦与削峰的一次实践

简介: 本文介绍商会系统通过引入 RocketMQ 实现异步化改造:将耗时、可重试、需延时的任务(如报表导出、批量通知、会费提醒)从同步接口剥离,解耦执行与响应。通过消息队列实现削峰、幂等消费、失败重试与死信处理,显著提升系统稳定性与用户体验。(239字)

商会系统里有几件事做起来别扭:会费到期前要提醒会员,批量通知一次发几百条,报表导出要走几分钟,会员数据还要往另一个系统同步。它们共同的特点是耗时长、用户不需要当场拿到结果,但早期都写在接口里同步跑。

结果是导出报表时接口卡住,通知发一半失败要整批重来,提醒任务靠定时任务扫全表。后来把这些摘出来走消息队列,情况才好转。这篇记录用 RocketMQ 做的改造。

一、哪些该走消息

判断标准简单:用户不需要当场拿到结果的,都可以异步。我们确认要走的有三类。

第一类是耗时长的,比如报表导出、批量导入。接口只负责把任务丢进队列并返回任务号,用户去看进度。

第二类是需要重试的,比如短信和模板消息推送。第三方接口偶尔超时,同步做意味着用户跟着等,异步做可以在消费者里重试。

第三类是需要延时的,比如会费到期前七天提醒。用延时消息比定时扫表准,也不用维护一张待提醒表。

const {
    Producer, Message } = require('ali-ons');
const producer = new Producer(config);
await producer.start();

async function submitExportTask(params) {
   
  const taskId = genId();
  await db.exportTask.create({
    taskId, ...params, status: 'PENDING' });
  await producer.send(new Message(TOPIC_EXPORT, 'export', JSON.stringify({
    taskId, ...params })));
  return taskId; // 接口立刻返回,前端拿 taskId 查进度
}

// 会费到期提醒:用延时消息提前七天投递
async function scheduleFeeRemind(feeId, dueAt) {
   
  const delayMs = dueAt - Date.now() - 7 * 86400 * 1000;
  if (delayMs <= 0) return;
  const msg = new Message(TOPIC_REMIND, 'fee', JSON.stringify({
    feeId }));
  msg.setStartDeliverTime(Date.now() + delayMs);
  await producer.send(msg);
}

二、消费者:幂等和失败处理

消费端容易出问题的地方是重复投递。网络抖动、消费者重启都会造成同一条消息被消费多次,所以消费逻辑必须幂等。

consumer.subscribe(TOPIC_EXPORT, 'export', async (msg) => {
   
  const {
    taskId, ...params } = JSON.parse(msg.body);

  // 幂等:已处理过直接确认
  const t = await db.exportTask.get(taskId);
  if (!t || t.status !== 'PENDING') return 'CONSUME_SUCCESS';

  try {
   
    await db.exportTask.mark(taskId, 'RUNNING');
    const fileUrl = await buildReport(params);
    await db.exportTask.finish(taskId, fileUrl);
    return 'CONSUME_SUCCESS';
  } catch (e) {
   
    await db.exportTask.mark(taskId, 'FAILED');
    return 'RECONSUME_LATER'; // 交给队列重试
  }
});

关键是状态机:任务有 PENDING / RUNNING / FINISHED / FAILED 几个状态,消费前先看状态,不是 PENDING 就直接确认,避免重复执行。失败返回重投,让队列按退避策略重试,次数用完进死信队列。

死信队列一定要配,不然失败的消息会一直重投,堵死消费者。

三、削峰

商会系统的流量极不均匀:年会报名开放那一分钟、会长在群里发了通知之后,请求会瞬间上来,平时又很闲。RocketMQ 在这里当缓冲区——请求先进队列,消费者按能承受的速度处理,超出部分排队,不会把数据库冲垮。

几个配置点:消费者线程数按下游承载能力定,不是越大越好;批量消费对通知类任务有效,一次取一批一起发能减少下游压力;队列数量决定并发上限,按峰值估算。

我们给不同类型分 Topic:导出类一个、通知类一个、同步类一个。这样互相不会被对方的堆积影响,导出任务跑得慢不会拖住通知。

四、踩过的坑

一是消息体不要塞大对象。有人把整个会员列表塞进消息体,结果超过大小限制。消息里只放标识和必要参数,数据让消费者去查。

二是别用消息替代事务。强一致场景还是要用事务消息或者本地消息表,普通消息保证不了。RocketMQ 的事务消息能用,但复杂度会上升,简单的做法反而是本地消息表加定时补偿。

三是消费进度监控要提前做。堆积条数和消费延迟没有监控,等用户反馈就晚了。

四是顺序。顺序消息性能差一些,多数场景不需要。会员状态变更按会员 ID 分区保证局部顺序就够了。

改造之后,导出接口从同步等待变成秒回,通知失败能自动重试,提醒任务也不用再扫全表。

我们这边在跑的商会管理系统叫未来漫城·商会互联平台,会费提醒、批量通知和报表导出都走 RocketMQ,年会报名那类峰值场景靠队列缓冲,数据库不再被打满。

相关文章
|
4天前
|
人工智能 自然语言处理 安全
阿里云AI数智鉴密:AI 生成内容如何拿到一张"防篡改的身份证"
隐形水印 + C2PA签名:让AI生成内容“持证上岗”。
1122 0
|
13天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
3733 4
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
4天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1350 0
|
4天前
|
人工智能 安全 前端开发
刚刚 GPT-6 Astra 发布,全球最强,AGI 时代到来!
OpenAI 正式推出 GPT-6 Astra 模型,带大家看看这次 GPT 有哪些提升,跟 Claude Fable 5.1 有什么差距?AI 编程能力如何?AGI 真的来了么?
611 0
|
10天前
|
人工智能 并行计算 数据可视化
秋叶ComfyUI-AKI最新整合包|完整部署教程+核心指令手册
秋叶ComfyUI-AKI一键整合包,国内适配最优、稳定性最强的商用/学习级版本:全封装虚拟环境、预装90%常用节点、内置绘世启动器与成熟工作流,免配置、零依赖、解压即用,完美兼顾新手入门与专业批量生产需求。(239字)
|
14天前
|
人工智能 Linux iOS开发
Ollama使用教程:Ollama官网下载、Ollama本地部署大模型(2026最新)
Ollama 是一款免费开源的本地大模型运行工具,支持在 Windows/macOS/Linux 上离线运行 Qwen、DeepSeek、Llama 等主流开源模型,数据不出本机、隐私安全。提供 OpenAI 兼容 API,命令行一键拉取/运行/管理模型,无需联网,无调用限制,是开发者与 AI 爱好者部署本地 AI 助手的理想选择。(239 字)