MQ生产者同步发送和异步发送消息区别
在处理文件上传和文件分析任务时,为了优化用户体验,系统收到文件分析任务时,先给出反馈,再在后台处理任务,这里就可以引入MQ做异步处理
这个场景引入MQ是为了异步解耦,但是生产者类中发送消息却用了同步发送syncSend()方法(这是rocketmq模版类中的方法)
首先要明确异步解耦指的是什么,这里是两个业务逻辑提交文档和分析任之间的解耦而同步阻塞的是业务逻辑和MQ服务器之间的网络IO
为什么要使用同步阻塞发送而不是异步发送
在该场景下,分析任务属于核心数据流,不能丢失
如何判断成功or失败-> sendResult
syncSend 成功 → 任务确实到达 Broker → 可以落库“已提交”
syncSend 失败 → 抛出异常 → 可以重试或回滚
如果使用异步发送
1.主线程立即返回“成功”并落库,但回调还没执行,若此时服务宕机,消息丢失,数据库却记为“已提交”→ 数据不一致
2.大量未确认请求积压还可能撑爆内存
适用场景对比:
| 适用场景 | 同步发送(syncSend) | 异步发送(asyncSend) |
|---|---|---|
| 适用 | 订单支付、分析任务 、交易流水、获取 MessageId、状态机流转、审批流程 | 用户行为日志、埋点数据、监控指标、审计日志、缓存刷新、实时推荐 |
| 不适用 | 高吞吐大流量、日志埋点、对延迟极度敏感(>5ms) | 核心业务、金融交易、需要精确确认、强状态依赖 |

浙公网安备 33010602011771号