阿里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());
                }
            }
        }
相關文章
相關標籤/搜索