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

[免费公测]【阿里云产品公测】消息队列服务MQS java SDK 机器人应用 初体验

级别: 研究猿
发帖
3357
云币
4596

先去投票,回来再看内容吧http://bbs.aliyun.com/read/178799.html
文章编号18
sS4V(:3s  

oxI?7dy5  
=E(ed,gH8  
初体验 之 测评环境 :}#j-ZCC"  
                           由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后使用mqs应用到我的程序中在阿里的ecs中运行
Z@*!0~NH=4  
tt6GtYrC 1  
先上一张图这是初体验结果
7>0/$i#'Vl  
      
开始正文                    

         本地模式
]!jfrj  
                          
                           网络环境
(WY9EJ<s,  
    阿里云服务器环境
                        
+o0yx U 7t  
    
初体验 之 准备测试
t0/Ol'kgs  
首先就是阅读一下阿里的文档,以及介绍这个事必要的,磨刀不误砍柴工功么!建议大概的通读一下,然后可以将入门指南仔细看一下,里面包含了详细的操作,以及一些demo,包括界面上的操作,和java,Python的。可以让你很快的上手。
6iHY{WcDj  
MQS基本概念 >@-. rkd(  
MQS功能和特点 z/p^C~|}  
MQS安全和可靠性 4L97UhLL  
MQS限制与局限 VP~%,=  
MQS服务访问和地域 6g#E/{kQw  
MQS API&SDK ^q%f~m,O<  
MQS使用指南 376z~  
Are0Nj&?  
. _Jypk8  
通读之后有几点我提一下 ]n:R#55A  
1,MQS是支持外网访问的,这意味着你即使不是阿里的服务器也可以使用MQS DPmY_[OAE  
2,MQS的保留时间最长15天 ^4Se=Hr z2  
3,消息最长64KB )!G 10  
4,队列个数和消息个数没有限制(不知道公测之后会怎么计算) )U]q{0`  
5,消息不保证按照生产的先后顺序被消费,(因为是集群的,只是保证优先)
1r*@1y<0"  
#8BI`.t)j  
R'atg 9  
                    
 s%5XBI  
初体验 之 本地基础测试 ~u[1Vz4#3  
MFWkJbZV  
用了大概一下午的时间看阿里提供的所有帮助和文档,在脑海里基本有了一个印象,提供一套http的api,并提供几个版本的sdk,我就选择的顺手的java sdk测试了。
``{GU}n  
这里要说的是大家可以在入门指南中看到有示例代码。如果不是细心看完所有的文档,这里可能会让初接触者有些不容易找到sdk和示例代码之间的关系。关于这点稍后再说。
x~D8XN{  
测试内容
+<B"g{dLuX  
1,外网消息生产速度
L i 9$N"2  
2,外网消息消费速度
#~w~k+E4  
3,定时消息延迟情况
sP=^5K`g  
4,消息的先后消费情况
qn}VW0!  
Kf,AnKkn'  
测试基于javasdk,直接循环发送10000调消息,求平均时间
WK#%G  
最终的测试结果为
7pnlS*E.  
oBo |eRIt|  
发送消息测试10000调
[W3sveqj&  
发送时间538639毫秒,不到九分钟,平均18.58条/每秒
I'2I'x\M  
\E05qk_;K  
获取消息10000调
0[7"Lhpd  
361956s         约6分钟,平均27.62 条/每秒
2l:cP2fa  
''z]o#=^9  
获取消息并删除 0]nveC$  
729420s    约12.157 分钟   平均 平均 13.7条
Wk!<P" nHd  
uy<b5.!-  
pXA |'U5]  
以上数据看来,get消息要比put消息快一些,
6%wlz%Fp  
hVd_1|/X  
以上测试都是单线程测试。
@zLyG#kHY  
{*  w _*  
q{f (T\  
s<3M_mt  
<;1M!.)5  
另外对定时消息做了一个测试,测试的过程依然是10000调消息,
x>T+k8[n  
一个生产者,四个消费者,同时开始工作,定时10s
qc' ;<  
-"#jRP]#  
|PGTP#O<  
平均时间在11s接收并消费成功,四个消费者的消费个数也在2500左右,下面两张是运行最后的截图,(秒级别的消息提醒已经满足我的应用需求,稍后的应用会用到。这里还是比较开心的解决了我的一个一直想做的小功能。)
$Ny:At  
dqFp"Xe"%  
M+lr [,c  
7fl{<uf  
本地基本上就做这些测试都是基于外网访问,相信如果放在ecs之后内网访问效率会更高!,然后就准备进入实战阶段了。嵌入我的应用,应用才是王道。 LIyb+rH#yg  
.4<lw  
oc[z dIk  
M.EL^;r  
                  
gplrJaH@  
MQS初体验 之 应用实战 q_"w,28  
\}YAQ'T  
J?hs\nA  
j^h:*rw  
7E5 =Qx  
d-8{}Q  
我的应用比较特殊,是个小机器人,提供一些公共服务,比如天气,歌词,成语学习,小游戏。本次的测试想通过mqs的定时消息,实现一些生活中的小提醒功能。 (''w$qq"D  
z&jASL  
2NB $(4/  
- "{hP  
就拿我本程序猿来说,公司的上班时间是弹性制的,但是每次快到下班的时候总是忘记了具体是什么时候到公司的,要不需要问前台,(不太合适吧?嘿嘿),还有个办法就是看开机时间这个也差不了多少,但是看开始时间还是需要个cmd,或者我的电脑看启动日志,或者任务管理器看,(不过这里我总是觉得不太准)。如果这时候,当我到下班时间直接有个qq消息告诉我可以走了。是不是就爽了很多哈哈
@,LU!#y(  
VAe[x `  
X `F>kp1  
先展示一下目前的实现
Q"3gvIyc  
OXB 5W#$  
{j4&'=C:  
n_wF_K\h  
    由于时间的原因,目前还不成熟,文案也有一点小问题,不过定时消息结合mqs的架构已经基本实现,慢慢把MQS用起来,改进一下,实现我的目标,(我的目标是用我的代码服务的我生活。) IfY?P(P  
;*=7>"o'`  
HC6v#-( `{  
下面说一下实现,我使用的javaSDK版本,其实很简单,如果仔细看就会发现在入门教程中是有demo的,我刚看一些文档的时候还抱怨没有教程,在我看完所有帮助文档说明之类的之后总算是看到了,(这里稍后有话要说) V`1x![\  
xP27j_*m>  
首先建议通读一下 入门指南  然后去下载sdk, ^SM5oK  
c}H}fyu%n  
as!P`*@  
\c!e_rZ  
",aEN=+|hV  
       这里阿里有说明如果是 maven环境很简单,只需要在项目的pom.xml 添加代码即可。相应的依赖包就可以加载进来, YHxQb$v)  
b~<:k\EE  
  1. <dependencies>
  2.   <dependency>
  3.     <groupId>com.aliyun</groupId>
  4.     <artifactId>aliyun-mqs</artifactId>
  5.     <version>1.0.0</version>
  6.   </dependency>
  7.   </dependencies>
6^2='y~e  
我使用的不是maven环境,这里也有全部依赖包的打包下载  传送门   a :cfr*IsK  
1{1mL-I;  
~n(LBA  
然后解压到项目就可以了,这里我就遇到一个坑,我的源码使用了和mqs的包有重叠,并且版本冲突。我哭了,没办法,只要修改了源码。(不多说都是泪 VA %lJ!$  
p1T0FBV L  
+x~p&,w?  
Vo|[Z)MO`  
H.o3d/8:  
Java的sdk对队列的操作都做了基本的封装。以下将常用的代码列一下, Tr;&bX5]H  
rX)_!mR  
k`s_31<  
Mqs 的客户端实例化
8A u W>7_  
很简单只需要提供一个访问地址,以及你己的应用key,secret {!!8 *ix  
  1. static String url = "http://iveo7.mqs-cn-qingdao.aliyuncs.com";
  2.     static String key = "******";
  3.     static String secret = "********";
  4. static MQSClient client = new DefaultMQSClient(url, key, secret);
Ylgr]?Db*  
L=WKqRa>4  
BJ5^-|  
首先就是创建一个队列
&2n 5m&   
  1. QueueMeta meta = new QueueMeta();
  2.         meta.setQueueName(queueName);
  3.         meta.setDelaySeconds(0L); // 发送到该Queue所有消息的延迟可见时间,单位为秒
  4.         meta.setMaxMessageSize(65530L); // 消息体的最大长度,单位为byte
  5.         meta.setMessageRetentionPeriod(345600L); // 消息的最长存活时间,单位为秒
  6.         meta.setVisibilityTimeout(30L); // 消息取出后维持不可见状态的时间,单位为秒
  7.         meta.setPollingWaitSeconds(0);// 长轮询等待时间,单位为秒,默认为0
  8.             CloudQueue queue = client.getQueueRef(queueName); // 通过client结构生成本地的Queue对象
  9.             System.out.println(queue.create(meta));
n;~'W*Ln0  
Xo6zeLHO  
这里创建队列方法返回的是队列访问地址,例如
V?-2FK]  
=Wz)(N  
http://iveo7.mqs-cn-qingdao.aliyuncs.com/dddddd
k,ezB+  
U8</aQLGF  
p }Bh  
<oSx'_dc  
获取消息队列列表
]Y$jc  
  1. do {
  2.                 PagingListResult<String> list = client.listQueueURL("", marker, 2);
  3.                 // 第一个参数为queue名称的前缀
  4.                 // 第二个参数marker为下一个分页的开始位置
  5.                 // 第三个参数为一次list返回的最多队列个数
  6.                 List<String> queues = list.getResult();// 返回Queue的URL
  7.                 for (int i = 0; i < queues.size(); i++) {
  8.                     System.out.println(queues.get(i));
  9.                 }
  10.                 marker = list.getMarker();
  11.             } while (marker != null && marker != "");
*Xn6yL9  
\FnR'ne  
^+kymZ  
结果
L(C0236r  
http://iveo7.mqs-cn-qingdao.aliyuncs.com/MyQueue
kZR(0, W  
http://iveo7.mqs-cn-qingdao.aliyuncs.com/dddddd
c(!pcB8  
修改队列属性
IBW-[lr7  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             QueueMeta queueMeta = queue.getAttributes(); // 如果Queue未创建,则此处
  3.             // 抛出异常提示QueueNotExist,通过4.1节方法进行创建
  4.             queueMeta.setDelaySeconds(50L);
  5.             queue.setAttributes(queueMeta);
mApl;D X  
获取队列属性 t"5ZYa  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             QueueMeta queueMeta = queue.getAttributes();
  3.             System.out.println(queueMeta.getQueueName()); // 队列名称
  4.             System.out.println(queueMeta.getDelaySeconds()); // 队列延迟属性
  5.             System.out.println(queueMeta.getMessageRetentionPeriod());// 存活时间
  6.             System.out.println(queueMeta.getMaxMessageSize());// 消息最大长度
  7.             System.out.println(queueMeta.getCreateTime());// 队列创建时间
  8.             System.out.println(queueMeta.getLastModifyTime());// 队列最近修改时间
  9.             System.out.println(queueMeta.getActiveMessages());// 活跃的消息数
  10.             System.out.println(queueMeta.getInactiveMessages());// 非活跃消息数
  11.             System.out.println(queueMeta.getQueueURL());// 队列访问的URL地址
  12.             System.out.println(queueMeta.getPollingWaitSeconds());// 长轮询等待时间
'<O.J(N~4!  
删除队列 ]H<}6}Gd  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             queue.delete();
x Vw1  
发送消息 j@4]0o  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             Message message = new Message();
  3.             message.setMessageBody(msg);//消息内容
  4.             message.setDelaySeconds(1000);//消息延时时间
  5.             message.setPriority(8); // 消息的优先级,优先级越高的消息,越容易更早被消费
  6.             System.out.println(queue.putMessage(message).getMessageId());
f?(g5o*2  
获取消息 :w7?]y6~S  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             Message msg = queue.popMessage();
  3.             if(msg!=null){
  4.             String messageBody = msg.getMessageBodyAsString();
  5.             String msgId = msg.getMessageId();
  6.             String receiptHandle = msg.getReceiptHandle();
r&~]6 U  
fVi[mH0=+  
删除消息 5fLp?`T  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             queue.deleteMessage(receipHandle); // 传入receive
1k{H,p7  
查看消息
'u_j5  
FS*J8)  
7 4hRG~  
并不会改变消息的状态,即被 PeekMessage 获取消息后消息仍然处于 Active 状态,仍然可被查看或消费
8k_hX^  
bzZ7L-yD  
: z\||f  
  1. System.out.println("---"+messageBody);CloudQueue queue = client.getQueueRef(queueName);
  2.             Message msg = queue.peekMessage();
  3.             String messageBody = msg.getMessageBodyAsString();
wBEBj7(y  
修改消息不可见时间 4Vd[cRh2  
  1. CloudQueue queue = client.getQueueRef(queueName);
  2.             Message message = new Message();
  3.             message.setMessageBody("test");
  4.             queue.putMessage(message); // 发送一条消息
  5.             Message msg = queue.popMessage(); //接收消息
  6.             String newReceiptHandle = queue.changeMessageVisibilityTimeout(
  7.             msg.getReceiptHandle(), 50); //第一个参数为旧的ReceiptHandle值,第二个参数为新的不可见时间(VisibilityTimeout)
XG5"u  
yvnvIy  
#fXy4iL l  
以上代码包括了api的基本操作。 9j5B(_J^  
-WGlOpg0;  
j_b/66JyN  
; NO#/  
Wxi;Tq9C@_  
              
QHtN_Q_F  
FR\r/+n:t0  
yP34h*0B  
初体验 之 总结
xX8 c>p  
目前我的小机器人已经使用了    mqs的消息队列,总而言之,Sdk封装后,接口使用简单,只需要了解了接口的概念,和一下方法的参数就可以很快的上手。不过建议使用者将先关的文档全部通读一下,也没有多少。 V3/OKI\o  
另外就是sdk建议对方法加上描述,和参数说明,或者提供一个文档,不然刚入还需要看一下源码,对一些方法只能根据名字猜测。
现在只是应用了mqs的延时消息做定时任务类题型,其实mqs还可以做很多事情 例如
定时消息(延迟服务)
          目前小机器人就是使用的定时消息。
多个应用之间的通信(外网访问,内网多应用)
         之后机器人会实现多渠道通信功能,比如网页发送qq题型消息,或者公告类消息。(已经在计划中
公告类消息推送
        mqs运行一个消息被多次消费,或者说查看。那么就可以作为公告类的消息通道来使用,一条公告被多个消费者查看。(可能会考虑这么干
任务执行类型消息(并且是有优先级的)
       很多应用需要在后台去执行不同的任务,通过MQS可以将任务执行和应用分离,并且按照优先级去执行。让你的应用功能解耦。单独的任务执行功能从MQS获取任务,然后去执行。这个记得之前做个一个采集类项目为了突破防采集就是使用这个原理干的,不过那时候还没有MQS,使用的是MQ.
SzG?m]  
目前想到的使用场景,也许大家有更多的使用方式和场景,快来试试吧
sBNqg~HwB?  
_6]tbni?v  
ghk"XJ|  
C\ 34R  
e'fo^XQn[  
{<cgeH  
y"H(F,(N  
            
aED73:b  
C k/DV  
#.LI `nYA  
初体验 之 建议&意见
0 Cyus  
1,文档有些乱,比如入门指南,和sdk没有很好的说明关联,最一开始都不知道入门指南里面的代码是sdk的。 uTy00`1  
J~N!. i  
-)DxF<8B  
2sdk的方法都没有说明,只能是根据入门指南的一些代码查看,另外看到sdk其实还提供一些别的方法,但是没有说明,只能去看源码了。 _OK!/T*FBt  
8boiJku`  
>B.KI}dE  
3,(这个应该是一个bugmqs控制台的消息和api的消息是不通的,我在控制台添加的消息在api获取到是乱码,在通过api添加的消息在控制台看到的也是加密之后的。这点不知道是什么原因,还望阿里工程狮看看。如果这里不互通,感觉页面上添加消息接口也没有什么意义。
SN$3cg]z  
UAC"jy1D  
raM{!T:  
BNixp[Hc  
1=^|  
最后特大字号告诉坚持读到这的你一个秘密,原来sdk的jar解压之后竟然有源码。。。。悲催的我自己弄了半天,原来有缘源码。。。。为啥不早点告诉我。另外就是源码的注释能不能多点啊? #5X+. !L  
04a@  
}3-`e3  
w(Q{;RNM;  
~6[3Km|2  
r6nWrO>y  
u\f Qa QV  
l_ LH!Tu  
Y*S(uqM  
v5W-f0Jo  
d\tA1&k71  
:6Gf@Z&+  
LXRIo2ynuw  
sDkO!P  
P[H 4Yp  
Qo80u? *  
\{o<-S;h  
0 R>!jw  
[ 此帖被啊里新人在2014-10-17 10:01重新编辑 ]
本帖最近评分记录: 5 条评分 云币 +24
bailimei 云币 +1 顶重口味 2014-10-14
sdh 云币 +1 2014-10-14
千鸟 云币 +1 支持一个。有Java的二进制class文件反编译成java文件工具 2014-10-14
boboan 云币 +1 good,补充下使用场景就更好了 2014-10-13
qiujin2012 云币 +20 支持他,就给他投票,猛戳: http://bbs.aliyun.com/read/178799.html 2014-10-13
关键词: 阿里云 MQS 活动
级别: 研究猿
发帖
3357
云币
4596

只看该作者 沙发  发表于: 2014-10-11
格式太坑了。。。。对于体育老师教语文的我来说只能做到这里了 hsw9(D>jp  
(~J^3O]Fo  
|#*'H*W  
%=BMZRn  
nQ/E5y  
Y X_ gb/A  
快来阿里云官方群体验小机器人吧 E.U_W  
%DQhM,c@  
;-Jb1"5  
?]4>rl}  
:(H>2xS,s  
阿里云•云上梦工厂 99206500 Z*FrB58  
Ii:>xuF&  
,do58i K  
[ 此帖被啊里新人在2014-10-14 10:33重新编辑 ]
级别: 菜鸟
发帖
64
云币
191
只看该作者 板凳  发表于: 2014-10-11
Re【阿里云产品公测】消息队列服务MQS产品应用
插楼点赞
本帖最近评分记录: 1 条评分 云币 +1
啊里新人 云币 +1 我做了一个艰难的决定 加点分给你 2014-11-08
级别: 程序猿
发帖
386
云币
408
只看该作者 地板  发表于: 2014-10-11
占楼支持
级别: 小白
发帖
7
云币
7
只看该作者 4楼 发表于: 2014-10-11
Re【阿里云产品公测】消息队列服务MQS产品应用
占楼坐等
级别: 研究猿
发帖
3357
云币
4596

只看该作者 5楼 发表于: 2014-10-11
   压力好大
发帖
994
云币
1363
只看该作者 6楼 发表于: 2014-10-11
占楼坐等
〉〉论坛经验-《阿里云服务器从入门到精通》精华汇总
http://bbs.aliyun.com/read/135619.html?amp;displayMode=1#tpc
级别: 研究猿
发帖
3357
云币
4596

只看该作者 7楼 发表于: 2014-10-13
回 6楼(qiujin2012) 的帖子
终于算写出来了
发帖
994
云币
1363
只看该作者 8楼 发表于: 2014-10-13
支持他,就给他投票,猛戳: tl^;iE!-  
http://bbs.aliyun.com/read/178799.html
〉〉论坛经验-《阿里云服务器从入门到精通》精华汇总
http://bbs.aliyun.com/read/135619.html?amp;displayMode=1#tpc
级别: 菜鸟
发帖
34
云币
46
只看该作者 9楼 发表于: 2014-10-13
good,补充下使用场景就更好了
级别: 研究猿
发帖
3357
云币
4596

只看该作者 10楼 发表于: 2014-10-13
回 9楼(boboan) 的帖子
恩,有空了在补充一下,论坛排版弄一下午
级别: 小白
发帖
19
云币
28
只看该作者 11楼 发表于: 2014-10-13
Re【阿里云产品公测】消息队列服务MQSjavaSDK机器人应用初体验
jar里面点击方法进去 不就能看到源码
级别: 研究猿
发帖
3357
云币
4596

只看该作者 12楼 发表于: 2014-10-14
回 11楼(皇族) 的帖子
恩是的那是看到,阿里吧源码放进去了。我想如果不是初体验,肯定是对sdk有一些不一样的需求,那时候可能就需要修改源码了
级别: 研究猿
发帖
3357
云币
4596

只看该作者 13楼 发表于: 2014-10-14
回 9楼(boboan) 的帖子
已经补充了目前想到的场景,也许大家有更多需求
级别: 分析狮
发帖
1559
云币
5022
只看该作者 14楼 发表于: 2014-10-14
支持一个。有Java的二进制class文件反编译成java文件工具
发表主题 回复主题
« 返回列表
«1234»
共4页
上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)