開發與維運

搶佔式實例接收中斷消息指南

前言

由於搶佔式實例天然具有被中斷的風險,並且在實例中斷前至少5分鐘,系統會向您發送中斷消息。因此如果您的應用對中斷敏感,就需要格外注意如下兩點:

• 恰當地接收中斷事件
• 合理地處理中斷

關於第一點, 本文總結了幾種接收中斷事件的方式,歡迎各位體驗接入。

方式1: 雲監控對接, 事件觸發方式

所有搶佔式實例中斷消息都會作為系統事件, 投遞到雲監控。雲監控提供了強大的能力, 您可以在雲監控訂閱該事件, 並將事件投遞到需要的消費的地方, 例如:
• 投遞到MQ消息隊列, 方便與您系統對接, 並執行相應代碼
• 投遞到SLS日誌服務, 方便進行中斷統計
• 投遞到郵件/釘釘/短信等通道, 方便您能收到提醒.
• 投遞到自定義的函數中, 方便進行中斷處理
• 等等...

image.png

第一步: 配置實例中斷事件

1. 創建事件報警

"雲監控" > "事件監控" > "報警規則" > "系統事件" > "創建事件報警"

image.png

2. 選擇合適事件

事件類型: "搶佔式實例中斷通知"

image.png

第二步: 投遞實例中斷事件

1. 投遞到消息隊列(MNS)
(1)創建消息隊列(MNS)

• 進入消息隊列控制檯
• 創建&配置隊列

image.png

(2)投遞搶佔式實例中斷消息到MNS

image.png

(3)應用接入MNS SDK
此步驟不再贅述, 具體參見 MNS文檔

2. 投遞到函數計算

(1)創建中斷處理函數
函數計算控制檯->新建函數->事件函數->配置函數(此處以python2.7為例)

image.png

(2)編寫中斷處理函數

image.png

函數樣例代碼如下:

# -*- coding: utf-8 -*-
import logging
import json, random, string, time
LOGGER = logging.getLogger()
clt = None
def handler(event, context):
  '''
  {
    "product": "ECS",
    "resourceId": "acs:ecs:cn-shanghai:1331602849963181:instance/i-abcdef",
    "level": "WARN",
    "instanceName": "instanceName",
    "regionId": "cn-hangzhou",
    "name": "Instance:PreemptibleInstanceInterruption",
    "content": {
        "instanceId": "i-abcdef",
        "action": "delete"
    },
    "status": "Normal"
}
  '''
  evt = json.loads(event)
  content = evt.get("content");
  regionId = evt.get("regionId");
  instanceId = content.get("instanceId");
  LOGGER.info( regionId + " " + instanceId + " termination ongoing");

3. 測試中斷處理函數

使用如下觸發事件樣例, 進行"Invoke"測試:

{
    "product": "ECS",
    "resourceId": "acs:ecs:cn-shanghai:1331602849963181:instance/i-abcdef",
    "level": "WARN",
    "instanceName": "instanceName",
    "regionId": "cn-hangzhou",
    "name": "Instance:PreemptibleInstanceInterruption",
    "content": {
        "instanceId": "i-abcdef",
        "action": "delete"
    },
    "status": "Normal"
}

image.png

image.png

第三步: 模擬投遞消息, 進行鏈路調試

前兩步對接完成之後, 怎麼能驗證代碼是正確的呢? 雲監控提供強大的調試功能, 能模擬消息產生, 方便進行調試:

image.png

搶佔式實例中斷消息, 模擬內容如下:

{
    "product": "ECS",
    "resourceId": "acs:ecs:cn-shanghai:1331602849963181:instance/i-abcdef",
    "level": "WARN",
    "instanceName": "instanceName",
    "regionId": "cn-hangzhou",
    "name": "Instance:PreemptibleInstanceInterruption",
    "content": {
        "instanceId": "i-abcdef",
        "action": "delete"
    },
    "status": "Normal"
}

方式2: 直接API對接, 輪詢方式

具體請參見: 查詢搶佔式實例中斷事件 一文。

Leave a Reply

Your email address will not be published. Required fields are marked *