292
汽車大全
廣播拉取消息模型__最佳實踐_消息服務-阿裏雲
背景描述
阿裏雲消息服務MNS 已經提供隊列(queue)和主題(topic)兩種模型。其中隊列提供的是一對多的共享消息消費模型,采用客戶端主動拉取(Pull)模式;主題模型提供一對多的廣播消息消費模型,並且采用服務端主動推送(Push)模式。上麵兩種模型基本能滿足我們大多數應用場景。
推送模式的好處是即時性能比較好,但是需要暴露客戶端地址來接收服務端的消息推送。有些情況下,比如企業內網,我們無法暴露推送地址,希望改用拉取(Pull)的方式。雖然MNS不直接提供這種消費模型,但是我們可以結合主題和隊列來實現一對多的拉取消息消費模型。具體方案如下:
解決方案
讓主題將消息先推送到隊列,然後由消費者從隊列拉取消息。這樣既可以做到1對多的廣播消息,又不需要暴露消費者的地址;如下圖所示:
接口說明
最新的Java SDK(1.1.5)中的CloudPullTopic 默認支持上述解決方案。其中MNSClient 提供下麵兩個接口來快速創建CloudPullTopic:
public CloudPullTopic createPullTopic(TopicMeta topicMeta, Vector<String> queueNameList, boolean needCreateQueue, QueueMeta queueMetaTemplate)
public CloudPullTopic createPullTopic(TopicMeta topicMeta, Vector<String> queueNameList)
其中,TopicMeta 是創建topic的meta 設置, queueNameList裏指定topic消息推送的隊列名列表;needCreateQueue表明queueNameList是否需要創建;queueMetaTemplate是創建queue需要的queue meta 參數設置;
Demo代碼
CloudAccount account = new CloudAccount(accessKeyId, accessKeySecret, endpoint);
MNSClient client = account.getMNSClient();
// build consumer name list.
Vector<String> consumerNameList = new Vector<String>();
String consumerName1 = "consumer001";
String consumerName2 = "consumer002";
String consumerName3 = "consumer003";
consumerNameList.add(consumerName1);
consumerNameList.add(consumerName2);
consumerNameList.add(consumerName3);
QueueMeta queueMetaTemplate = new QueueMeta();
queueMetaTemplate.setPollingWaitSeconds(30);
try{
//producer code:
// create pull topic which will send message to 3 queues for consumer.
String topicName = "demo-topic-for-pull";
TopicMeta topicMeta = new TopicMeta();
topicMeta.setTopicName(topicName);
CloudPullTopic pullTopic = client.createPullTopic(topicMeta, consumerNameList, true, queueMetaTemplate);
//publish message and consume message.
String messageBody = "broadcast message to all the consumers:hello the world.";
// if we sent raw message,then should use getMessageBodyAsRawString to parse the message body correctly.
TopicMessage tMessage = new RawTopicMessage();
tMessage.setBaseMessageBody(messageBody);
pullTopic.publishMessage(tMessage);
// consumer code:
//3 consumers receive the message.
CloudQueue queueForConsumer1 = client.getQueueRef(consumerName1);
CloudQueue queueForConsumer2 = client.getQueueRef(consumerName2);
CloudQueue queueForConsumer3 = client.getQueueRef(consumerName3);
Message consumer1Msg = queueForConsumer1.popMessage(30);
if(consumer1Msg != null)
{
System.out.println("consumer1 receive message:" + consumer1Msg.getMessageBodyAsRawString());
}else{
System.out.println("the queue is empty");
}
Message consumer2Msg = queueForConsumer2.popMessage(30);
if(consumer2Msg != null)
{
System.out.println("consumer2 receive message:" + consumer2Msg.getMessageBodyAsRawString());
}else{
System.out.println("the queue is empty");
}
Message consumer3Msg = queueForConsumer3.popMessage(30);
if(consumer3Msg != null)
{
System.out.println("consumer3 receive message:" + consumer3Msg.getMessageBodyAsRawString());
}else{
System.out.println("the queue is empty");
}
// delete the fullTopic.
pullTopic.delete();
}catch(ClientException ce)
{
System.out.println("Something wrong with the network connection between client and MNS service."
+ "Please check your network and DNS availablity.");
ce.printStackTrace();
}
catch(ServiceException se)
{
/*you can get more MNS service error code in following link.
https://help.aliyun.com/document_detail/mns/api_reference/error_code/error_code.html?spm=5176.docmns/api_reference/error_code/error_response
*/
se.printStackTrace();
}
client.close();
最後更新:2016-11-23 17:16:08
上一篇:
Queue操作__曆史協議_API使用手冊_消息服務-阿裏雲
下一篇:
消息處理時長自適應__最佳實踐_消息服務-阿裏雲
縮略後填充__圖片縮放_老版圖片服務手冊_對象存儲 OSS-阿裏雲
編輯索引__結構管理_DMS for MongoDB_用戶指南(NoSQL)_數據管理-阿裏雲
阿裏雲為西安交大帶來了這個新學院:收入逆天!秒變超級英雄!
如何開通大數據開發套件__快速開始_大數據開發套件-阿裏雲
雲服務器 ECS鏡像複製FAQ
查詢策略下綁定的API__流量控製相關接口_API_API 網關-阿裏雲
通用圖像分析服務簡介__通用圖像分析服務_人工智能圖像類-阿裏雲
OSS 參考使用說明__開發準備_開發人員指南_E-MapReduce-阿裏雲
雲服務器 ECS 按量付費雲盤和可用區FAQ
數據表管理__數據管理手冊_用戶操作指南_大數據開發套件-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲