嘿,各位消息队列的爱好者们,今天咱们来聊聊RocketMQ,这个阿里巴巴开源的分布式消息中间件。RocketMQ功能强大,支持多种消息发送方式,比如同步、异步、单向、延迟、批量、顺序,还有带标签消息。是不是听着就头晕?别担心,我今天就用大白话给大家解释清楚,保证你一看就懂!
一、同步发送
同步发送,顾名思义,就是发送消息后,要等着消息服务器确认收到了,才继续往下走。就像你寄快递,得等快递员确认收货了,你才放心离开。
SendResult sendResult = producer.send(msg);
这种方式最靠谱,但也是最慢的,因为得等着服务器回应。
二、异步发送
异步发送呢,就是发送消息后,不等服务器回应,直接就走人。就像你扔个纸条进邮筒,不管它有没有被邮递员拿走,你就走了。这种方式快,但可能有时候你都不知道消息到底发没发出去。
producer.sendAsync(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
// 消息发送成功
}
@Override
public void onException(Throwable e) {
// 消息发送失败
}
});
三、单向发送
单向发送,更是简单粗暴,发送消息后,啥也不管,连回调都不要。就像你把纸条往天上一扔,爱谁谁!这种方式最快,但也是最不可靠的,因为你完全不知道消息的去向。
producer.sendOneway(msg);
四、延迟发送
延迟发送,就是你可以指定一个时间,让消息在未来的某个时间点再发送出去。就像你设置了个定时闹钟,到点了它才会响。
msg.setDelayTimeLevel(level); // level是延迟级别,RocketMQ有预设的延迟级别
producer.send(msg);
五、批量发送
批量发送,就是你可以把多条消息打包成一个批次发送,就像你把一堆信件装进一个包裹里寄出去。这样可以减少网络开销,提高效率。
List<Message> messages = new ArrayList<>();
// 添加多条消息到messages
SendResult sendResult = producer.send(messages);
但要注意的是,批量发送可能会因为其中某条消息的问题导致整个批次发送失败。
六、顺序发送
顺序发送,就是保证消息按照你发送的顺序被消费。就像你排队买票,得按照先来后到的顺序。这在某些需要严格顺序的场景中非常重要。
要实现顺序发送,你需要把消息发送到同一个队列里,并且消费者也要按照顺序去消费。
// 选择一个队列
MessageQueue selector = new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
// 根据某种规则选择队列
return mqs.get(0);
}
};
producer.send(msg, selector, arg);
七、带标签消息
带标签消息,就是你可以给消息打个标签,就像你给文件加个标签一样,方便以后查找和过滤。
msg.setTags("tag1,tag2");
producer.send(msg);
消费者在消费时,可以根据标签来过滤消息,只消费自己感兴趣的消息。
结语
好了,小伙伴们,今天咱们就聊到这里。RocketMQ的这几种消息发送方式,各有千秋,选择哪种方式,得看你的具体需求和场景。同步发送最靠谱,但最慢;异步发送和单向发送快,但可靠性差;延迟发送可以定时发送消息;批量发送能提高效率;顺序发送能保证消息顺序;带标签消息方便过滤和查找。希望这篇文章能帮到你,让你在RocketMQ的世界里游刃有余!加油!