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

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

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
运维 负载均衡 Serverless
函数计算产品使用问题之在同一地域同一时刻最多可以同时运行多少个函数实例
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
14天前
|
弹性计算 JSON 运维
阿里云ECS实例运维属性-如何控制实例的宕机表现
介绍如何通过运维属性指定阿里云ECS的宕机运维表现等
|
22天前
|
缓存 运维 监控
函数计算产品使用问题之怎么开启预留实例
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
运维 Serverless 文件存储
Serverless 应用引擎产品使用合集之函数实例运行期间相关的依赖资源(vcpu、临时磁盘、GPU)是否会随函数运行完毕而释放
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
Java Serverless 测试技术
Serverless 应用引擎常见问题之自动缩容策略触发的时候终止先创建的机器如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
|
4月前
|
弹性计算 监控 Linux
ECS实例问题之负载异常如何解决
ECS实例指的是在阿里云ECS服务中创建的虚拟计算环境,用户可在此环境中运行应用程序和服务;本合集将介绍ECS实例的创建、管理、监控和维护流程,及常见问题处理方法,助力用户保障实例的稳定运行。
|
弹性计算 负载均衡 Linux
创建简单弹性伸缩方案-操作演示|学习笔记
快速学习创建简单弹性伸缩方案-操作演示
创建简单弹性伸缩方案-操作演示|学习笔记
|
存储 关系型数据库 MySQL
「助力降本增效」RDS发布实例暂停以及云盘性能等级动态调整功能
云数据库和IDC自建数据库一个重要的区别是弹性,IDC自建不具备或者只具备有限的弹性能力,而云能够利用IaaS资源层的能力帮助客户快速进行数据库弹性。
422 0
「助力降本增效」RDS发布实例暂停以及云盘性能等级动态调整功能
|
弹性计算 安全 网络安全
阿里云创建抢占式实例流程
什么是弹性网卡?阿里云服务器弹性网卡有什么用?弹性网卡是一种可以绑定到专有网络VPC类型ECS实例上的虚拟网卡。通过弹性网卡,您可以实现高可用集群搭建、低成本故障转移和精细化的网络管理。
774 0
|
Linux Windows
阿里云服务器开启无性能约束模式(不怕突发性能t5实例CPU限制的方法)
阿里云突发性能t5实例可以开启性能约束模式啦,再也不怕CPU积分耗尽,很多阿里云t5实例用户都不清楚如何开启无性能约束模式,教程来啦: 两个地方可以开启无性能.
2235 0
阿里云服务器开启无性能约束模式(不怕突发性能t5实例CPU限制的方法)