前言
由於搶佔式實例天然具有被中斷的風險,並且在實例中斷前至少5分鐘,系統會向您發送中斷消息。因此如果您的應用對中斷敏感,就需要格外注意如下兩點:
• 恰當地接收中斷事件
• 合理地處理中斷
關於第一點, 本文總結了幾種接收中斷事件的方式,歡迎各位體驗接入。
方式1: 雲監控對接, 事件觸發方式
所有搶佔式實例中斷消息都會作為系統事件, 投遞到雲監控。雲監控提供了強大的能力, 您可以在雲監控訂閱該事件, 並將事件投遞到需要的消費的地方, 例如:
• 投遞到MQ消息隊列, 方便與您系統對接, 並執行相應代碼
• 投遞到SLS日誌服務, 方便進行中斷統計
• 投遞到郵件/釘釘/短信等通道, 方便您能收到提醒.
• 投遞到自定義的函數中, 方便進行中斷處理
• 等等...
第一步: 配置實例中斷事件
1. 創建事件報警
"雲監控" > "事件監控" > "報警規則" > "系統事件" > "創建事件報警"
2. 選擇合適事件
事件類型: "搶佔式實例中斷通知"
第二步: 投遞實例中斷事件
1. 投遞到消息隊列(MNS)
(1)創建消息隊列(MNS)
• 進入消息隊列控制檯
• 創建&配置隊列
(2)投遞搶佔式實例中斷消息到MNS
(3)應用接入MNS SDK
此步驟不再贅述, 具體參見 MNS文檔
2. 投遞到函數計算
(1)創建中斷處理函數
函數計算控制檯->新建函數->事件函數->配置函數(此處以python2.7為例)
(2)編寫中斷處理函數
函數樣例代碼如下:
# -*- 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"
}
第三步: 模擬投遞消息, 進行鏈路調試
前兩步對接完成之後, 怎麼能驗證代碼是正確的呢? 雲監控提供強大的調試功能, 能模擬消息產生, 方便進行調試:
搶佔式實例中斷消息, 模擬內容如下:
{
"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對接, 輪詢方式
具體請參見: 查詢搶佔式實例中斷事件 一文。