阿里Log Service使用之消费者

一、评价:服务器的性能还算不错,但clinet端代码规范来看,不敢恭维,感觉是大佬带着校招实习生做的,用户体验有点差

简单的列举一下:

        首先,提供的client端jar包中的代码,代码风格层次不齐,方法名有大写的情况。还有提供的getter和setter方法,但属性定义成为public的情况

        其次,关于官方文档,关于Java SDK的代码示例,太过于敷衍,问题还是比较大的,代码也只是“能用”这一个优点

        最后,官方文档错误百出,有些注释与功能完全不一致,甚至两个作用相反的注释都弄错了,例如:from_unixtime与to_unixtime

二、简介

       刚接触的时候我也是一脸懵逼,所以这里我简单的介绍一下,可以方便理解,在服务器中存放的数据类型都是QueriedLog类型,有一些固定的字段,是官方定义的,一般可以不用管;还有就是需要的字段,是以key-value的方式存储,所以当你拿出来的时候(拿取方法在“使用”中),拿出后要根据自己的需要,进行数据转换。Log Service是一个生产者/消费者模式的,有点像Kafka

三、字段理解

1、endpoint(服务入口):是指数据是通过哪个服务入口,这个根据自己的情况从官网找,是XXXX.com的那些

    网址:https://help.aliyun.com/document_detail/29008.html?spm=a2c4g.11186623.6.917.4aeb20casTRveb

2、accessKeyId(访问密钥Id):这个是到阿里注册才能拿到的

3、accessKeySecret(访问密钥):同上

4、project(项目):类似MySQL的库的概念

5、store(存储):类似MySQL的表的概念

6、topic(主题):类似Kafka的主题概念,当生产者在发送数据的时候指定了topic,消费者在消费时也要指定topic才能消费

四、使用,我对官网的代码做了修改,因为个别地方确实是问题太多

        // 这里通过传值的方式,将client从上一层创建出来,这样可以不会频繁创建,request是我自己定义的
        Client client = request.getClient();
        // 项目名称
        String project = request.getProject();
        // 项目的库
        String logStore = request.getLogStore();
        // 这里是我自定义的字段,其实是存放query的代码
        String query = request.getAliSql();
        int startTime =  request.getStartTime();
        int endTime = request.getEndTime();

        String topic = request.getTopic();

        GetHistogramsResponse res3 = null;
        histogramsRun = true;

        // 查询日志分布情况
        while (histogramsRun) {
            GetHistogramsRequest req3 = new GetHistogramsRequest(project, logStore, topic, query, startTime, endTime);
            try {
                res3 = client.GetHistograms(req3);
            } catch (LogException e) {
                LOG.error(e.getMessage(), e);
                break;
            }
            if (res3 != null && res3.IsCompleted()) {
                //这里本身使用break是可以的,我这里做了代码保护,通过histogramsRun的boolean值来判断while是否运行
                histogramsRun = false;
                break;
            }
        }

        // 获取相关记录的记录数
        long totalLogLines = res3.GetTotalCount();

        // 查询日志数据
        List<QueriedLog> queriedLogList = new LinkedList<>();

        // 上面的操作是不会查询出想要的数据的,下方的操作才是查询数据的
        // 目的是当需求只是需要查询记录数,并且上面操作的记录与下方查出的记录数相同时,可以避免过多的操作,通过selected进行控制
        if (request.isSelected()) {
            int logOffset = 0;
            logRun =true;

            while (logRun) {
                GetLogsResponse res4 = null;
                GetLogsRequest req4 = null;

                // 这里需要格外注意,当有query条件时,是不能通过offset的值进行分片查询的
                if (!"".equalsIgnoreCase(query) && query != null) {
                    // 通过条件进行查询,这里可以待优化,通过limit做分片查询
                    query += (" limit " + totalLogLines);
                    req4 = new GetLogsRequest(project, logStore, startTime, endTime, topic, query);
                    logRun = false;
                } else {
                    // 通过offset进行分片查询,但当query有条件的时候,不能使用offset进行分片
                    req4 = new GetLogsRequest(project, logStore, startTime, endTime, topic, query, logOffset, logLine, false);
                }
                try {
                    res4 = client.GetLogs(req4);
                } catch (LogException e) {
                    LOG.error(e.getMessage(), e);
                }

                logOffset += logLine;

                // 当查询不出值的时候要终止查询
                if (res4 == null || (res4 != null && res4.GetLogs().isEmpty())) {
                    logRun = false;
                }

                // 将查询出来的值进行存储
                if (res4 != null) {
                    queriedLogList.addAll(res4.GetLogs());
                }
            }
        }

 

转载于:https://my.oschina.net/u/2430231/blog/3020552

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值