关于云计算:最佳实践丨云上虚拟IDC私有池如何为客户业务的确定性连续性保驾护航

52次阅读

共计 12263 个字符,预计需要花费 31 分钟才能阅读完成。

简介:企业业务上云后,还面临特定可用区购买云上特定计算产品实例失败的窘境?云上公有池 pick 一下

Why 云上业务为什么须要资源确定性、服务连续性

云计算正朝着像水电煤一样的基础设施演进,反对用户按需应用、按量付费。目前,国内外各云服务商联结生态搭档,致力晋升云产品服务的疾速迭代、推广应用,然而事实很骨感:用户仍然面临偶发的在特定可用区购买云上特定计算产品实例失败的窘境。云服务的计算理念 – 随时随地弹性,怎么这个场景下就不 Work 了?咱们来剖析剖析。

目前,客户云上业务整个生命周期过程,须要感知算力的“商品化”载体:例如某客户 A,将集体博客的 Web 服务迁徙到阿里云上时,须要购买阿里云弹性计算云服务器,客户须要感知云服务器规格信息,如最新的 ecs.g7.xlarge。例如某客户 B,将在线制作 3D 创意成果的业务部署在阿里云上,依靠阿里云弱小 GPU 等算力资源,此时,须要购买阿里云弹性计算的 GPU 云服务器,如 ecs.gn7i-c8g1.2xlarge。

艰深了解:相似用户向“酒店”租住一个“房间”。云上环境,用户购买云上的一个具体的计算实例规格。

这与水电煤“即插即用”存在区别:云上的算力须要感知商品实例信息。水电煤是对立的‘用量’,屏蔽了后端的供货商(哪个电网供电、哪条线路输送)、供货的生产设施(水力发电、火力发电、风能发电、太阳能发电等)。目前国内外头部云服务供应商的算力服务售卖实体,支流仍然是算力对应具体商品。因为面向具体商品,那么就存在商品之间服务个性、适宜的业务场景、业务所需数量等差别。云服务供应商也就须要在不同地区提前准备好不同的商品,以及供给数量。

因为很难精准地预测各种具体算力商品的用户量级、购买工夫、购买数量,一旦呈现行业热点,同一行业的大多数客户短时间大量购买某一个个性的商品,较容易呈现针对特定商品的抢购而导致局部用户购买失败。典型如疫情背景下,挖矿、在线教育的衰亡,对本地盘、视频编解码算力需要旺盛,导致相干商品抢购景象突出。

艰深了解:相似“酒店”的残余房间曾经用完了,新客户入住失败。对应云环境,用户在云上购买计算实例,短时库存售磬,可能购买失败。

另外,电商每年在不同时间段会有各种“节日”促销流动,典型如 618、双 11。在促销期间和促销完结的一段时间内,须要大量的算力资源反对在线流动和流动完结后的海量数据分析。客户服务经验“失常态”、“大促态”、“大促收尾态”、“失常态”这样的典型服务间断过程。客户为了确保全年服务的连续性,特地是资源需要按预期布局确定进行,那么,云上资源确定性交付就是重要撑持。

艰深了解:例如奥运这样的预期流动,用户入住酒店,保险的措施就是提前预订好房间。对于云环境,就是在云上预订一个虚构的 IDC(公有池),这样就能够在公有池上确定性地交付资源。


图 1 - 水电煤基础设施与云计算基础设施“服务状态”现阶段的比照

综上剖析,现阶段,在云服务的支流服务售卖模式仍然是“算力商品化”的大背景下,用户须要感知业务在云上生命周期过程所需商品个性,云平台须要面向商品进行供给生产。因为需要的变动和市场环境的不确定性,供给和需要短时间的不匹配比拟容易产生。所以,服务特定行业的特定客户、针对特定算力商品的确定性购买,即云上资源确定性交付就成为解决这种窘境的重要能力。

How 如何保障云上业务资源确定性、服务连续性

后面剖析了主观现状,存在特定地区、特定时间段、特定算力商品的短时购买失败景象。对客户来说,须要联合本身场景,市场上云商品供给状况,适合的老本投入来实现资源交付的确定性,从而确保业务连续性。

下文的剖析以整体性概念为主,具体到客户的业务场景,还须要具体案例具体分析。例如预约地区的抉择、实例规格的抉择、预约时长的抉择、预约数量的抉择、总的老本最优等。资源交付的一种划分如图 2 所示,其中公有池是确定性交付的重要实现形式。联合业务场景,举荐最佳的公有池选购计划本文暂不介绍,后续专门出文档形容,帮忙用户更好地依靠云的产品服务,实现资源的确定性交付,保障业务服务的连续性。


图 2 - 资源交付的一种划分


图 3 - 确定性交付的可选策略


图 4 - 灵便弹性交付的可选策略

Aliyun 公有池选购和价值

1- 相干概念

公有池:当用户在 ECS 控制台,“资源保障”服务标签页下,购买“弹性保障”或者“容量预约”等产品后,就取得了云上的一个具备确定性库存资源预留,并且是专属调配应用的资源池。如图 5 - 公有池模式形象和多种产品实现。图 5 左侧,一个公有池的服务有两个阶段:公有池预留和公有池资源交付。针对公有池预留,产品指标是履约:确保公有池真正被应用。例如弹性保障 EA elastic assurance,一次性预收取这个公有池费用。


图 5 - 公有池模式和多种产品实现

iCR:immediately Capacity Reservesion 立刻失效按量预留 CR,公有池全副用完,无额定的老本开销,只在公有池有残余容量的时候,收取残余容量局部费用。

aCR:advance Capacity Reservation 指定工夫、提早失效的容量预约,基于信用分等级收取一些预订金,信用等级越高,预定金越低。

针对公有池资源交付,产品指标是:确定性交付、零门槛应用。当实例开进去后,会按实例进行失常的免费。

资源保障:资源保障是包含资源供应量化感知、资源的确定性预约、公有池布局应用的全链路资源确定性服务,它可能全面晋升您在查问、预约、购买、应用资源过程中的体验,使您在复杂多变的市场环境下仍然可能享受到专有保障资源。

弹性保障:通过弹性保障,您只须要领取一笔较低的保障费用,即可换取固定周期(反对 1 个月~5 年)的资源确定性保障。购买弹性保障时设置可用区、实例规格、保障数量等属性,零碎会以公有池的形式预留指定数量属性相匹配的资源,例如在华东 1(杭州)可用区 I 预留 10 台 ecs.c6.large 规格的实例。在弹性保障有效期内,您创立按量付费实例时抉择应用公有池的容量,即可享受到资源确定性保障。在弹性保障有效期内,您能够反复创立 / 开释指定数量的实例而无需放心资源供给的问题。超出弹性保障有效期或者弹性保障曾经没有闲暇的容量时,资源确定性保障将不再提供。

立刻失效容量预约:您能够随时购买立刻失效容量预约,预约胜利后立刻失效,即可享受资源确定性服务。容量预约失效后即开始依照按量实例费率免费,直至立刻失效容量预约到期主动开释或者您提前手动开释。购买立刻失效容量预约时设置可用区、实例规格、操作系统类型、容量大小等属性,零碎会以公有池的形式预留指定数量属性相匹配的资源。在容量预订有效期内,您创立按量付费实例时抉择应用公有池的容量,即可享受到资源确定性保障。通过一般场景购买的 ECS,因为资源的供给变幻无穷,线上的资源可能无奈每时每刻满足您的定制化需要;而在容量预订有效期内,您能够反复创立 / 开释指定数量的实例而无需放心资源供给的问题。容量预约未处于失效状态或者容量预约曾经没有闲暇的容量时,资源确定性保障将不再提供。在容量预约计费周期内,如果您购买了按量实例,并且应用了资源确定性,这部分按量实例的计算资源费用将会抵扣与按量实例匹配的容量预约的局部或者全副费用。

当一个按量实例与弹性保障和容量预订均匹配时,零碎会优先选取容量预约产品对应的公有池进行匹配。

2- 公有池价值

价值 1: 确定性资源交

随着云原生概念和实际的宽泛遍及,基于云的算力研发已成为新常态。客户业务云原生后,业务的疾速倒退过程中,往往针对特定场景,有着资源确定性交付的诉求,冀望 100% 地保障业务按既定布局上线、经营、推广等。

资源保障相干产品提供了全链路确定性交付能力。

具备确定性交付的能力,从业务角度就防止了云上某个可用区下、某种稀缺资源的抢购带来的购买成功率低的不确定性危险,例如 GPU 大规格实例。在原有共有资源池弹性交付根底上,配合确定性交付,能够进一步保障高优先级业务的资源 100% 保障。例如之前按量购买了 20 台 A 规格实例,这些实例会有业务的一些运维、变更等操作,购买 20 个 A 规格形成的公有池,这样就确保这些实例操作运维过程中资源具备 100% 确定性,不会被其余客户抢占。失常状况下 20 个 A 规格公有池容量被 20 个 A 规格实例全副应用,无任何闲暇容量,从而无任何额定老本投入。当理论应用资源确定性的 A 实例数量有余 20 个的时候,例如仅应用 18 个实例,产生 2 个闲暇容量,此时闲暇容量会按秒级计费,按小时出账单。

价值 2: 资源专属调度调配应用

在客户业务架构、业务演进深度交融云产品服务的迭代降级过程中,除了资源确定性交付之外,资源灵活性交付也随之成为重要的诉求。阿里云资源保障服务目前曾经反对基于云上公有池的专属调度调配,用户专属调度目前有两种实际形式。

形式一:用户基于 Open、Target、None 的匹配规定,进行实例的调度调配

用户在创立公有池的时候,指定公有池的匹配属性:Open(凋谢)、Target(指定)。在创立实例的时候指定实例匹配属性 Open 或者 Target(应用 Target 模式须要显示指定公有池 ID),后端进行属性匹配调度。

当实例匹配属性值为 Open 的时候,零碎会优先从用户公有池创立实例;如果无匹配的公有池,则依照共有池流程创立实例,同时保留资源确定性特色,一旦发现有闲暇的容量,零碎会准时的主动将这些实例从新与闲暇公有池进行匹配和关联;当实例匹配属性值为 Target 的时候,明确指定某个公有池,此时零碎在指定的公有池进行容量和公有池资源规定的匹配校验。例如公有池 region、zone、instanceType、platform、payType 等校验。

运行过程中,当实例的匹配属性产生批改,零碎会准时进行实例和公有池的从新匹配,确保实例尽可能地关联到公有池,从而缩小用户的费用老本(公有池的闲暇容量及时应用掉);当匹配模式为 Open 的公有池被开释的时候,零碎会准时的对与该公有池关联的并且应用 Open 匹配模式的实例从新匹配,确保实例尽可能地关联到公有池,从而缩小用户的老本(公有池的闲暇容量及时应用掉)。

形式二:用户基于 Tags 匹配规定,进行实例的调度调配

用户在创立公有池的时候,指定公有池的 tag 信息,而后创立实例的时候指定 tag 信息,后端就能够依照客户指定的 tag 匹配规定,从公有池或者共有池进行精细化资源调度调配。

为了升高用户应用门槛,或者零门槛,不管形式一还是形式二,阿里云资源保障服务都反对用户在现有 CreateInstance、RunInstnaces 接口根底上,间接应用形式一或者形式二进行资源专属调度。例如用户申请白名单后,后端按用户需要,将用户创立实例时候的匹配属性指定为默认值,这样用户既有的集成接口参数毋庸改变。

3- 公有池的获取

控制台购买获取

https://help.aliyun.com/docum…

OpenAPI 集成式获取

相干 Demo 如下:

1.1 Java
下载地址:https://search.maven.org/search?q=aliyun-java-sdk-ecs
1.2 Python
https://pypi.org/project/aliyun-python-sdk-ecs/
Python 可间接通过 pip 装置:pip install aliyun-python-sdk-ecs

2. 将 SDK 导入到工程中
具体操作步骤可参考官网帮忙文档,地址:https://help.aliyun.com/document_detail/25699.html?spm=a2c4g.11186623.6.1483.512e73fbxDWOfZ

3. 创立立刻失效容量预约公有池
创立容量预约公有池的对应 API 为 CreateCapacityReservation
其中 <accessKeyId> 和 <accessSecret> 须要替换为对应购买账号的 AK 信息。3.1 Java 版 Demo
创立公有池:立刻失效容量预留
在线接口体验:https://api.aliyun.com/?spm=5176.12818093.resource-links.dapi_platform.54ce16d07XdZhp#/?product=Ecs&version=2014-05-26&api=CreateCapacityReservation&tab=DEMO&lang=JAVA

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.ecs.model.v20140526.*;

public class CreateCapacityReservation {public static void main(String[] args) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        CreateCapacityReservationRequest request = new CreateCapacityReservationRequest();
        request.setRegionId("cn-hangzhou");

        List<String> zoneIdList = new ArrayList<String>();
        zoneIdList.add("cn-hangzhou-i");
        request.setZoneIds(zoneIdList);

        request.setInstanceType("ecs.c6.2xlarge");
        request.setPeriod(1);
        request.setPeriodUnit("Hour");
        request.setPrivatePoolOptionsName("PrivatePoolName");
        request.setDescription("PrivatePoolDescription");
        request.setPrivatePoolOptionsMatchCriteria("Open");
        request.setEndTimeType("Unlimited");
        request.setInstanceAmount(10);
        List<RunInstancesRequest.Tag> tagList = new ArrayList<RunInstancesRequest.Tag>();
        RunInstancesRequest.Tag tag1 = new RunInstancesRequest.Tag();
        tag1.setKey("11");
        tag1.setValue("22");
        tagList.add(tag1);
        request.setTags(tagList);// 注入 tags
        try {CreateCapacityReservationResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {e.printStackTrace();
        } catch (ClientException e) {System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}


创立实例 -Open 凋谢匹配
在线接口体验:https://api.aliyun.com/?spm=5176.12818093.resource-links.dapi_platform.54ce16d07XdZhp#/?product=Ecs&version=2014-05-26&api=RunInstances&tab=DEMO&lang=JAVA

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.ecs.model.v20140526.*;

public class RunInstances {public static void main(String[] args) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        RunInstancesRequest request = new RunInstancesRequest();
        request.setRegionId("cn-hangzhou");
        request.setZoneId("cn-hangzhou-i");
        request.setInstanceType("ecs.c6.2xlarge");
        request.setInstanceChargeType("PostPaid");
        request.setPeriod(1);
        request.setPeriodUnit("Hour");
        request.setNetworkType("vpc");
        request.setImageId("aliyun_2_1903_x64_20G_alibase_20200529.vhd");
        request.setSystemDiskSize(40);
        request.setSystemDiskType("cloud_ssd");
        request.setPrivatePoolOptionsMatchCriteria("Open"); // 公有池 凋谢匹配参数
        request.setSecurityGroupId("sg-xxx");
        request.setVSwitchId("vsw-xxx");
        try {RunInstancesResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {e.printStackTrace();
        } catch (ClientException e) {System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}

创立实例 -Target 指定匹配
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.*;
import com.aliyuncs.ecs.model.v20140526.*;

public class RunInstance {public static void main(String[] args) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);

        RunInstancesRequest request = new RunInstancesRequest();
        request.setRegionId("cn-hangzhou");
        request.setZoneId("cn-hangzhou-i");
        request.setInstanceType("ecs.c6.2xlarge");
        request.setInstanceChargeType("PostPaid");
        request.setPeriod(1);
        request.setPeriodUnit("Hour");
        request.setNetworkType("vpc");
        request.setImageId("aliyun_2_1903_x64_20G_alibase_20200529.vhd");
        request.setSystemDiskSize(40);
        request.setSystemDiskType("cloud_ssd");
        request.setPrivatePoolOptionsMatchCriteria("Target"); // 公有池 指定匹配
        request.setPrivatePoolOptionsId("crp-xxx"); // 公有池 id
        request.setSecurityGroupId("sg-xxx");
        request.setVSwitchId("vsw-xxx");
        try {RunInstancesResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {e.printStackTrace();
        } catch (ClientException e) {System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

    }
}


4- 公有池用户案

案例一:零门槛的 Tags 匹配,实现业务的精准、确定性交付

某 A 公司,每隔一段时间须要对业务进行降级,须要将服务器开释,从新进行业务的部署;在降级的过程中,须要确保业务依赖的资源确定性交付进去,从而保障业务服务的连续性。

这里有两个要害的变动:服务器开释、从新业务的部署。在云平台上,时时刻刻都有用户进行资源开释、购买。在这个动静过程中,可能 A 用户开释的资源,很快被 B 用户购买走了,A 用户此时可能就买不到了,须要等其余用户开释掉资源的时候,或者云平台凑巧有新增商品量的时候,才有机会购买胜利。一旦业务须要提早购买到相应的商品(期待有可售库存供下单),可能导致业务降级过程中断,服务连续性就受到影响。

为了解决这个问题,客户能够先购买到指标商品,进行业务的新部署,而后开释老的资源,这就减少了降级过程中老本投入:新购资源和老资源同时付费,并且降级过程工夫越久,投入的老本越多。另外,降级过程受先购买到资源影响,只有在新购资源交付胜利后,能力进行后续的降级,这使得业务降级打算受到资源交付影响,业务降级不肯定齐全按业务布局准时进行。

阿里云立刻失效的 CR 完满地符合了这个场景。A 公司购买一批适宜业务场景的公有池(立刻失效容量预约),而后释怀开释资源,在公有池上 100% 开出资源,进行业务的准时降级。在理论应用公有池过程中,阿里云提供了的标准化的接入计划:用户按业务管理需要,用户自主进行资源指定到哪个公有池进行资源交付。这就要求业务针对已有资源交付接口做轻微改变。然而,思考到用户接入老本、对已有业务的入侵水平,阿里云进一步提供了零门槛应用 CR,反对高级个性:通过客户受权后,云平台帮客户在新购实例的时候,批改默认的匹配属性为 Open。同时在已有 Tag 资源管理根底上,反对面向 Tag 的、业务专属的实例和公有池 Tag 匹配规定(业界首推的个性)。

A 公司应用 CR 的具体操作步骤如下:

  • A 公司技术人员通过 API 将须要应用立刻失效 CR 的存量实例匹配属性批改为 Open,
  • A 公司技术人员受权阿里云将其账户下新购实例的默认匹配属性从 None 批改为 Open,
  • A 公司技术人员依照外部的业务逻辑设计相应的 Tag 标签组合
  • A 公司技术人员依据需要创立具备相应 Tag 标签组合的立刻失效的 CR
  • 阿里云会依照 Tag 标签组合将存量的实例关联到对应的公有池中
  • A 公司技术人员创立 Tag 标签组合的新实例,该实例肯定可能创立胜利并且关联到对应的公有池

留神:A 公司不须要批改已有的任何脚本文件,从而能够零入侵的实现资源的确定性交付。

案例二:业务自主治理业务与公有池的精准、确定性交付

某 B 公司,资源交付团队负责整个公司的各个业务线的资源交付。为了晋升资源利用率,业务之间资源共享十分广泛,例如资源白天给 A 业务,早晨给 B 业务。例如 B 公司业务不定期,进行线上流动推广,推广期间会有一个显著的资源突发。这个过程中,产生资源的共享、资源的突发大量需要。

在云上,客户本人的资源进行共享,一种形式是云服务器不开释,服务上利用进行部署开释、调整;另外一种形式是资源开释、利用开释,新利用从新申请资源重新部署。前者资源和利用生命周期解偶,后者资源和生命周期统一。

在云原生理念驱动下,资源和利用生命周期统一能够实现:可编程基础设施、不可变基础设施。客户的诉求是资源随时开释并随时能够再次获取到。实际上,云上多用户并发资源购买,平台并不承诺用户 C 已开释的资源,持续留给用户 C 应用,而是有用户须要购买,就会发售。那么,资源产生资源开释,就不肯定能及时再次购买的到。

同理,大量突发资源的长期购买,也不肯定能购买胜利。客户的诉求是资源确定性交付,从而实现业务流动的推广。

阿里云提早失效容量预约、立刻失效容量预约,失效后的容量预约(就是客户专属的公有池),客户能够随时开释公有池的实例,从新在公有池上开出实例,公有池容量客户感知,业务的资源共享基于公有池,能够随时随地进行精准迁徙。B 公司研发实力雄厚,技术控制力强,自主集成公有池的 OpenAPI 到公司资源交付体系中,实现自主、精准资源交付。

B 公司的具体操作步骤如下:

  • B 公司技术人员通过 API 购买与资源布局相匹配的立刻失效 CR
  • B 公司技术人员在收到业务资源申请时,依据 B 公司资源管理策略,在资源创立 API,如 CreateInstance、RunInstances 中 设置 PrivatePoolOptionsMatchCriteria= Open。这种模式下,确保资源创立优先在开发的公有池中匹配,当公有池无奈匹配的时候,会到共有池申请,很好地实现了共享性业务的确定性、灵活性交付。或者 PrivatePoolOptionsMatchCriteria =Target, PrivatePoolOptions ID=crp-a。这种模式下,确保资源创立在指定的公有池 crp- a 中创立。很低地实现了重保或者高优先级业务的确定性交付。

下面两个案例,别离是(1)零门槛的、Tags 的匹配,实现业务的精准、确定性交付(2)业务自主治理业务与公有池的精准、确定性交付。两种模式能够宽泛地复用到各公司在阿里云上 ECS 资源确定性交付场景。

5- 公有池的关键技术

一句话概括就是:云平台为客户预留固定的资源库存,这部分库存仅提供给客户专属应用(包含客户受权的其余子账号或者 AliUid 应用)

Open|Target 调配技术原理

依据创立实例传入的参数:PrivatePoolOptionsMatchCriteria 值是 Open 或者 None 或者 Target,后端在抉择对应的资源池进行库存校验和交付。其中公有池也有 MatchCriteria,取值 Open 或者 Target。

匹配规定能够移步官网文档:https://help.aliyun.com/docum…

Tags 调配技术原理

Tags 调配实质上基于公有池的 Tags 和实例 Tags 的匹配规定进行调配,是调度零碎能力间接产品化服务的一种体现。那么调度零碎的所有相干技术实践上都能够派上用场。对于资源调度和治理的全面介绍能够参考书籍《深刻集群 - 大型数据中心资源调度和治理》一书。

总结

云上资源保障服务(例如具体的弹性保障、立刻失效容量预留等,以及将推出的容量布局服务),交付给客户一个云上公有池,并反对客户基于公有池进行确定性交付、灵活性交付、资源共享等。从而为客户业务确定性、连续性倒退提供了强有力的反对,客户也能够进行容量的共享进行老本的分担。

本文作者:李雨前,阿里云技术专家;文章已取得作者受权公布

本期最佳实际的分享就到这里了,咱们还会推出云上公有池的选购指南等续篇内容,敬请期待~

原文链接
本文为阿里云原创内容,未经容许不得转载。

正文完
 0