阿里雲ons佇列監控api深度使用

蘇小林發表於2019-04-18

文件地址:

  1. help.aliyun.com/document_de…
  2. help.aliyun.com/document_de…

拿獲取 查詢消費堆積 這個關鍵監控介面舉例

建立專案並引入監控包和客戶端包

建立spring boot專案

阿里雲ons佇列監控api深度使用

引入lombok和web包

阿里雲ons佇列監控api深度使用

客戶端包用來傳送/消費測試訊息

<!-- https://mvnrepository.com/artifact/com.aliyun.openservices/ons-client -->
<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>ons-client</artifactId>
    <version>1.8.0.Final</version>
</dependency>
複製程式碼

監控包用來查詢當前的傳送或者消費狀態

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <optional>true</optional>
    <version>4.3.3</version>
  </dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-ons</artifactId>
    <version>3.1.0</version>  <!-- 設定為最新版本號 -->
</dependency>
複製程式碼

設定生產者和消費者客戶端連線引數

先在 ons.console.aliyun.com/ 頁面上建立測試topic和groupId 連線引數從:usercenter.console.aliyun.com/#/manage/ak 獲取

protected Properties getProperties() {
    Properties properties = new Properties();
    // 您在控制檯建立的 Group ID
    properties.put(PropertyKeyConst.GROUP_ID, "xxx");
    // 鑑權用 AccessKey,在阿里雲伺服器管理控制檯建立
    properties.put(PropertyKeyConst.AccessKey, "xxx");
    // 鑑權用 SecretKey,在阿里雲伺服器管理控制檯建立
    properties.put(PropertyKeyConst.SecretKey, "xxx");
    // 設定 TCP 接入域名,進入控制檯的例項管理頁面,在頁面上方選擇例項後,在例項資訊中的“獲取接入點資訊”區域檢視
    properties.put(PropertyKeyConst.NAMESRV_ADDR, "http://MQ_INST_1031505832294665_BaUk7MNM.mq-internet-access.mq-internet.aliyuncs.com:80");
    return properties;
}
複製程式碼

編寫測試生產者

@Test
public void send() throws Exception {
    Properties properties = getProperties();
    Producer producer = ONSFactory.createProducer(properties);
    // 在傳送訊息前,必須呼叫 start 方法來啟動 Producer,只需呼叫一次即可
    producer.start();

    for (int i = 0; i< 1000; i ++) {
        //傳送訊息
        Message msg = new Message( //
                // 在控制檯建立的 Topic,即該訊息所屬的 Topic 名稱
                "APP_DELAY_TOPIC",
                // Message Tag,
                // 可理解為 Gmail 中的標籤,對訊息進行再歸類,方便 Consumer 指定過濾條件在訊息佇列 RocketMQ 伺服器過濾
                "TagA",
                // Message Body
                // 任何二進位制形式的資料, 訊息佇列 RocketMQ 不做任何干預,
                // 需要 Producer 與 Consumer 協商好一致的序列化和反序列化方式
                "Hello MQ".getBytes());
        // 設定代表訊息的業務關鍵屬性,請儘可能全域性唯一,以方便您在無法正常收到訊息情況下,可通過控制檯查詢訊息並補發
        // 注意:不設定也不會影響訊息正常收發
        msg.setKey("ORDERID_100");
        // 傳送訊息,只要不拋異常就是成功
        // 列印 Message ID,以便用於訊息傳送狀態查詢
        SendResult sendResult = producer.send(msg);
        log.info("Send Message success. Message ID is: " + sendResult.getMessageId());
        log.info("messageId: " + sendResult.getMessageId());
        Thread.sleep(500);
    }
    // 在應用退出前,可以銷燬 Producer 物件
    // 注意:如果不銷燬也沒有問題
    producer.shutdown();
}
複製程式碼

並啟動檢視效果

阿里雲ons佇列監控api深度使用

編寫測試消費者

@Test
public void consumer() throws Exception {
    Properties properties = getProperties();
    Consumer consumer = ONSFactory.createConsumer(properties);
    consumer.subscribe("APP_DELAY_TOPIC", "TagA", new MessageListener() {
        @Override
        public Action consume(Message message, ConsumeContext context) {
            System.out.println("OnsServiceImpl Receive: " + message);
            return Action.CommitMessage;
        }
    });
    consumer.start();
    System.out.println("Consumer Started");
    Thread.sleep(600000);
}
複製程式碼

並啟動檢視效果

阿里雲ons佇列監控api深度使用

編寫監控資料查詢程式碼

instanceId 從:ons.console.aliyun.com/ 頁面獲取 regionId 從:help.aliyun.com/document_de… 頁面獲取

/**
 * 查詢消費堆積
 */
@Test
public void messageCount() throws Exception {
    /**
     * Open API 的接入點,設定為目標 Region
     */
    String regionId = "mq-internet-access";

    /**
     * 例項id
     */
    String instanceId = "xxx";

    IClientProfile profile = DefaultProfile.getProfile(
            regionId,
            getProperties().getProperty(PropertyKeyConst.AccessKey),
            getProperties().getProperty(PropertyKeyConst.SecretKey)
    );
    IAcsClient iAcsClient = new DefaultAcsClient(profile);
    //構造 Request 物件:這裡以 TopicList 介面為例子,不同的 API 介面構造不同的 Request 物件
    OnsConsumerAccumulateRequest request = new OnsConsumerAccumulateRequest();
    request.setPreventCache(System.currentTimeMillis()); //當前時間戳
    request.setGroupId(getProperties().getProperty(PropertyKeyConst.GROUP_ID));
    request.setInstanceId(instanceId);
    OnsConsumerAccumulateResponse response = iAcsClient.getAcsResponse(request);
    log.info(JSON.toJSONString(response));
}
複製程式碼

啟動檢視效果

阿里雲ons佇列監控api深度使用

核查返回的json資料

{
    "data":{
        "consumeTps":0.37,
        "delayTime":0,
        "detailInTopicList":[

        ],
        "lastTimestamp":1505558727362,
        "online":true,
        "totalDiff":19
    },
    "requestId":"FBE09C28-CCEF-447A-878A-C79136EBCC9F"
}
複製程式碼

通過文件描述:help.aliyun.com/document_de… 核對返回的json欄位

阿里雲ons佇列監控api深度使用

找到關鍵欄位供監控顯示

相關文章