开发者社区> 问答> 正文

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

啊里新人 2014-10-11 14:00:19 25306
先去投票,回来再看内容吧 http://bbs.aliyun.com/read/178799.html
文章编号18




初体验 之 测评环境
                           由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后使用mqs应用到我的程序中在阿里云的ecs中运行


先上一张图这是初体验结果

[attachment=62447]      
开始正文                    

         本地模式
[attachment=62439]
                          
                           网络环境
[attachment=62441]

    阿里云服务器环境
[attachment=62442]
                        

    
初体验 之 准备测试

首先就是阅读一下阿里的文档,以及介绍这个事必要的,磨刀不误砍柴工功么!建议大概的通读一下,然后可以将入门指南仔细看一下,里面包含了详细的操作,以及一些demo,包括界面上的操作,和java,Python的。可以让你很快的上手。

MQS基本概念
MQS功能和特点
MQS安全和可靠性
MQS限制与局限
MQS服务访问和地域
MQS API&SDK
MQS使用指南


通读之后有几点我提一下
1,MQS是支持外网访问的,这意味着你即使不是阿里的服务器也可以使用MQS
2,MQS的保留时间最长15天
3,消息最长64KB
4,队列个数和消息个数没有限制(不知道公测之后会怎么计算)
5,消息不保证按照生产的先后顺序被消费,(因为是集群的,只是保证优先)



                    

初体验 之 本地基础测试

用了大概一下午的时间看阿里提供的所有帮助和文档,在脑海里基本有了一个印象,提供一套http的api,并提供几个版本的sdk,我就选择的顺手的java sdk测试了。

这里要说的是大家可以在入门指南中看到有示例代码。如果不是细心看完所有的文档,这里可能会让初接触者有些不容易找到sdk和示例代码之间的关系。关于这点稍后再说。

测试内容

1,外网消息生产速度

2,外网消息消费速度

3,定时消息延迟情况

4,消息的先后消费情况


测试基于javasdk,直接循环发送10000调消息,求平均时间

最终的测试结果为


发送消息测试10000调

发送时间538639毫秒,不到九分钟,平均18.58条/每秒


获取消息10000调

361956s         约6分钟,平均27.62 条/每秒


获取消息并删除
729420s    约12.157 分钟   平均 平均 13.7条



以上数据看来,get消息要比put消息快一些,


以上测试都是单线程测试。





另外对定时消息做了一个测试,测试的过程依然是10000调消息,

一个生产者,四个消费者,同时开始工作,定时10s



平均时间在11s接收并消费成功,四个消费者的消费个数也在2500左右, 下面两张是运行最后的截图,(秒级别的消息提醒已经满足我的应用需求,稍后的应用会用到。这里还是比较开心的解决了我的一个一直想做的小功能。)

[attachment=62443][attachment=62444]


本地基本上就做这些测试都是基于外网访问,相信如果放在ecs之后内网访问效率会更高!,然后就准备进入实战阶段了。嵌入我的应用,应用才是王道。



                  

MQS初体验 之 应用实战





我的应用比较特殊,是个小机器人,提供一些公共服务,比如天气,歌词,成语学习,小游戏。本次的测试想通过mqs的定时消息,实现一些生活中的小提醒功能。



就拿我本程序猿来说,公司的上班时间是弹性制的,但是每次快到下班的时候总是忘记了具体是什么时候到公司的,要不需要问前台,(不太合适吧?嘿嘿),还有个办法就是看开机时间这个也差不了多少,但是看开始时间还是需要个cmd,或者我的电脑看启动日志,或者任务管理器看,(不过这里我总是觉得不太准)。如果这时候,当我到下班时间直接有个qq消息告诉我可以走了。是不是就爽了很多哈哈



先展示一下目前的实现
[attachment=62447]



    由于时间的原因,目前还不成熟,文案也有一点小问题,不过定时消息结合mqs的架构已经基本实现,慢慢把MQS用起来,改进一下,实现我的目标,(我的目标是用我的代码服务的我生活。)


下面说一下实现,我使用的javaSDK版本,其实很简单,如果仔细看就会发现在入门教程中是有demo的,我刚看一些文档的时候还抱怨没有教程,在我看完所有帮助文档说明之类的之后总算是看到了,(这里稍后有话要说)

首先建议通读一下 入门指南  然后去下载sdk,




       这里阿里有说明如果是 maven环境很简单,只需要在项目的pom.xml 添加 代码即可。相应的依赖包就可以加载进来,

<dependencies>
  <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-mqs</artifactId>
    <version>1.0.0</version>
  </dependency>
  </dependencies>

我使用的不是maven环境,这里也有全部依赖包的打包下载  传送门  


然后解压到项目就可以了,这里我就遇到一个坑,我的源码使用了和mqs的包有重叠,并且版本冲突。我哭了,没办法,只要修改了源码。(不多说都是泪)




Java的sdk对队列的操作都做了基本的封装。以下将常用的代码列一下,


Mqs 的客户端实例化

很简单只需要提供一个访问地址,以及你自己的应用key,secret
static String url = "http://iveo7.mqs-cn-qingdao.aliyuncs.com";
    static String key = "******";
    static String secret = "********";
static MQSClient client = new DefaultMQSClient(url, key, secret);



首先就是创建一个队列

QueueMeta meta = new QueueMeta();
        meta.setQueueName(queueName);
        meta.setDelaySeconds(0L); // 发送到该Queue所有消息的延迟可见时间,单位为秒
        meta.setMaxMessageSize(65530L); // 消息体的最大长度,单位为byte
        meta.setMessageRetentionPeriod(345600L); // 消息的最长存活时间,单位为秒
        meta.setVisibilityTimeout(30L); // 消息取出后维持不可见状态的时间,单位为秒
        meta.setPollingWaitSeconds(0);// 长轮询等待时间,单位为秒,默认为0
            CloudQueue queue = client.getQueueRef(queueName); // 通过client结构生成本地的Queue对象
            System.out.println(queue.create(meta));


这里创建队列方法返回的是队列访问地址,例如


http://iveo7.mqs-cn-qingdao.aliyuncs.com/dddddd




获取消息队列列表

do {
                PagingListResult<String> list = client.listQueueURL("", marker, 2);
                // 第一个参数为queue名称的前缀
                // 第二个参数marker为下一个分页的开始位置
                // 第三个参数为一次list返回的最多队列个数
                List<String> queues = list.getResult();// 返回Queue的URL
                for (int i = 0; i < queues.size(); i++) {
                    System.out.println(queues.get(i));
                }
                marker = list.getMarker();
            } while (marker != null && marker != "");



结果

http://iveo7.mqs-cn-qingdao.aliyuncs.com/MyQueue

http://iveo7.mqs-cn-qingdao.aliyuncs.com/dddddd

修改队列属性

CloudQueue queue = client.getQueueRef(queueName);
            QueueMeta queueMeta = queue.getAttributes(); // 如果Queue未创建,则此处
            // 抛出异常提示QueueNotExist,通过4.1节方法进行创建
            queueMeta.setDelaySeconds(50L);
            queue.setAttributes(queueMeta);

获取队列属性
CloudQueue queue = client.getQueueRef(queueName);
            QueueMeta queueMeta = queue.getAttributes();
            System.out.println(queueMeta.getQueueName()); // 队列名称
            System.out.println(queueMeta.getDelaySeconds()); // 队列延迟属性
            System.out.println(queueMeta.getMessageRetentionPeriod());// 存活时间
            System.out.println(queueMeta.getMaxMessageSize());// 消息最大长度
            System.out.println(queueMeta.getCreateTime());// 队列创建时间
            System.out.println(queueMeta.getLastModifyTime());// 队列最近修改时间
            System.out.println(queueMeta.getActiveMessages());// 活跃的消息数
            System.out.println(queueMeta.getInactiveMessages());// 非活跃消息数
            System.out.println(queueMeta.getQueueURL());// 队列访问的URL地址
            System.out.println(queueMeta.getPollingWaitSeconds());// 长轮询等待时间

删除队列
CloudQueue queue = client.getQueueRef(queueName);
            queue.delete();

发送消息
CloudQueue queue = client.getQueueRef(queueName);
            Message message = new Message();
            message.setMessageBody(msg);//消息内容
            message.setDelaySeconds(1000);//消息延时时间
            message.setPriority(8); // 消息的优先级,优先级越高的消息,越容易更早被消费
            System.out.println(queue.putMessage(message).getMessageId());

获取消息
CloudQueue queue = client.getQueueRef(queueName);
            Message msg = queue.popMessage();
            if(msg!=null){
            String messageBody = msg.getMessageBodyAsString();
            String msgId = msg.getMessageId();
            String receiptHandle = msg.getReceiptHandle();


删除消息
CloudQueue queue = client.getQueueRef(queueName);
            queue.deleteMessage(receipHandle); // 传入receive

查看消息



并不会改变消息的状态,即被 PeekMessage 获取消息后消息仍然处于 Active 状态,仍然可被查看或消费



System.out.println("---"+messageBody);CloudQueue queue = client.getQueueRef(queueName);
            Message msg = queue.peekMessage();
            String messageBody = msg.getMessageBodyAsString();

修改消息不可见时间
CloudQueue queue = client.getQueueRef(queueName);
            Message message = new Message();
            message.setMessageBody("test");
            queue.putMessage(message); // 发送一条消息
            Message msg = queue.popMessage(); //接收消息
            String newReceiptHandle = queue.changeMessageVisibilityTimeout(
            msg.getReceiptHandle(), 50); //第一个参数为旧的ReceiptHandle值,第二个参数为新的不可见时间(VisibilityTimeout)



以上代码包括了api的基本操作。




              



初体验 之 总结

目前我的小机器人已经使用了    mqs的消息队列,总而言之,Sdk封装后,接口使用简单,只需要了解了接口的概念,和一下方法的参数就可以很快的上手。不过建议使用者将先关的文档全部通读一下,也没有多少。
另外就是sdk建议对方法加上描述,和参数说明,或者提供一个文档,不然刚入还需要看一下源码,对一些方法只能根据名字猜测。
现在只是应用了mqs的延时消息做定时任务类题型,其实mqs还可以做很多事情 例如
定时消息(延迟服务)
          目前小机器人就是使用的定时消息。
多个应用之间的通信(外网访问,内网多应用)
         之后机器人会实现多渠道通信功能,比如网页发送qq题型消息,或者公告类消息。(已经在计划中
公告类消息推送
        mqs运行一个消息被多次消费,或者说查看。那么就可以作为公告类的消息通道来使用,一条公告被多个消费者查看。(可能会考虑这么干
任务执行类型消息(并且是有优先级的)
       很多应用需要在后台去执行不同的任务,通过MQS可以将任务执行和应用分离,并且按照优先级去执行。让你的应用功能解耦。单独的任务执行功能从 MQS 获取任务,然后去执行。这个记得之前做个一个采集类项目为了突破防采集就是使用这个原理干的,不过那时候还没有 MQS ,使用的是 MQ.

目前想到的使用场景,也许大家有更多的使用方式和场景,快来试试吧







            



初体验 之 建议&意见

1,文档有些乱,比如入门指南,和sdk没有很好的说明关联,最一开始都不知道入门指南里面的代码是sdk的。


2,sdk的方法都没有说明,只能是根据入门指南的一些代码查看,另外看到sdk其实还提供一些别的方法,但是没有说明,只能去看源码了。


3,(这个应该是一个bug)mqs控制台的消息和api的消息是不通的,我在控制台添加的消息在api获取到是乱码,在通过api添加的消息在控制台看到的也是加密之后的。这点不知道是什么原因,还望阿里工程狮看看。如果这里不互通,感觉页面上添加消息接口也没有什么意义。
[attachment=62459]

[attachment=62460]


最后特大字号告诉坚持读到这的你一个秘密,原来sdk的jar解压之后竟然有源码。。。。悲催的我自己弄了半天,原来有缘源码。。。。为啥不早点告诉我。另外就是源码的注释能不能多点啊?

















消息中间件 弹性计算 机器人 Java BI API 开发工具 Maven 数据安全/隐私保护 Python
分享到
取消 提交回答
全部回答(18)
  • qwdqwdqw
    2014-11-27 20:17:44
    Re【阿里云产品公测】消息队列服务MQSjavaSDK机器人应用初体验
    学写了            
    0 0
  • 末日
    2014-11-24 16:17:41
    Re【阿里云产品公测】消息队列服务MQSjavaSDK机器人应用初体验
    虾米玩意
    0 0
  • 净尘
    2014-11-22 03:07:57
    不错
    0 0
  • 蓝色之鹰
    2014-11-01 20:29:39
    好帖不要沉

    -------------------------

    很好很强大,有时间回去试下

    0 0
  • idevcloud
    2014-10-27 12:56:47
    引用第1楼啊里新人于2014-10-11 14:00发表的  :
    格式太坑了。。。。对于体育老师教语文的我来说只能做到这里了

    [attachment=62462]


    .......
    做得一手好广告。已经申请了。

    -------------------------

    回 37楼(啊里新人) 的帖子
    我在群里。
    0 0
滑动查看更多

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题