前言
由于抢占式实例天然具有被中断的风险,并且在实例中断前至少5分钟,系统会向您发送中断消息。因此如果您的应用对中断敏感,就需要格外注意如下两点:
• 恰当地接收中断事件
•[ g r 合理地处理中断
关于第一点, 本文总结了几种接收中断事件的方式,欢迎各位体验接入。
方式1: 云监控对接/ ~ D L, 事件触发方式
所有抢占式实例中断消息都会作为系统事件, 投递到云监控。云监控提供了强大的能力, 您可以在云监控订阅该事件, 并将事件投递到需要的消费的地方, 例如:
• 投递^ l * ! } a到MQ消息队列, 方便与您系统对接, 并执行相应代码
• 投递到SLS日志服务h @ u = 6 x K v -, 方便进行中断统计
• 投递到邮件/钉钉/短信等通道, 方便您能收到提醒.
• 投递到自定义的函数中, 方便进行中) ^ L断( d & , { 8 ] w d处理
• 等等...
第一步: 配置实例中断事件
1. 创建事件报) 9 Z 0 !警
"云) O i F t % l 6监控4 D X ( # n c , " > "事件监控"e 6 ~ t z ^ E 0 > "报警规则A . E G h c" > "系统事件" >M W e = H M "创建事件报警"
2. 选择合适事件
事件类型: "抢占式实例中断通知"
第二步: 投递实例中断事件
1. 投: r m &递到消息队列(MNSv D 7)
(1)创建消息队列(MNS)
• 进入消息队列控制台
• 创建&配置队列
(2)投递抢占式实例中断消息到MNS
(3)应用接入MNS SDK
此步骤不再赘述, 具体参见 MNS文档
2. 投递到函数计算
(1)创建中断处理函数
函数计算控制台->新建函数->事件函数->配置函数(此处以python2.7为例)
(2)编写中断处理函数
函数样例代5 D | X码如下:
# -*- codingi 2 , d a -: utf-8 -*-
import logging
import json, random, string, time
LOGGER = logging.getLogge] W $ % u &r()
clt = None
def handler(event, context):
'''
{
"product": "ECS` : - x : X 7 S A",` j O
"resourceId"5 I 7: "acs:ew # t 8 W S @ B 7cs:cn-shanghai:13316028499_ I i & a R Y b Q63181:instance/i-abcdef",
"level":L X j 9 x k "WARN",
"instat a _ ~ A _ Zncew m 0 T k mName": "instanceName",
"regionId": "cn-hangzhou",
"nU ~ c # A [ame": "Instance:PreemptibleInstanceInterruption",
"content": {
Y x f M l 9 = h"instanceId": "iW ~ j s B ~ ^ 4-a C 9 # /abcdef",
"action": "delete"
},
"status": "Normal"
}
'''
evt = json.loadl ; z A *s(evei L R Wnt)
content = evt.g/ v = Iet([ Q S [ p q 4 ` h"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-abcdefH 5 s +",
"7 4 = 7 ^level": "WARN",
"instanceName": "instanceName",
"regionId": "cn-hangzhou",
"name": "Instance:PreemptibleInstanceInterruption",
"d k 5content": {
"ij w 9 ^nstanceIdV # t % ~ 2 h -": "i-a b F j 6 z ? +bcdef",
"action": "delete"
}y C ! e p d 0 e,
"status": "NormalX N 7 X ~ & F"
}
第三步: 模拟投递消息, 进行链路调试
前两步对接完成之后, 怎么能验证代码是正确的呢? 云监控提供强大的调试功能, 能模拟消息产生, 方便进行调试:
抢占式实例中断消息, 模拟内容如下:
{
"product": "ECS",
"resoh ? BurceId": "acT H 7s:ecs:cn-shanghai:1331602849963181:instance/i-abcdef",
"level": "WARN",
"instanceName": "instanceName",
"regionId": "cn-hangzhou",
"naP m yme": "Instance:PreemptibleInstance] , M _Interruption",
"content": {
"instanceId": "i-abcdef",
"action": "delete"
},
"status": "Normal"
}
方式2: 直接API对n t 0 .接, 轮询方式
具体请参见: 查询抢占r i d式实例中断事件 一文。4 5 ! K 3 k 7 z 4