天天看点

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

前言

由于抢占式实例天然具有被中断的风险,并且在实例中断前至少5分钟,系统会向您发送中断消息。因此如果您的应用对中断敏感,就需要格外注意如下两点:

• 恰当地接收中断事件

• 合理地处理中断

关于第一点, 本文总结了几种接收中断事件的方式,欢迎各位体验接入。

方式1: 云监控对接, 事件触发方式

所有抢占式实例中断消息都会作为系统事件, 投递到

云监控

。云监控提供了强大的能力, 您可以在云监控订阅该事件, 并将事件投递到需要的消费的地方, 例如:

• 投递到MQ消息队列, 方便与您系统对接, 并执行相应代码

• 投递到SLS日志服务, 方便进行中断统计

• 投递到邮件/钉钉/短信等通道, 方便您能收到提醒.

• 投递到自定义的函数中, 方便进行中断处理

• 等等...

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

第一步: 配置实例中断事件

1. 创建事件报警

"

" > "事件监控" > "报警规则" > "系统事件" > "创建事件报警"

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

2. 选择合适事件

事件类型: "抢占式实例中断通知"

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

第二步: 投递实例中断事件

1. 投递到消息队列(MNS)

(1)创建消息队列(MNS)

• 进入 消息队列控制台 • 创建&配置队列
抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

(2)投递抢占式实例中断消息到MNS

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

(3)应用接入MNS SDK

此步骤不再赘述, 具体参见

MNS文档

2. 投递到函数计算

(1)创建中断处理函数

函数计算控制台

->新建函数->事件函数->配置函数(此处以python2.7为例)

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

(2)编写中断处理函数

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

函数样例代码如下:

# -*- 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"
}
           
抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式
抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

第三步: 模拟投递消息, 进行链路调试

前两步对接完成之后, 怎么能验证代码是正确的呢? 云监控提供强大的调试功能, 能模拟消息产生, 方便进行调试:

抢占式实例接收中断消息指南前言方式1: 云监控对接, 事件触发方式第三步: 模拟投递消息, 进行链路调试方式2: 直接API对接, 轮询方式

抢占式实例中断消息, 模拟内容如下:

{
    "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对接, 轮询方式

具体请参见:

查询抢占式实例中断事件

一文。