zoukankan      html  css  js  c++  java
  • 最佳实践丨云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航

    本文作者:阿里云技术专家李雨前;文章已获得作者授权发布

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

    云计算正朝着像水电煤一样的基础设施演进,支持用户按需使用、按量付费。目前,国内外各云服务商联合生态伙伴,努力提升云产品服务的快速迭代、推广使用,然而现实很骨感:用户依然面临偶发的在特定可用区购买云上特定计算产品实例失败的困境。云服务的计算理念--随时随地弹性,怎么这个场景下就不Work了?我们来分析分析。

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

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

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

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

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

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

    通俗理解:例如奥运这样的预期活动,用户入住酒店,保险的措施就是提前预订好房间。**对于云环境,就是在云上预订一个虚拟的IDC(私有池),这样就可以在私有池上确定性地交付资源。
    **
    file

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

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

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

    前面分析了客观现状,存在特定地域、特定时间段、特定算力商品的短时购买失败现象。对客户来说,需要结合自身场景,市场上云商品供应情况,合适的成本投入来实现资源交付的确定性,从而确保业务连续性。

    下文的分析以整体性概念为主,具体到客户的业务场景,还需要具体案例具体分析。例如预定地域的选择、实例规格的选择、预定时长的选择、预定数量的选择、总的成本最优等。资源交付的一种划分如图2所示,其中私有池是确定性交付的重要实现方式。结合业务场景,推荐最佳的私有池选购方案本文暂不介绍,后续专门出文档描述,帮助用户更好地依托云的产品服务,实现资源的确定性交付,保障业务服务的连续性。

    file

    图2-资源交付的一种划分
    ![file](https://img2020.cnblogs.com/other/1991058/202108/1991058-20210818171912259-1147482297.jpg)
    图3-确定性交付的可选策略
    ![file](https://img2020.cnblogs.com/other/1991058/202108/1991058-20210818171912491-1111200862.png)
    图4-灵活弹性交付的可选策略

    Aliyun 私有池选购和价值

    1- 相关概念

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

    file

    图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/document_detail/193634.html

    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/document_detail/193633.html

    Tags分配技术原理

    Tags分配本质上基于私有池的Tags和实例Tags的匹配规则进行分配,是调度系统能力直接产品化服务的一种体现。那么调度系统的所有相关技术理论上都可以派上用场。关于资源调度和管理的全面介绍可以参考书籍《深入集群-大型数据中心资源调度和管理》一书。

    总结

    云上资源保障服务(例如具体的弹性保障、立即生效容量预留等,以及将推出的容量规划服务),交付给客户一个云上私有池,并支持客户基于私有池进行确定性交付、灵活性交付、资源共享等。从而为客户业务确定性、连续性发展提供了强有力的支持,客户也可以进行容量的共享进行成本的分担。

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

  • 相关阅读:
    Codeforces 1037D【BFS】
    hdu 4725 The Shortest Path in Nya Graph 【拆点】+【最短路】
    LightOJ 1074
    POJ1062昂贵的聘礼(经典) 枚举区间 +【Dijkstra】
    POJ 3159 Candies 【差分约束+Dijkstra】
    POJ 3126 Prime Path【BFS】
    ZOJ 1940 Dungeon Master【三维BFS】
    POJ 3279 Fliptile (二进制枚举)
    HDU 2612 find a way 【双BFS】
    POJ 3414 Pot (输出路径)【BFS】
  • 原文地址:https://www.cnblogs.com/tanxingjisuan/p/15157800.html
Copyright © 2011-2022 走看看