一个做企业定制的客户抱怨:业务员在系统里下一张单,要等七八秒才转出来,急单的时候特别折磨人。排查发现,下单接口里串着一串活:发短信通知、生成合同PDF、推送数据到ERP,全干完了才告诉用户成功。这些事没一件需要当场做完,后端系统开发里,把它们挪进消息队列就解决了。
哪些活适合丢进队列
判断标准一句话:用户必须立刻知道的,当场做;其余的排队做。下单扣库存、支付校验,这些是主流程,得同步完成;短信通知、PDF生成、积分发放、数据同步、日志整理,这些晚几秒晚几分钟都不影响业务,全都可以异步。把那七八秒拆开算:真正必须同步的只有几百毫秒,剩下的全是让用户白等的部分。
队列怎么选不用纠结
- 小系统、日处理几万条以内,Redis的队列功能就够用,运维成本几乎为零;
- 消息量大、要求可靠投递,上RabbitMQ,成熟稳定,文档齐全;
- 日志收集、大数据流那种吞吐,才轮到Kafka出场,中小企业很少用得着。
选型最大的误区是贪大,一个内部管理系统非要上Kafka加集群,最后没人会运维,出问题干瞪眼。队列是工具,不是勋章。
用队列要直面两个经典问题。一是消息丢了怎么办:短信没发出去客户收不到通知,这是事故。规范做法是失败自动重试几次,重试仍失败的进死信队列,配一条告警让人工介入。二是消息重复了怎么办:网络抖动可能导致同一条消息被消费两次,积分发两遍。办法是消费端做幂等,用业务单号做唯一标记,处理过的直接跳过。这两手都备上,队列才算用得放心。
排队也要有人管
队列不是扔进去就完事。给队列配个监控:积压量超过阈值就告警,否则队列堵了半天没人知道,异步变成了永远不办。另外消费能力要匹配生产速度,大促前预估好峰值,消费者不够就加机器。
顺便说一句,异步化改造的顺序也有讲究:先把耗时的操作计量一遍,把最耗时的几件挪出去,收益最大。有的团队上来就把所有操作都包一层队列,连查询都异步,页面体验反而更怪。后端系统开发的优化要讲次序,先测量、再拆解、最后动手,每一步都有数据支撑。
两条实在建议:验收系统时问一句,下单接口里还挂着哪些同步操作,能不能异步化;已经明显偏慢的系统,让开发方先做一次接口耗时拆解,把不该同步的活挪出去。比格网络接手过不少这种优化,多数系统不用加一台服务器,光调整执行方式就能把体验救回来。