RocketMQ發(fā)送同步、異步、單向、延遲、批量、順序、批量消息、帶標(biāo)簽消息
嘿,各位消息隊列的愛好者們,今天咱們來聊聊RocketMQ,這個阿里巴巴開源的分布式消息中間件。RocketMQ功能強大,支持多種消息發(fā)送方式,比如同步、異步、單向、延遲、批量、順序,還有帶標(biāo)簽消息。是不是聽著就頭暈?別擔(dān)心,我今天就用大白話給大家解釋清楚,保證你一看就懂!
一、同步發(fā)送
同步發(fā)送,顧名思義,就是發(fā)送消息后,要等著消息服務(wù)器確認(rèn)收到了,才繼續(xù)往下走。就像你寄快遞,得等快遞員確認(rèn)收貨了,你才放心離開。
SendResult sendResult = producer.send(msg);
這種方式最靠譜,但也是最慢的,因為得等著服務(wù)器回應(yīng)。
二、異步發(fā)送
異步發(fā)送呢,就是發(fā)送消息后,不等服務(wù)器回應(yīng),直接就走人。就像你扔個紙條進郵筒,不管它有沒有被郵遞員拿走,你就走了。這種方式快,但可能有時候你都不知道消息到底發(fā)沒發(fā)出去。
producer.sendAsync(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
// 消息發(fā)送成功
}
@Override
public void onException(Throwable e) {
// 消息發(fā)送失敗
}
});
三、單向發(fā)送
單向發(fā)送,更是簡單粗暴,發(fā)送消息后,啥也不管,連回調(diào)都不要。就像你把紙條往天上一扔,愛誰誰!這種方式最快,但也是最不可靠的,因為你完全不知道消息的去向。
producer.sendOneway(msg);
四、延遲發(fā)送
延遲發(fā)送,就是你可以指定一個時間,讓消息在未來的某個時間點再發(fā)送出去。就像你設(shè)置了個定時鬧鐘,到點了它才會響。
msg.setDelayTimeLevel(level); // level是延遲級別,RocketMQ有預(yù)設(shè)的延遲級別
producer.send(msg);
五、批量發(fā)送
批量發(fā)送,就是你可以把多條消息打包成一個批次發(fā)送,就像你把一堆信件裝進一個包裹里寄出去。這樣可以減少網(wǎng)絡(luò)開銷,提高效率。
List<Message> messages = new ArrayList<>();
// 添加多條消息到messages
SendResult sendResult = producer.send(messages);
但要注意的是,批量發(fā)送可能會因為其中某條消息的問題導(dǎo)致整個批次發(fā)送失敗。
六、順序發(fā)送
順序發(fā)送,就是保證消息按照你發(fā)送的順序被消費。就像你排隊買票,得按照先來后到的順序。這在某些需要嚴(yán)格順序的場景中非常重要。
要實現(xiàn)順序發(fā)送,你需要把消息發(fā)送到同一個隊列里,并且消費者也要按照順序去消費。
// 選擇一個隊列
MessageQueue selector = new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
// 根據(jù)某種規(guī)則選擇隊列
return mqs.get(0);
}
};
producer.send(msg, selector, arg);
七、帶標(biāo)簽消息
帶標(biāo)簽消息,就是你可以給消息打個標(biāo)簽,就像你給文件加個標(biāo)簽一樣,方便以后查找和過濾。
msg.setTags("tag1,tag2");
producer.send(msg);
消費者在消費時,可以根據(jù)標(biāo)簽來過濾消息,只消費自己感興趣的消息。
結(jié)語
好了,小伙伴們,今天咱們就聊到這里。RocketMQ的這幾種消息發(fā)送方式,各有千秋,選擇哪種方式,得看你的具體需求和場景。同步發(fā)送最靠譜,但最慢;異步發(fā)送和單向發(fā)送快,但可靠性差;延遲發(fā)送可以定時發(fā)送消息;批量發(fā)送能提高效率;順序發(fā)送能保證消息順序;帶標(biāo)簽消息方便過濾和查找。希望這篇文章能幫到你,讓你在RocketMQ的世界里游刃有余!加油!