抢占式实例最佳实践--如何模拟中断事件

简介: 由于抢占式实例天然具有被中断的风险,在实例中断前至少5分钟,系统会向您发送中断消息。此时您可以依据 抢占式实例接收中断消息指南 来进行中断消息的处理. 但在开发"中断处理程序"阶段, 由于您实例的中断是由阿里云触发, 概率极低且是非常随机的过程, 调试与验证中断处理程序可能会比较困难.因此,模拟中断事件来增加验证的可操作性是有必要的

前言

由于抢占式实例天然具有被中断的风险,在实例中断前至少5分钟,系统会向您发送中断消息。此时您可以依据 抢占式实例接收中断消息指南 来进行中断消息的处理. 但在开发"中断处理程序"阶段, 由于您实例的中断是由阿里云触发, 概率极低且是非常随机的过程, 调试与验证中断处理程序可能会比较困难.

基于此, 我们目前提供了以下两种模拟中断事件的方式, 以便您进行程序调试:


方式1:使用云监控控制台模拟中断事件


具体请参见:抢占式实例接收中断消息指南一文。

方式2:调用OpenAPI进行调试

以云监控订阅中断事件, 并将事件投递到MQ消息队列为例

前提条件

在使用本教程之前,请确保已完成以下操作:

  • 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面查看您的访问密钥。
  • 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)。
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>tea-openapi</artifactId>
  <version>0.0.13</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>cms20190101</artifactId>
  <version>1.0.1</version>
</dependency>

第一步:创建云监控的事件报警规则

示范代码如下:

// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;
import com.aliyun.tea.*;
import com.aliyun.cms20190101.*;
import com.aliyun.cms20190101.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;
/**
 * 调用 PutEventRule
 * 创建或修改事件的报警规则
 */
public class Sample {
    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
        return new com.aliyun.cms20190101.Client(config);
    }
    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
        PutEventRuleRequest.PutEventRuleRequestEventPattern eventPattern0 = new PutEventRuleRequest.PutEventRuleRequestEventPattern()
                .setEventTypeList(java.util.Arrays.asList(
                    "*"
                ))  //  事件报警规则的类型 
                .setLevelList(java.util.Arrays.asList(
                    "*"
                ))  //  事件报警规则的等级
                .setNameList(java.util.Arrays.asList(
                    "Instance:PreemptibleInstanceInterruption"
                ))  //  事件报警规则的名称
                .setProduct("ECS"); //  云服务类型
        PutEventRuleRequest putEventRuleRequest = new PutEventRuleRequest()
                .setRuleName("spot_release_event_test")  // 事件报警规则名称
                .setEventPattern(java.util.Arrays.asList(
                    eventPattern0
                ))
                .setEventType("SYSTEM")  //  事件报警规则的类型
                .setState("ENABLED"); //  事件报警规则的状态
        // 复制代码运行请自行打印 API 的返回值
        client.putEventRule(putEventRuleRequest);
    }
}


第二步:创建消息队列

具体请参见:消息服务MNS一文

第三步:添加规则的发送目标

示范代码如下:

// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;
import com.aliyun.tea.*;
import com.aliyun.cms20190101.*;
import com.aliyun.cms20190101.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;
/**
 * 调用 PutEventRuleTargets
 * 添加或修改规则的发送目标
 */
public class Sample {
    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
        return new com.aliyun.cms20190101.Client(config);
    }
    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
        PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters mnsParameters0 = new PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters()
                .setRegion("cn-hangzhou") //  消息服务对应的地域
                .setId("1") //  规则发送目标的唯一标识
                .setQueue("mq-test"); //  队列名称
        PutEventRuleTargetsRequest putEventRuleTargetsRequest = new PutEventRuleTargetsRequest()
                .setRuleName("spot_release_event_test") //  报警规则的名称
                .setMnsParameters(java.util.Arrays.asList(
                    mnsParameters0
                ));
        // 复制代码运行请自行打印 API 的返回值
        client.putEventRuleTargets(putEventRuleTargetsRequest);
    }
}

第四步:发送模拟系统事件

示范代码如下:

package com.aliyun.sample;
import com.aliyun.tea.*;
import com.aliyun.cms20190101.*;
import com.aliyun.cms20190101.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;
/**
 *调用 SendDryRunSystemEvent
 *调试云资源的系统事件
 *
 */
public class Sample {
    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
        return new com.aliyun.cms20190101.Client(config);
    }
    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
        SendDryRunSystemEventRequest sendDryRunSystemEventRequest = new SendDryRunSystemEventRequest()
                .setProduct("ecs")  //  云服务名称
                .setEventName("Instance:PreemptibleInstanceInterruption") //  事件名称
                .setEventContent("{\"product\":\"ECS\",\"resourceId\":\"acs:ecs:cn-shanghai:1331602849963181:instance/i-abcdef\",\"level\":\"WARN\",\"instanceName\":\"instanceName\",\"regionId\":\"cn-beijing\",\"name\":\"Instance:PreemptibleInstanceInterruption\",\"content\": {\"instanceId\":\"i-abcdefghijklmn\",\"action\":\"delete\"},\"status\":\"Normal\"}");  //  事件内容
        // 复制代码运行请自行打印 API 的返回值
        client.sendDryRunSystemEvent(sendDryRunSystemEventRequest);
    }
}

第五步:通过消息验证是否收到消息

具体请参见:消息服务MNS一文

相关实践学习
基于ECS搭建云上博客
本实验教您如何在ECS云服务器(Alibaba Cloud Linux 3)的环境下,通过部署LAMP环境并安装WordPress快速搭建个人博客。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
语雀的markdown常用语法
语雀的markdown常用语法
10590 0
语雀的markdown常用语法
|
弹性计算 Ubuntu Linux
幻兽帕鲁服务器清档教程
介绍了Linux(ubuntu)和Windows平台下清除服务器存档的教程。适用于计算巢部署和已有ECS部署。
7149 0
|
机器学习/深度学习 人工智能 文字识别
CRNN文字识别
近几年来,CRNN在计算机视觉文本识别领域取得不错成果。CRNN是一种卷积循环神经网络结构,用于解决基于图像的序列识别问题,特别是场景文字识别问题。CRNN网络实现了不定长验证结合CNN和RNN网络结构,使用双向LSTM循环网络进行时序训练,并在最后引入CTC损失函数来实现端对端的不定长序列识别,
2421 0
CRNN文字识别
|
6月前
|
人工智能 弹性计算 安全
Hermes Agent安装保姆级教程:共3中方法,大家任选,总有一种方法适合你!
阿里云提供三种零代码部署Hermes Agent(爱马仕)方案:轻量应用服务器(低至38元/年)、无影云电脑(支持微信接入)和ECS(免费)。该开源AI智能体具备自我进化能力,5美元服务器即可运行,新手友好,2026年AI Agent之争未定,但部署已极简。
|
4月前
|
人工智能 JSON 搜索推荐
GEO优化:AI搜索时代的内容革命:从SEO到生成式引擎优化的全面解析
本文深度解析GEO(生成式引擎优化)——AI搜索时代的内容新范式。面对ChatGPT、文心一言等大模型重塑信息获取方式,GEO聚焦“被AI引用”而非“网页排名”,从可信度、语义覆盖、内容可提取性三大支柱出发,系统阐述内容、技术与生态层优化策略,并附实战案例与效果评估体系。
602 1
|
5月前
|
存储 SQL 人工智能
AI Coding Agent 时代:代码越便宜,约束越贵
AI时代,代码生成成本骤降,但让代码长期可信的工程约束却愈发昂贵。本文通过对比实验揭示:清晰的架构、显式契约与可执行规则,才是引导AI生成高质量代码的关键护栏。
479 0
AI Coding Agent 时代:代码越便宜,约束越贵
|
10月前
|
人工智能 安全 网络安全
Fortinet FortiGate Firmware (FortiOS 7.6.5) 全系列下载 - 下一代防火墙 (NGFW)
Fortinet FortiGate Firmware (FortiOS 7.6.5) 全系列下载 - 下一代防火墙 (NGFW)
712 0
Fortinet FortiGate Firmware (FortiOS 7.6.5) 全系列下载 - 下一代防火墙 (NGFW)
|
4月前
|
人工智能 缓存 自然语言处理
阿里云TokenPlan团队版高级坐席698元和尊享坐席1398元/月,如何选择?
阿里云百炼TokenPlan团队版提供标准(198元)、高级(698元)、尊享(1398元)三档坐席,按Credits计费,支持文本与图像多模型,额度从2.5万至25万/月,适配编程及Agent工具,保障数据隐私,不可退款。阿里云百炼官网快速体验:https://t.aliyun.com/U/fPVHqY
|
弹性计算 负载均衡 Java
【上云基础系列 02-01】通过SLB+1台ECS+ESS弹性伸缩,搭建一个精简版的上云标准弹性架构(含方案及教程)
通常,构建一个弹性架构(即使是一个最基础的入门版),至少需要2台ECS。但是,很多小微企业刚开始上云的时候,为了节省成本不愿意购买更多的服务器。通过 “ALB+ESS弹性伸缩+1台ECS+RDS”方案,在保障低成本的同时,也不牺牲业务架构的弹性设计,更避免了很多人因为节省成本选择了单体架构后频繁改造架构的困局。 方案中的几个设计非常值得小微企业借鉴:(1)通过ALB/RDS的按量付费,节省了初期流量不大时的费用;(2)通过ESS弹性伸缩,不需要提前购买服务器资源,但是当业务增长或减少时却保持了资源弹性自动扩缩容。

热门文章

最新文章