全部产品
Search
文档中心

:通过事件驱动架构方式获取异步OpenAPI操作结果

更新时间:Dec 05, 2024

本文介绍了如何在调用异步OpenAPI之后,通过EventBridge主动订阅ECS事件,并将其投递至轻量消息队列(原MNS)。同时提供了弹性网卡示例代码,以便在业务系统中集成,利用事件驱动架构方式获取异步OpenAPI操作结果。适用于对事件时延要求较高、事件量较大的场景。

前提条件

背景信息

云服务器ECS提供了各种API接口,您可以通过API管理您的云上资源和开发自己的应用程序,直接与云服务进行交互,实现自动化管理、灵活性和定制化的开发。但其中一些API接口为异步接口,调用成功后,获得返回结果仅代表当前请求发送成功,需要通过其他方式获取资源操作是否成功,比如通过轮询查询类API,查询资源状态是否符合预期。

例如,附加弹性网卡AttachNetworkInterface为异步操作,要获取附加弹性网卡是否成功,可以通过轮询DescribeNetworkInterfaces查询网卡状态,如果网卡状态为InUse,则表示附加弹性网卡操作成功。但是,通过轮询的方式获取异步API操作结果存在以下缺点:

  1. 增加了API接口的无效调用。

  2. 频繁的轮询会导致API被限流。

  3. 获取异步API操作结果不及时。

通过事件驱动架构获取异步API操作结果,可以在异步API操作完成后,产生对应的操作完成事件,通过订阅对应的事件,可以避免轮询API存在的一些问题,更及时的获取异步API操作结果。

本文以附加弹性网卡AttachNetworkInterface为例,附加弹性网卡成功或者失败后,会产生网卡操作完成事件NetworkInterfaceOperateCompleted,通过订阅该事件,可以及时获取附加弹性网卡操作结果。

说明

在极少数情况下,可能会出现资源操作完成但是没有对应事件。建议您把轮询API作为兜底策略,您可以调整轮询的频率。以附加弹性网卡为例,您可通过轮询DescribeNetworkInterfaces查询附加弹性网卡的结果。

操作步骤

步骤一:创建轻量消息队列

重要

创建队列将产生少量队列占用费用,请及时删除不需要的队列。MNS计费说明,请参见计费说明

  1. 登录轻量消息队列(原 MNS)控制台

  2. 在左侧导航栏,选择队列模型 > 队列列表

  3. 在顶部菜单栏,选择地域。

  4. 队列列表页面,单击创建队列

  5. 创建队列面板配置以下参数,然后单击确定

    • 名称:队列名称。本示例中,自定义队列名称为eni-operate-completed-event,其他配置项保持默认配置。

    • 消息最大长度:发送到队列的消息体的最大长度。

    • 长轮询时间:当队列中没有消息时,该队列的ReceiveMessage请求的最大等待时长。

    • 消息可见性超时时间:消息从队列中取出后从Active状态变成Inactive状态后的持续时间。

    • 消息保存时长:消息在队列中的最长存活时间。从发送到队列开始经过此参数指定的时间后,不论消息是否被取出都将被删除。

    • 消息定时时间:发送到队列的所有消息将延后此参数指定的时间后被消费。

    • 启用日志功能:是否开启日志管理功能。

    返回队列列表页面,查看目标队列已创建,记录队列名称和接入点Endpoint。

步骤二:选用云服务专用事件总线

  1. 登录事件总线EventBridge控制台,在左侧导航栏,单击事件总线
  2. 在顶部菜单栏,选择地域。
  3. 事件总线页面,单击default

步骤三:创建ECS事件订阅规则

  1. 事件总线页面,单击左侧导航栏的事件规则,然后单击创建规则

  2. 创建规则面板,完成以下操作。

    1. 配置基本信息页签,在名称文本框输入规则名称,在描述文本框输入规则的描述,然后单击下一步

    2. 配置事件模式页签,完成以下配置,然后单击下一步

      • 单击阿里云官方事件源页签。

      • 事件源下拉列表中选择acs.ecs

      • 事件类型下拉列表中选择需要订阅的事件类型。可同时选择订阅多个事件类型。

        本文示例选择ecs:NetworkInterface:NetworkInterfaceOperateCompleted,更多异步OpenAPI对应的事件,请参见事件通知列表

      • 事件模式调试中,可查看订阅的事件类型的示例。例如,事件类型选择ecs:NetworkInterface:NetworkInterfaceOperateCompleted时,对应的示例如下。

        {
            "id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
            "source": "acs.ecs",
            "specversion": "1.0",
            "subject": "acs.ecs:cn-hangzhou:123456789098****:215672",
            "time": "2020-11-19T21:04:41Z",
            "type": "ecs:NetworkInterface:NetworkInterfaceOperateCompleted",
            "aliyunaccountid": "123456789098****",
            "aliyunpublishtime": "2020-11-19T21:04:42Z",
            "aliyuneventbusname": "default",
            "aliyunregionid": "cn-hangzhou",
            "aliyunpublishaddr": "172.25.XX.XX",
            "data": {
                "eniStatus": "Available",
                "result": "success",
                "eniId": "eni-bp1j9eoibxxxxxxxxxx",
                "operation": "CreateNetworkInterface",
                "requestId": "8D152511-XXXX-18E2-XXXX-8A1219DAD64F.i-bp1ffahxxxxxxxxxx",
                "primaryPrivateIp": "192.168.1.1",
                "secondaryPrivateIps": [
                    "192.168.*.*",
                    "192.168.*.*"
                ],
                "ipv4Prefixes": [
                    "192.168.10.0/24"
                ],
                "ipv6s": [
                    "ABCD:EF01:2345:6789:ABCD:EF01:****:****"
                ],
                "ipv6Prefixes": [
                    "2001:***::/32"
                ]
            }
        }
    3. 配置事件目标页签,配置MNS消息通知。

      • 服务类型:选择轻量消息队列(原MNS)

      • 队列:选择已创建的队列,如已创建队列eni-operate-completed-event。

      • 消息内容:选择完整事件

      • 开启 Base64 解码:选择是。开启Base64 编码,会帮助您将数据编码后投递至目标轻量消息队列。

步骤四:通过示例代码订阅事件

NetworkInterfaceDemo.zip中展示了通过MNS消息获取弹性网卡事件的示例代码。

关键参数说明: