请说明在 Apache RocketMQ 中实现消息同步发送和异步发送的具体方式,并比较两者的特点。
考察说明
考查对 RocketMQ 消息发送模式的理解及应用能力。
回答思路
- 【回答框架 1】同步发送是调用 producer.send(msg) 方法,发送线程会阻塞等待 Broker 返回发送结果,包括 SendResult 或异常。优点是可靠性高,能立即确认发送成功与否,适合对结果敏感的场景;缺点是发送延迟受网络和 Broker 处理速度影响,吞吐量相对较低。
- 【回答框架 2】异步发送是调用 producer.send(msg, SendCallback) 方法,发送后不等待结果,由 Callback 回调处理成功或失败。异步发送需要实现 SendCallback 接口,在 onSuccess 和 onException 中处理结果,适合高吞吐量且允许一定延迟的场景,但需要正确处理回调线程和发送线程之间的并发问题。
- 【回答框架 3】RocketMQ 还提供单向发送(sendOneway),只发送不等待结果,可靠性更低,适合日志采集等对消息丢失不敏感的场景。实际选择时,应结合业务对可靠性和吞吐量的需求,若要求高可靠且可接受同步开销,则用同步发送;若追求吞吐并允许稍后处理结果,则用异步发送。
- 【关键点 1】同步发送通过 send(msg) 调用,同步等待返回结果。
- 【关键点 2】异步发送通过 send(msg, callback) 调用,结果在回调中处理。
- 【关键点 3】同步发送可靠性高但吞吐低,异步发送吞吐高但需处理回调。
- 【易错点 1】异步发送中回调线程并非生产者主线程,要注意线程安全。
- 【易错点 2】同步发送可能因网络或 Broker 超时抛异常,应捕获并处理。