AutoScaling 生命周期挂钩功能

简介: AutoScaling 伸缩组实例管理功能全面升级,新上线生命周期挂钩(LifecycleHook)功能,方便用户更加灵活地管理伸缩组内实例。使用生命周期挂钩可以在伸缩组发生伸缩活动时将伸缩活动挂起,执行自定义操作。

使用 LifecycleHook 功能,可以更加灵活地管理控制伸缩组内 ECS 实例的生命周期,灵活地控制伸缩组内实例的创建和移出过程。当伸缩组发生伸缩活动,触发生命周期挂钩时,伸缩活动将被挂起,结束当前被挂起的伸缩活动有两种方式:

  1. 等待生命周期活动超时
  2. 调用接口 CompleteLifecycleAction 主动结束生命周期活动

本文将系统地介绍生命周期挂钩功能的使用方式和使用场景,并给出生命周期挂钩功能的最佳实践。

LifecycleHook 介绍

LifecycleHook 使用场景

使用 LifecycleHook,可以在伸缩组发生伸缩活动时将正在扩张或即将释放的 ECS 实例挂起,执行用户自定义操作,可以更加灵活地管理 ECS 实例在伸缩组内的生命周期。几个简单的 LifecycleHook 应用场景:

  • 伸缩组弹出 ECS 实例后需要延迟一段时间(测试服务没问题以后)挂载到 SLB ,然后对外提供服务
  • 伸缩组释放 ECS 实例时需要先将实例从 SLB 后端服务移除(防止接收新的请求),待检测已经接收到的请求处理完成,停止并释放实例
  • 伸缩组释放 ECS 实例时执行数据备份操作
  • 伸缩组弹性扩张或者收缩执行一些用户自定义操作

针对上述第二种场景,如果可以确定每个请求的最长处理时间,可以调用 创建生命周期挂钩 接口创建生命周期挂钩,设置 LifecycleTransition 参数值为 SCALE_IN,设置 HeartbeatTimeout 为请求最长处理时间,不需要设置通知对象,当发生弹性收缩类型伸缩活动时,ECS 实例从 SLB 移除后会挂起一段时间(HeartbeatTimeout),等待请求处理完成。

LifecycleHook 工作方式

当伸缩组创建了 LifecycleHook,并发生 LifecycleHook 配置的伸缩活动类型(LifecycleTransition)时,那么伸缩活动呗挂起,用户可以在伸缩活动挂起这段时间内执行自定义操作,一直到 LifecycleHook 超时(HeartbeatTimeout),或者通过调用 CompleteLifecycleAction 接口提前终止伸缩活动挂起。

粘贴图片.png

对于弹性扩张(SCALE_OUT)伸缩活动:

ECS 实例先进入 Pending(加入中)状态,当实例启动成功,并添加到 RDS 白名单(如果伸缩组设置了 RDS)以后,触发 LifecycleHook ,ECS 实例进入 Pending:Wait(加入中挂起)状态。如果LifecycleHook 配置了通知对象(MNS),则发送通知内容到 MNS,用户可通过 MNS控制台 的方式来消费 MNS 主题或者队列中的消息,也可以通过 OpenAPI 的方式消费,具体可参考 ESS 事件通知#消息接收 章节。当用户接收到 MNS 消息后可以执行自定义操作,例如在 ECS 实例上安装软件、部署服务等,执行完自定义操作以后,用户可以通过 CompleteLifecycleAction 接口提前结束挂起的伸缩活动,也可以等待 LifecycleHook 挂起超时。LifecycleHook 挂起结束后有两个执行方向,CONTINUE or ABANDON,对于弹性扩张伸缩活动,执行方向解释如下:

  • CONTINUE 继续,ECS 实例将被投入伸缩组中使用
  • ABANDON 拒绝,伸缩活动回滚,ECS 实例将被释放
  • 如果伸缩组配置了多个弹性扩张类型的 LifecycleHook,那么发生弹性扩张伸缩活动时会触发多个 LifecycleHook,伸缩活动最终的执行方向(CONTINUE or ABANDON)以最后一个结束的 LifecycleHook 执行方向为准。

结束 LifecycleHook 挂起状态以后,如果伸缩组配置了负载均衡(SLB),那么将 ECS 实例挂载到 SLB 上以后,实例进入 Inservice(服务中)状态,此时弹性扩张伸缩活动结束。

对于弹性收缩(SCALE_IN)伸缩活动:

ECS 实例先进入 Terminating(移出中)状态,,将实例从 SLB 后端服务器移除以后(如果伸缩组配置了负载均衡(SLB)),触发 LifecycleHook ,ECS 实例进入 Terminating:Wait(移出中挂起)状态。如果 LifecycleHook 配置了通知对象(MNS),则发送通知内容到 MNS,用户可通过 MNS控制台 的方式来消费 MNS 主题或者队列中的消息,也可以通过 OpenAPI 的方式消费,具体可参考 ESS 事件通知#消息接收 章节。当用户接收到 MNS 消息后可以执行自定义操作,例如检测 ECS 接收到的请求是否处理完成、停止接收服务等,执行完自定义操作以后,用户可以通过 CompleteLifecycleAction 接口提前结束挂起的伸缩活动,也可以等待 LifecycleHook 挂起超时。LifecycleHook 挂起结束后有两个执行方向,CONTINUE or ABANDON,对于弹性收缩伸缩活动,执行方向解释如下:

  • CONTINUE 继续,ECS 实例将从伸缩组中移出
  • ABANDON 拒绝,ECS 实例将从伸缩组中移出
  • 如果伸缩组配置了多个弹性收缩类型的 LifecycleHook,那么发生弹性收缩活动时会触发多个 LifecycleHook,如果某个 LifecycleHook 挂起结束执行结果为 ABANDON,则其余挂起的 LifecycleHook 会被提前结束掉,ECS 实例从伸缩组中移出,如果某个 LifecycleHook 挂起结束执行结果为 CONTINUE,则其余挂起的 LifecycleHook 继续挂起,直到最后一个 LifecycleHook 挂起结束,伸缩活动恢复执行。

结束 LifecycleHook 挂起状态以后,弹性伸缩服务会将 ECS 实例先从 RDS 白名单移除(如果伸缩组配置了 RDS),再将 ECS 实例停止(如果 ECS 实例是伸缩组弹出来的不是手动添加的),然后释放实例(如果 ECS 实例是伸缩组弹出来的不是手动添加的),并将实例从伸缩组中移出。

LifecycleHook 通知方式

如果生命周期挂钩配置了通知对象,那么当伸缩组发生伸缩活动触发 LifecycleHook 时,通知对象将接收到当前的伸缩活动详细信息,如果生命周期挂钩没有配置通知对象,那么当伸缩组发生伸缩活动触发 LifecycleHook 时不会发出任何通知信息。

生命周期挂钩目前支持以下两种通知方式:

  • 消息服务(MNS)队列(Queue)
  • 消息服务(MNS)主题(Topic)

关于 MNS 主题和队列的介绍,您可以参考 队列使用帮助主题使用帮助 来了解主题、队列的创建,消息的接收方式,以及如何为主题设置订阅等。
需要注意的是,MNS 消息服务会收取相应的费用,具体的收费标准可参考 云产品定价#消息服务 进行详细了解。

LifecycleHook 通知内容

当伸缩组发生伸缩活动触发 LifecycleHook 时,如果生命周期挂钩配置了通知对象(目前只支持通知到 MNS),那么通知对象将收到关于此次伸缩活动的详细信息,通知内容如下:

{
  "content": {
    "defaultResult": "CONTINUE",
    "instanceIds": [
      "i-xxxxxxxxxx1",
      "i-xxxxxxxxxx2",
      "i-xxxxxxxxxx3",
      "i-xxxxxxxxxx4",
      "i-xxxxxxxxxx5"
    ],
    "lifecycleActionToken": "C8BEAE68-CB77-4E60-986D-1E8BBF1A6B99",
    "lifecycleHookId": "ash-wxxxxxxxxxxx",
    "lifecycleHookName": "SCALE_IN_TEST",
    "lifecycleTransition": "SCALE_IN",
    "notificationMetadata": "测试 SCALE_IN HOOK",
    "requestId": "XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX",
    "scalingActivityId": "asa-xxxxxxxxxxxxxxxx",
    "scalingGroupId": "asg-xxxxxxxxxxxxxxxxx",
    "scalingGroupName": "test-hook",
    "scalingRuleId": "asr-xxxxxxxxxxxx",
    "scheduledTaskId": "xxxxxxxxxxxxxx"
  },
  "product": "ESS",
  "regionId": "cn-shenzhen",
  "resourceArn": "acs:ess:cn-shenzhen:111111111111111:scalingGroup/asg-xxxxxxxxxxxxx",
  "time": "2018-06-21T03:07:57.641Z",
  "userId": "111111111111111"
}

上述内容中:

  • resourceArn 伸缩组唯一标识符,包括了伸缩组所在的 Region 信息,所属的用户 ID 信息,以及伸缩组 ID 信息。
  • content 生命周期挂钩触发的伸缩活动详细信息

    • defaultResult 生命周期挂钩默认执行策略

      • CONTINUE 继续
      • ABANDON 拒绝
    • instanceIds 生命周期挂钩挂起的 ECS 实例ID
    • lifecycleActionToken 生命周期挂钩唯一标识符,通过获取该参数与 lifecycleHookId 参数,可通过调用 CompleteLifecycleAction 主动结束生命周期活动
    • lifecycleHookId 生命周期挂钩 ID
    • lifecycleHookName 生命周期挂钩名称
    • lifecycleTransition 生命周期挂钩适用的伸缩活动类型,取值范围:

      • SCALE_OUT:伸缩组弹性扩张活动
      • SCALE_IN:伸缩组弹性收缩活动
    • notificationMetadata 生命周期挂钩通知标识
    • scalingActivityId 伸缩活动 ID
    • scalingGroupId 伸缩组ID
    • scalingGroupName 伸缩组名称
    • scalingRuleId 触发伸缩活动的伸缩规则名称(此参数不是必带)
    • scheduledTaskId 定时任务ID(只有伸缩活动是由定时任务触发的时候才会有此参数)

MNS 队列或主题内容的消费方式,推荐参考 MNS 官方给出的 长轮训最佳实践 文档,使用长轮询的方式来消费队列或主题收到的消息内容。

最佳实践

创建 LifecycleHook 通知对象

在创建 LifecycleHook 时,可以配置通知对象,也可以不配置通知对象,如果需要配置通知对象,需要先创建好通知对象,再创建 LifecycleHook。关于通知对象(MNS 主题、队列)的创建方式,可以参考 ESS 事件通知#创建 MNS 队列 章节 和 ESS 事件通知#创建 MNS 主题 章节。

创建 LifecycleHook

LifecycleHook 的创建,可以通过 ESS控制台 完成,也可以通过调用 CreateLifecycleHook 接口完成。通过接口创建 LifecycleHook,可基于 CreateLifecycleHook 文档,参考 ESS 事件通知#创建事件通知(OpenAPI) 章节实现。通过 ESS控制台 创建 LifecycleHook 过程如下:

登录 ESS控制台,进入生命周期挂钩列表页,点击创建生命周期挂钩按钮,弹出创建界面如下图所示:

粘贴图片.png

按提示名称,通知标识,选择伸缩活动类型、执行策略和通知方式,点击确定,如下图所示:

粘贴图片.png

上图中,创建了两个 LifecycleHook,一个伸缩活动扩张类型的 LifecycleHook,一个伸缩活动收缩类型的 LifecycleHook。

触发 LifecycleHook

本章以触发弹性收缩活动为例,展示 LifecycleHook 工作过程。触发伸缩活动的方式,可参考 ESS 事件通知#创建事件通知(OpenAPI) 章节完成。

首先触发减少1台实例的伸缩活动,如下图所示:

粘贴图片.png

查看伸缩组 ECS 实例列表页,如下图所示:

粘贴图片1.png

从上图看出,此时有一台 ECS 实例处于挂起状态,由于弹性收缩类型的 LifecycleHook 设置了通知对象,可以登录 MNS控制台 查看通知结果,消息查看方式可参考 ESS 事件通知#MNS 队列消息接收) 章节。

MNS 消息处理-操作生命周期挂钩

接收到 LifecycleHook 发送的通知内容以后,提取 lifecycleActionToken 、lifecycleHookId 参数,然后通过调用 CompleteLifecycleAction 接口提前结束 LifecycleHook 挂起状态,调用方式如下:

public class LifecycleHookTest {
    public static final String REGION_ID = "cn-hangzhou";

    public static final String AK        = "xxx";

    public static final String AKS       = "xxx";

    public static void main(String[] args) throws ClientException, Exception {
        IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
        final IAcsClient client = new DefaultAcsClient(clientProfile);
        completeLifecycleAction(client);
    }

    private static String completeLifecycleAction(IAcsClient client) throws ClientException {
        CompleteLifecycleActionRequest request = new CompleteLifecycleActionRequest();
        request.setLifecycleHookId("ash-xxxxxxxxxxxxx");
        request.setLifecycleActionToken("xxxxxxxxxxxxxxx");
        request.setLifecycleActionResult("CONTINUE");
        CompleteLifecycleActionResponse response = client.getAcsResponse(request);
        return response.getRequestId();
    }
}

使用上述代码中,需补充个人 AK 信息,以及 LifecycleActionToken 和 LifecycleHookId 参数。

LifecycleHook 挂起状态结束以后,ECS 实例被停止(伸缩组创建的实例),然后释放(伸缩组创建的实例)并移出伸缩组。

注意事项

如果 LifecycleHook 配置的通知对象被删除,那么您将无法收到挂起通知,伸缩活动被挂起。如果伸缩活动触发 LifecycleHook 被挂起,想要延长伸缩活动被挂起的时间,可以通过调用 RecordLifecycleActionHeartbeat 延长挂起时间。

写在最后

AutoScaling 生命周期挂钩功能提供了更加灵活地管理伸缩组内 ECS 实例生命周期的能力,通过该功能可以在伸缩组发生弹性扩张和弹性收缩活动时,通过将伸缩活动挂起的方式执行自定义操作。

弹性伸缩服务正在快速地发展,后续会有更多的新功能新特性推出,感谢您的一路陪伴。

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 弹性计算 安全
阿里云服务器计算型c9a实例怎么样?实例特点、收费标准、适用场景及活动价格参考
阿里云服务器c9a实例属于第 9 代 AMD 企业级实例,采用阿里云全新CIPU架构,搭配AMD最新EPYC™ Turin 处理器,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。目前阿里云针对c9a实例推出了首次优惠,本文为大家介绍c9a实例与u1和u2i实例区别,c9a实例的性能特点、收费标准和适用场景以及最新活动价格情况,以供参考和选择。
1848 4
|
2月前
|
人工智能 缓存 资源调度
AI数字人系统开发全流程:源码选型 + 部署 + 商业化指南
本文从实战角度系统拆解AI数字人项目的完整开发流程,涵盖源码选型策略、系统部署架构设计以及主流商业化路径。针对企业与开发团队在落地过程中常见的成本控制、性能优化与变现模式问题,提供可执行的解决思路,帮助读者从“能跑Demo”迈向“可持续盈利”的数字人业务体系。
|
C++ Python
VS Code按住ctrl不能跳转到定义/函数(Python)
VS Code按住ctrl不能跳转到定义/函数(Python)
5204 0
VS Code按住ctrl不能跳转到定义/函数(Python)
|
11月前
|
存储 Java API
小试牛刀-SpringBoot集成SOL链
java工程师:如何在java/springboot中使用solana区块链呢?不用担心,现在solanaj来了!
419 1
|
5月前
|
人工智能 监控 安全
一封“来自自己邮箱”的钓鱼邮件,如何绕过所有安全防线?微软揭示企业邮件配置盲区正成攻击温床
2025年,华南某金融科技公司遭遇“内部域名伪造”钓鱼攻击:员工收到来自自己邮箱的MFA更新邮件,实为攻击者利用SPF、DKIM、DMARC配置疏漏伪造。邮件显示“内部发送”,极具迷惑性,险致资金损失。微软披露,此类攻击全球频发,根源在于邮件认证链断裂。专家呼吁企业收紧DMARC策略、审计邮件路由,并建立“零信任邮件”文化,筑牢基础安全防线。
351 6
|
JSON JavaScript Linux
【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上
本文章以阿里云百炼的工作流为例,介绍如何将其封装为MCP服务并部署到平台。主要步骤包括:1)使用Node.js和TypeScript搭建MCP服务;2)将项目打包并发布至npm官方平台;3)在阿里云百炼平台创建自定义MCP服务;4)将服务添加到智能体中进行测试。通过这些步骤,您可以轻松实现工作流的MCP化,并在智能体中调用自定义服务。
5071 107
|
机器学习/深度学习 人工智能 算法框架/工具
Python赋能AI数据分析
Python赋能AI数据分析
560 0
阿里云公网IP地址多少钱一个?
阿里云公网IP价格因地域而异,如华北1(青岛)包年包月约20.70元/月,华北2(北京)及其他地区23元/月,香港30元/月,新加坡23元/月。按量付费模式下,保有费0.020元/小时,流量额外计费。
5625 0
阿里云公网IP地址多少钱一个?
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计
循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
318 3

热门文章

最新文章