阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 14698阅读
  • 13回复

[免费公测]【阿里云产品公测】MQS使用体会和建议

级别: 小白
发帖
10
云币
36
帮忙投个票哈:http://bbs.aliyun.com/read/178799.html   编号47,谢啦 N:7;c}~  
oi/bp#(fa  
"_36WX  
无意间看到阿里推出了消息队列服务MQS功能,由于长期从事和消息队列(Messaging)相关的工作,出于好奇,申请了下阿里云的队列服务。 Bis'59?U_  
:k7h"w  
C\C*'l6d  
消息队列最主要的的要求就是可靠,一般说来,为了达到这个可靠,如果己搭建消息队列服务器,需要花不少的时间在维护上, VT`C<'   
特别是在异构的环境中,阿里云的消息队列产品优势里介绍的第一点,简单易用里说———— y6 _,U/9  
“您无需自行搭建消息队列服务,免运维” *[O)VkL\%i  
这一点对于企业级应用还是比较诱人的,试想如果有几百个队列服务器需要维护,还是比较愁人的。 w%Tjn^d  
~xP4}gs1  
uS,XQy2  
  • 编程接口
d#]XyN>  
对于接口————“我们提供标准的HTTP RESTful接口简单易用,对平台无依赖”,这一点虽然对,但是实际上也就意味着, 2K&5Kt/  
如果消息队列服务不可用的情况下将无法提交消息,也就是应用如果遇到队列服务不可用的情况时,应用应该具备缓存数据的能力, O!#bM< *  
然后当队列服务可用时,重新提交,否则就会出现数据丢失的情况。或者就完全依赖阿里云提供的消息服务的可靠性了。 sT|FgB  
Y)]x1I  
1{7*0cv$iL  
对于数据交换格式,支持XML格式,目前JSON格式由于数据格式比较简单,格式都是压缩的,占用带宽小,易于解析等等似乎更有优势, lZ` CFZR0  
因此如果能支持JSON格式就更好了。 MZInS:Vj  
n%Gk {h5  
6YeEr!zt%  
正好有Java SDK,直接拿它写了个测试程序试了下... MehMhHY  
0($ O1j~$  
c O[Hr  
  • 建立连接
ekx~svcC&A  
MQSClient client = new DefaultMQSClient("http://dongcc.mqs-beijing.aliyuncs.com","accessId", "accessKey"); op]HF4  
不知道为什么,一开始直接设置了个id(dongcc),总是不能正确运行,报错: %RF9R"t$  
[Error Code]:AccessDenied, [Message]:The OwnerId that your Access Key Id associated to is forbidden for this operation. P7`sJ("#  
pN ^^U[  
b/eJEL  
而文档里写的是 ) FnJLd  
MQSClient client= new DefaultMQSClient("http://<QueueOwnerId>.mqs-<Region>.aliyuncs.com", "<AccessKeyId>","<AccessKeySecret>"); :yTpjC-S]  
一直没弄明白这个QueueOwnerId是怎么定义的。后来从消息队列控制台发现有获取地址的功能,因此找到了这个QueueOwnerId: o> i`Jq&  
ySk'#\d  
a J&)-ge  
=5jng.  
^YLk&A)X  
而且从建立连接的方式,可以看出,跨区域的消息队列是不能共享的。 {!`0i  
IyfhVk?  
<.yL&$9  
  • 队列
/) Pf ]  
开始用尝试用代码建queue,习惯性的建了个test.q1,结果报错: ]a}K%D)H  
[Error Code]:InvalidQueueName, [Message]:The queuename you provided is invalid. QueueName should start with alpha and contain only alpha, digit or -. d?uN6JH9  
原来是queue名字不支持".",只能用"-", 由于以前一直采用地区.应用名.对列名的格式建queue,这么一改,还很不习惯,如果能支持点(.)就好了。 <:rbK9MIl  
l&f"qF?  
"`jey)&H*M  
建queue的时候有如下参数: gISG<!+X^  
QueueMeta meta = new QueueMeta(); cU^Z=B  
meta.setQueueName(queueName); d/fg  
meta.setDelaySeconds(0L);                                    //发送到该Queue所有消息的延迟可见时间,单位为秒 g]hTz)8fF  
meta.setMaxMessageSize(65530L);                        //消息体的最大长度,单位为byte tXgsWG?v[H  
meta.setMessageRetentionPeriod(345600L);             //消息的最长存活时间,单位为秒,最小60秒 K~ 6[zJ4  
meta.setVisibilityTimeout(30L);                                //消息取出后维持不可见状态的时间,单位为秒,最小1秒 ?7Y6: zo$^  
meta.setPollingWaitseconds(0);                               //长轮询等待时间,单位为秒,默认为0 ~x:B@Ow  
Z?7XuELKV  
-f+U:/'.>v  
对于MessageRetentionPeriod范围: 60 (1 分钟)-1296000(15 天) ,最长15天,这就意味着,消息没法持久化。 (H\)BS7#R  
对于PollingWaitseconds,我感觉是取消息的等待时间,但在实际测试中,好像不是这样,好像没有等待就直接返回了,不知道是bug还是我理解错了。 a=m7pe ^  
实际上对于MessageRetentionPeriod,PollingWaitseconds,感觉最好是消息的参数,这样相比队列的参数更加灵活, _.ny<r:g  
否则就得设置不同的队列来处理,比如有时候(比如backend)程序需要取消息的时候希望timeout的时间(PollingWaitseconds)是30秒, O$2= Z  
有时候对于同一类消息出于响应时间的考虑,可能timeout的时间就是5秒或者更少。 -27uh  
Guc~] B  
~(BvI zzD  
对于MessageSize,64K感觉有点小,我遇到过一个企业应用里的消息大小是50M的xml文本~ Hq[vh7Lux  
vbDSNm#Yv  
M7\; Y  
不过队列属性里好像没有最大深度,难道是放消息没有限制? @dy<=bh~  
*$t<H-U-  
$6(,/}==0  
  • 消息的发送
?f\;z<e|  
发送消息,就两个属性可以设置(Priority和DelaySeconds): i|@lUXBp  
CloudQueue queue = client.getQueueRef(queueName); 44uM:;  
Message message = new Message(); @Gh?|d7bD  
message.setMessageBody("I am test message."); | JmEI9n2  
message.setPriority(8) ;                 //消息的优先级,优先级越高的消息,越容易更早被消费 3Ishe"  
queue.putMessage(message); ),G?f {`!  
sd@JQ%O  
0I8w'/s_g9  
正如上面提到的,希望能够对于消息设置MessageRetentionPeriod,这样更为灵活,而且,有些情况下持久消息还是很有用的。 !N`$`qAK  
P4M*vZq)  
@_gCGI>Q  
  • 消息的读取
KxEy N(n  
对于读取消息,有同步和异步两种方式: 'u \my  
同步读取 Rmq8lU  
Message msg = queue.popMessage(); Fp)+>o T  
String messageBody = msg.getMessageBodyAsString(); )zFPf]gz  
String msgId = msg.getMessageId(); 7X Z5CX&  
String receiptHandle = msg.getReceiptHandle(); O4Wn+$AN  
ewo1^&#>  
d)G' y  
读消息的时候,希望能对消息的PollingWaitseconds进行设置,这样更为灵活,或者popMessage价格取消息的等待时间之类的。 L(p{>Ykcc  
从参考看,http request是支持这个参数的,但Java SDK和Python SDK好像没这个参数。 ;1S~'B&1Q  
cJ6n@\  
{,Y?+F  
异步读取 )1PZ#  
queue.asyncPopMessage(new AsyncCallback<Message>() { !>~W5c^  
public void onSuccess(Message msg) { *5SOXrvhu6  
  String messageBody = msg.getMessageBodyAsString(); SJYy,F],V"  
  String msgId = msg.getMessageId(); :YL`GSl  
  String receiptHandle = msg.getReceiptHandle(); -~nU&$ccL  
  System.out.println("msg :" + messageBody); $6W o$c%  
} w]4=uL6  
public void onFail(Exception ex) { }U)g<Kzh  
  ex.printStackTrace(); W?a{3B   
} On[:]#  
} 9#:b+Amzz  
n=HId:XT  
z9@Tg= #i  
消息的读取最初测试的时候发现这个消息好像不想我想象中的,读完了就删除了,这个消息好像会一直存在,除非以显式的方式删除: 8Ol#-2>k$  
queue.deleteMessage(receiptHandle); d)'am 3Q  
6} DGEHc1  
E0;KTcZi  
后来发现文档关于消息投递保障是这么描述的:在消息有效期内,确保消息至少能被成功消费一次 a ?LrSk`  
6g/ <FM  
2v ^bd^]u:  
一般说来消息QoS有三种: \q2#ef@2  
  • 至少一次
  • 刚好一次
  • 至多一次
_JlbVe[<  
个人感觉对于可靠消息传输,一般都要求刚好一次,当然也可以在应用里读取完消息后直接删除。 %/l9$>{  
0mJvoz\j8  
KO`ftz3 +  
总体感觉,阿里云的消息队列服务的响应速度还是不错的,如果走内网的话,估计更快,当然测试中也没发现过丢包的情况。 UL81x72O  
zEG6T*  
q[6tvPfkX  
7 Jxhn!  
^/|agQ7D2  
`[hc{ynO|  
s}MD;V&0  
' `0kW_'  
[ 此帖被dongcc在2014-11-06 15:50重新编辑 ]
本帖最近评分记录: 2 条评分 云币 +24
boboan 云币 +4 问题很专业 2014-11-05
qiujin2012 云币 +20 支持他,就给他投票,猛戳: http://bbs.aliyun.com/read/178799.html 2014-11-05
发帖
994
云币
1363
只看该作者 沙发  发表于: 2014-11-05
支持他,就给他投票,猛戳: I_s*pT  
http://bbs.aliyun.com/read/178799.html
〉〉论坛经验-《阿里云服务器从入门到精通》精华汇总
http://bbs.aliyun.com/read/135619.html?amp;displayMode=1#tpc
级别: 菜鸟
发帖
34
云币
46
只看该作者 板凳  发表于: 2014-11-05
  1. “如果消息队列服务不可用的情况下将无法提交消息”。
ojx2[a\  
,7)z avA  
个人觉得这个问题不大,mqs保证的是99.9%服务可用性,Always Writable。当然公网的网络环境不稳定是有的。缓存数据在客户端来做是不是会更好?
级别: 菜鸟
发帖
34
云币
46
只看该作者 地板  发表于: 2014-11-05
2  json格式这个可以有。 6('CB|ga  
Hq|{Nt%Q  
3 我第一看文档也没弄明白QueueOwnerId。。。是在创建队列后,才搞明白的。这个是文档的问题,没说明白,要改进的地方 _opB,,G  
nnTiu,2R  
4 mqs目前对放消息数是没有限制的。 VDlP,Mm*  
'M fVZho{  
5 PollingWaitseconds 是指,当queue没有消息时,针对该queue receive message请求最长等待时间。超过这个时间后,返回MsgNotExsits。如果在这个时间范围内,有了消息,就直接返回消息。                     @DKph!c r  
级别: 菜鸟
发帖
34
云币
46
只看该作者 4楼 发表于: 2014-11-05
6  “希望能够对于消息设置MessageRetentionPeriod,这样更为灵活,而且,有些情况下持久消息还是很有用的。”     ^39 ?@xc@  
     gyob q'o-  
灵活和方便管理需要平衡。             ,S1'SCwVdJ  
hmI> 7@&  
mqs本身消息是有持久化。但mqs本身不是存储服务,其实可以选择本地存储或是oss。 )jMk ~;'r  
级别: 菜鸟
发帖
34
云币
46
只看该作者 5楼 发表于: 2014-11-05
7 “对于MessageSize,64K感觉有点小,我遇到过一个企业应用里的消息大小是50M的xml文本” {mA#'75a#  
la{o<||Aq  
。。。50M的消息,这个确实有点大。建议存oss,然后把它的地址发到消息    。 ]"i^ VVw  
级别: 菜鸟
发帖
34
云币
46
只看该作者 6楼 发表于: 2014-11-05
8  跨区域的消息队列是不能共享的 N0RFPEQ~  
;oFaDTX]  
请问这个是什么意思,你希望怎么共享? [bPE?_a,  
iL 4SL}P  
9 之前你是使用的什么队列,习惯性的建了个test.q1 ? \S7OC   
级别: 小白
发帖
10
云币
36
只看该作者 7楼 发表于: 2014-11-06
回2楼boboan的帖子
阿里云MQS能保证99.9%的可用性,还是相当厉害的,缓存在客户端要取决于什么应用,某些情况下客户端很多的话,缓存在客户端维护起来就不太好弄;不过这个毕竟是少数情况,通过ECS的稳定性,我相信阿里云MQS稳定性
级别: 小白
发帖
10
云币
36
只看该作者 8楼 发表于: 2014-11-06
Re【阿里云产品公测】MQS使用体会和建议
引用
引用第3楼boboan于2014-11-05 14:36发表的  : ~wf~b zs  
2  json格式这个可以有。 ~oA9+mT5  
dU>R<jl!$  
3 我第一看文档也没弄明白QueueOwnerId。。。是在创建队列后,才搞明白的。这个是文档的问题,没说明白,要改进的地方 0 ,Qj:  
d<GG (  
4 mqs目前对放消息数是没有限制的。 N"1x]1'   
....... &iiK ZZ`_o  
2<o[@w  
关于PollingWaitseconds ,也许是java sdk的问题,我记得我测试的时候好像没发现会等待。。。 W|rFl]~a  
我知道http request的时候可以指定PollingWaitseconds ,但java sdk或是python sdk没这个参数(不知道是不是我的sdk版本太低或是别的什么原因),文档的说法是会参考queue设置的PollingWaitseconds。
级别: 小白
发帖
10
云币
36
只看该作者 9楼 发表于: 2014-11-06
Re【阿里云产品公测】MQS使用体会和建议
引用
引用第4楼boboan于2014-11-05 14:40发表的  : !!-}ttFA  
6  “希望能够对于消息设置MessageRetentionPeriod,这样更为灵活,而且,有些情况下持久消息还是很有用的。”     8u:v:>D.'  
     XQ0#0<  
灵活和方便管理需要平衡。             JK(`6qB>(6  
k7yv>iN  
mqs本身消息是有持久化。但mqs本身不是存储服务,其实可以选择本地存储或是oss。 a%MzNH  
....... Gs_*/E7,  
S{^6iR  
灵活和方便管理需要平衡,这点我完全同意。 p@cfY]<7  
如果mqs本身的消息有持久化的,不知道如果出现服务停止的时候(正常或异常),服务回复后,消息会还在么? ueWR/  
正常说来15天是够的,有些业务请求,会由于某种原因未被处理,如果到了15天后,就消失了,感觉也许应该留个什么记录可以作为追溯的依据。。。
级别: 小白
发帖
10
云币
36
只看该作者 10楼 发表于: 2014-11-06
Re【阿里云产品公测】MQS使用体会和建议
引用
引用第5楼boboan于2014-11-05 14:41发表的  : 9uuta4&uI  
7 “对于MessageSize,64K感觉有点小,我遇到过一个企业应用里的消息大小是50M的xml文本” !nec 7  
Gh2#-~|cB  
。。。50M的消息,这个确实有点大。建议存oss,然后把它的地址发到消息    。 TcR=GR*cJ  
+2- qlU  
v2IEJ  
这个建议不错~
级别: 小白
发帖
10
云币
36
只看该作者 11楼 发表于: 2014-11-06
Re【阿里云产品公测】MQS使用体会和建议
引用
引用第6楼boboan于2014-11-05 14:44发表的  : ST;t, D:  
8  跨区域的消息队列是不能共享的 CDdkoajBa  
c\.P/~  
请问这个是什么意思,你希望怎么共享? v}[dnG  
_^\$" nw  
9 之前你是使用的什么队列,习惯性的建了个test.q1 ? NXU`wnVJ  
....... *e/K:k  
=SBBvnPLI  
目前阿里有三个地区,北京,青岛,杭州(也许以后能跨国家?),不同地区访问速度不一样,如果一个应用在不同地区使用,比如放消息的应用在杭州,读消息处理消息的应用在北京,如果消息能做到共享的话(或者互通),就可以避免访问速度带来的一些问题了。 o2uj =Gnx  
}}T,W.#%u  
1RqgMMJL  
我一般用的是IBM MQ和开源的MQTT类的产品(基于pub/sub的,因此基于topic string,使用就不是点了,是斜线,如/REGION/BU/APPLNAME/XXX)。 y%cO#P@  
[ 此帖被dongcc在2014-11-06 15:44重新编辑 ]
级别: 码农
发帖
121
云币
141
只看该作者 12楼 发表于: 2015-05-01
Re【阿里云产品公测】MQS使用体会和建议
个人网站:http://www.lichuangcheng.com/
级别: 码农
发帖
121
云币
141
只看该作者 13楼 发表于: 2015-05-08
Re【阿里云产品公测】MQS使用体会和建议
学习啦!!! 欢迎大家访问我的个人网站!http://www.lichuangcheng.com
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: 44 + 7 = ?
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)