阿里Log Service使用之消费者

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

简单的列举一下:java

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

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

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

2、简介unix

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

3、字段理解代码规范

一、endpoint(服务入口):是指数据是经过哪一个服务入口,这个根据本身的状况从官网找,是XXXX.com的那些code

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

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

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

四、project(项目):相似MySQL的库的概念

五、store(存储):相似MySQL的表的概念

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

4、使用,我对官网的代码作了修改,由于个别地方确实是问题太多

// 这里经过传值的方式,将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());
                }
            }
        }
相关文章
相关标签/搜索