910
微信
發送普通消息(三種方式)__Java SDK_TCP 接入(專業)_消息隊列 MQ-阿裏雲
MQ 發送普通消息有三種實現方式:可靠同步發送、可靠異步發送、單向(Oneway)發送。本文介紹了每種實現的原理、使用場景以及三種實現的異同,同時提供了代碼示例以供參考。
可靠同步發送
原理:同步發送是指消息發送方發出數據後,會在收到接收方發回響應之後才發下一個數據包的通訊方式。
應用場景:此種方式應用場景非常廣泛,例如重要通知郵件、報名短信通知、營銷短信係統等。
可靠異步發送
原理:異步發送是指發送方發出數據後,不等接收方發回響應,接著發送下個數據包的通訊方式。MQ 的異步發送,需要用戶實現異步發送回調接口(SendCallback),在執行消息的異步發送時,應用不需要等待服務器響應即可直接返回,通過回調接口接收務器響應,並對服務器的響應結果進行處理。
應用場景:異步發送一般用於鏈路耗時較長,對 RT 響應時間較為敏感的業務場景,例如用戶視頻上傳後通知啟動轉碼服務,轉碼完成後通知推送轉碼結果等。
單向(Oneway)發送
原理:單向(Oneway)發送特點為隻負責發送消息,不等待服務器回應且沒有回調函數觸發,即隻發送請求不等待應答。此方式發送消息的過程耗時非常短,一般在微秒級別。
應用場景:適用於某些耗時非常短,但對可靠性要求並不高的場景,例如日誌收集。
下表概括了三者的特點和主要區別。
發送TPS | 發送結果反饋 | 可靠性 | |
---|---|---|---|
同步發送 | 快 | 有 | 不丟失 |
異步發送 | 快 | 有 | 不丟失 |
單向發送 | 最快 | 無 | 可能丟失 |
示例代碼
同步發送
public class ProducerTest {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(PropertyKeyConst.ProducerId, "XXX");//您在控製台創建的Producer ID
properties.put(PropertyKeyConst.AccessKey,"XXX");// AccessKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
properties.put(PropertyKeyConst.SecretKey, "XXX");// SecretKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");//設置發送超時時間,單位毫秒
//公有雲生產環境:https://onsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
//公有雲公測環境:https://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet
//杭州金融雲環境:https://jbponsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
//杭州深圳雲環境:https://mq4finance-sz.addr.aliyun.com:8080/rocketmq/nsaddr4client-internal
properties.put(PropertyKeyConst.ONSAddr,
"https://onsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal");//此處以公有雲生產環境為例
Producer producer = ONSFactory.createProducer(properties);
// 在發送消息前,必須調用start方法來啟動Producer,隻需調用一次即可。
producer.start();
//循環發送消息
for (int i = 0; i < 100; i++){
Message msg = new Message( //
// Message Topic
"TopicTestMQ",
// Message Tag 可理解為Gmail中的標簽,對消息進行再歸類,方便Consumer指定過濾條件在MQ服務器過濾
"TagA",
// Message Body 可以是任何二進製形式的數據, MQ不做任何幹預,
// 需要Producer與Consumer協商好一致的序列化和反序列化方式
"Hello MQ".getBytes());
// 設置代表消息的業務關鍵屬性,請盡可能全局唯一。
// 以方便您在無法正常收到消息情況下,可通過阿裏雲服務器管理控製台查詢消息並補發。
// 注意:不設置也不會影響消息正常收發
msg.setKey("ORDERID_" + i);
// 同步發送消息,隻要不拋異常就是成功
SendResult sendResult = producer.send(msg);
System.out.println(sendResult);
}
// 在應用退出前,銷毀Producer對象
// 注意:如果不銷毀也沒有問題
producer.shutdown();
}
}
異步發送
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(PropertyKeyConst.AccessKey, "DEMO_AK");// AccessKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
properties.put(PropertyKeyConst.SecretKey, "DEMO_SK");// SecretKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
properties.put(PropertyKeyConst.ProducerId, "DEMO_PID");//您在控製台創建的Producer ID
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");//設置發送超時時間,單位毫秒
Producer producer = ONSFactory.createProducer(properties);
// 在發送消息前,必須調用start方法來啟動Producer,隻需調用一次即可。
producer.start();
Message msg = new Message(
// Message Topic
"TopicTestMQ",
// Message Tag,可理解為Gmail中的標簽,對消息進行再歸類,方便Consumer指定過濾條件在MQ服務器過濾
"TagA",
// Message Body,任何二進製形式的數據,MQ不做任何幹預,需要Producer與Consumer協商好一致的序列化和反序列化方式
"Hello MQ".getBytes());
// 設置代表消息的業務關鍵屬性,請盡可能全局唯一。以方便您在無法正常收到消息情況下,可通過MQ控製台查詢消息並補發。
// 注意:不設置也不會影響消息正常收發
msg.setKey("ORDERID_100");
// 異步發送消息, 發送結果通過callback返回給客戶端。
producer.sendAsync(msg, new SendCallback() {
@Override
public void onSuccess(final SendResult sendResult) {
// 消費發送成功
System.out.println("send message success. topic=" + sendResult.getTopic() + ", msgpln"> + sendResult.getMessageId());
}
@Override
public void onException(OnExceptionContext context) {
// 消息發送失敗
System.out.println("send message failed. topic=" + context.getTopic() + ", msgpln"> + context.getMessageId());
}
});
// 在callback返回之前即可取得msgId。
System.out.println("send message async. topic=" + msg.getTopic() + ", msgpln"> + msg.getMsgID());
// 在應用退出前,銷毀Producer對象。注意:如果不銷毀也沒有問題
producer.shutdown();
}
單向(Oneway)發送
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(PropertyKeyConst.AccessKey, "DEMO_AK");// AccessKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
properties.put(PropertyKeyConst.SecretKey, "DEMO_SK");// SecretKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
properties.put(PropertyKeyConst.ProducerId, "DEMO_PID");//您在控製台創建的Producer ID
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");//設置發送超時時間,單位毫秒
Producer producer = ONSFactory.createProducer(properties);
// 在發送消息前,必須調用start方法來啟動Producer,隻需調用一次即可。
producer.start();
//循環發送消息
for (int i = 0; i < 100; i++){
Message msg = new Message(
// Message Topic
"TopicTestMQ",
// Message Tag,
// 可理解為Gmail中的標簽,對消息進行再歸類,方便Consumer指定過濾條件在MQ服務器過濾
"TagA",
// Message Body
// 任何二進製形式的數據,MQ不做任何幹預,需要Producer與Consumer協商好一致的序列化和反序列化方式
"Hello MQ".getBytes());
// 設置代表消息的業務關鍵屬性,請盡可能全局唯一。
// 以方便您在無法正常收到消息情況下,可通過阿裏雲服務器管理控製台查詢消息並補發。
// 注意:不設置也不會影響消息正常收發
msg.setKey("ORDERID_" + i);
// oneway發送消息,隻要不拋異常就是成功
producer.sendOneway(msg);
}
// 在應用退出前,銷毀Producer對象
// 注意:如果不銷毀也沒有問題
producer.shutdown();
}
最後更新:2016-11-23 16:04:04
上一篇:
日誌配置__Java SDK_TCP 接入(專業)_消息隊列 MQ-阿裏雲
下一篇:
發送事務消息__Java SDK_TCP 接入(專業)_消息隊列 MQ-阿裏雲
修改實例管理終端口令__實例相關接口_API 參考_雲服務器 ECS-阿裏雲
多維分析__表操作(基於表目錄樹)_SQL操作_用戶指南(RDBMS)_數據管理-阿裏雲
ECS被入侵處理__攻擊防護_Web 應用防火牆-阿裏雲
ALTER VIEW__數據定義語言_SQL語法參考_雲數據庫 OceanBase-阿裏雲
創建自定義監控項和報警規則__自定義監控_用戶指南_雲監控-阿裏雲
集群續費__集群_用戶指南_E-MapReduce-阿裏雲
全靠內地市場大 阿裏雲市場份額超Google 成全球第三
7.2 查看DB性能指標和報告__第七章 性能優化和診斷_使用手冊_分析型數據庫-阿裏雲
ALIYUN::RAM::AccessKey__資源列表_資源編排-阿裏雲
用戶及權限管理__數據庫管理語言_SQL語法參考_雲數據庫 OceanBase-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲