返回

RocketMQ-Producer 发送方式

后端

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);

发送方式比较

发送方式 特点 应用场景
同步发送 发送后阻塞等待消息发送结果 重要的消息,需要保证发送成功
异步发送 发送后不阻塞,通过回调函数接收消息发送结果 消息不重要,不需要保证发送成功
单向发送 发送后不阻塞,不接收消息发送结果 消息不重要,不需要知道发送结果

如何选择合适的发送方式

在实际应用中,如何选择合适的发送方式呢?一般来说,可以参考以下原则:

  • 如果消息很重要,需要保证发送成功,则使用同步发送。
  • 如果消息不重要,不需要保证发送成功,则可以使用异步发送或单向发送。
  • 如果消息发送速度要求很高,则可以使用单向发送。

希望本文对您有所帮助。如果您还有其他问题,欢迎留言讨论。