返回
RocketMQ-Producer 发送方式
后端
2023-12-05 15:50:08
RocketMQ-Producer 发送方式
RocketMQ 提供三种方式来发送消息:同步(Sync)发送、异步(Async)发送和单向(Oneway)发送。每种发送方式各有优缺点,适用于不同的应用场景。
同步发送
同步发送是指消息发送者在发送消息后会阻塞等待消息发送结果。如果发送成功,则返回一个成功消息;如果发送失败,则抛出异常。
原理:
在发送消息后,发送者线程将被阻塞,等待消息发送结果。当消息成功发送到 RocketMQ 后,服务端会返回一个 ACK 信号。收到 ACK 信号后,发送者线程才会解除阻塞,继续执行后续操作。
应用场景:
- 重要的消息,需要保证发送成功,如订单确认消息、支付成功消息等。
- 发送消息后需要立即进行后续操作,如发送消息后需要更新数据库等。
代码示例:
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
SendResult result = producer.send(msg);
System.out.println("发送结果:" + result);
异步发送
异步发送是指消息发送者在发送消息后不会阻塞等待消息发送结果。消息发送结果将通过回调函数通知发送者。
原理:
在发送消息后,发送者线程不会被阻塞。服务端收到消息后,会将消息发送结果通知发送者。发送者通过实现一个回调函数来接收消息发送结果。
应用场景:
- 消息不重要,不需要保证发送成功,如日志消息、统计信息等。
- 发送消息后不需要立即进行后续操作。
代码示例:
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult result) {
System.out.println("发送成功:" + result);
}
@Override
public void onException(Throwable e) {
System.out.println("发送失败:" + e.getMessage());
}
});
单向发送
单向发送是指消息发送者在发送消息后不会等待消息发送结果,也不会通过回调函数接收消息发送结果。
原理:
在发送消息后,发送者线程不会被阻塞。消息发送是否成功,发送者并不知道。
应用场景:
- 消息不重要,不需要知道发送结果,如心跳消息、监控信息等。
- 消息发送速度要求很高。
代码示例:
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
producer.sendOneway(msg);
发送方式比较
发送方式 | 特点 | 应用场景 |
---|---|---|
同步发送 | 发送后阻塞等待消息发送结果 | 重要的消息,需要保证发送成功 |
异步发送 | 发送后不阻塞,通过回调函数接收消息发送结果 | 消息不重要,不需要保证发送成功 |
单向发送 | 发送后不阻塞,不接收消息发送结果 | 消息不重要,不需要知道发送结果 |
如何选择合适的发送方式
在实际应用中,如何选择合适的发送方式呢?一般来说,可以参考以下原则:
- 如果消息很重要,需要保证发送成功,则使用同步发送。
- 如果消息不重要,不需要保证发送成功,则可以使用异步发送或单向发送。
- 如果消息发送速度要求很高,则可以使用单向发送。
希望本文对您有所帮助。如果您还有其他问题,欢迎留言讨论。