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

简介: 由于抢占式实例天然具有被中断的风险,在实例中断前至少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一文

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
libevent/libev框架实战
libevent/libev框架实战
239 0
|
对象存储 容器 Kubernetes
使用 Velero 进行集群备份与迁移
本文介绍了使用 Velero 来进行 k8s 集群资源进行备份和迁移。
6438 0
|
TensorFlow 算法框架/工具 Python
TensorFlow的历史版本与对应Python版本
TensorFlow的历史版本与对应Python版本
TensorFlow的历史版本与对应Python版本
|
6月前
|
存储 缓存 分布式计算
高内存场景必读!阿里云r7/r9i/r8y/r8i实例架构、性能、价格多维度对比
阿里云针对高性能需求场景,一般会在活动中推出内存型r7、内存型r9i、内存型r8y和内存型r8i这几款内存型实例规格的云服务器。相比于活动内的经济型e和通用算力型u1等实例规格,这些内存型实例在性能上更为强劲,尤其适合对内存和计算能力有较高要求的应用场景。这些实例规格的云服务器在处理器与内存的配比上大多为1:8,但它们在处理器架构、存储性能、网络能力以及安全特性等方面各有千秋,因此适用场景也各不相同。本文将为大家详细介绍内存型r7、r9i、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
9月前
|
数据采集 弹性计算 运维
阿里云付费模式介绍:节省计划、预留实例券、抢占式实例区别及选择参考
在我们购买阿里云服务器时,可选的付费模式有包年包月、按量付费、节省计划、预留实例券和抢占式5种付费模式,满足长周期低成本以及短周期高弹性的计算要求,一般用户选择最多的是包年包月和按量付费,包年包月购买适合长期稳定的业务,购买周期越长,折扣越高,按量付费购买紧贴业务需求购买资源的付费方式,秒级计费,用多少花多少。本文主要为大家介绍节省计划、预留实例券、抢占式实例三种付费模式,以供参考。
|
测试技术 Windows
基于SpringBoot+Vue人口老龄化社区服务与管理平台(源码+部署说明+演示视频+源码介绍+lw)(4)
基于SpringBoot+Vue人口老龄化社区服务与管理平台(源码+部署说明+演示视频+源码介绍+lw)
185 2
|
数据采集 分布式计算 Hadoop
使用Hadoop MapReduce进行大规模数据爬取
使用Hadoop MapReduce进行大规模数据爬取
|
虚拟化
minos 2.5 中断虚拟化——vGIC
这一节开始讲述真正的中断虚拟化,首先来看硬件方面的虚拟化。前文 minos 2.3 中断虚拟化——GICv2 管理 主要讲述 GICv2 的 Distributor 和 CPU Interface,在 Hypervisor 存在的情况下,它们都是为 Hypervisor 服务的。现在有了 vm,vm 里面的内核也需要操作 GIC,怎么办?我们模拟一个 GIC 设备给 vm 使用。
331 5
minos 2.5 中断虚拟化——vGIC
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表4、数据库设计——2、数据库规范化(Normalization)——3、实体-关系模型(ER Modeling)
MySQL技能完整学习列表4、数据库设计——2、数据库规范化(Normalization)——3、实体-关系模型(ER Modeling)
333 0

热门文章

最新文章