依托亚马逊云科技构建韧性应用
背景
现代业务系统受到越来越多的韧性相关的挑战,特别是客户要求他们的业务系统 7×24 不间断的运行。因此,韧性对于云的基础设施和应用系统有着至关重要的作用。
亚马逊云科技把韧性视为一项最基本的工作,为了让我们的业务系统能持续优雅地提供服务,从各种故障和灾难中迅速恢复,亚马逊云科技不仅提供了全球高可用的基础设施,也提供了构建韧性系统的最佳实践和方法。
可靠性是工作负载按预期正确且一致地执行其预期功能的能力,为了实现这一目标,必须构建韧性架构。韧性是工作负载从基础设施、服务或应用程序中断中恢复、动态获取计算资源以满足需求以及减轻中断(例如配置错误或短暂的网络问题)的能力。
亚马逊云科技高可靠揭秘
亚马逊云科技韧性的技术实现
分区、区域和可用区隔离机制
分区
第一层隔离机制叫分区。每个分区是一组不同的区域,其中每个区域都位于一个分区中,并且大多数分区都有多个区域。亚马逊云科技总共包含三个分区:商业(海外)分区、中国分区和美国政府分区。每个分区包含账户、数据和资源,每个分区都有自己独立的 IAM 用户,您无法使用一个分区中的 IAM 凭证与另一分区中的资源进行交互。另外,某些云服务提供跨区域功能,例如 Amazon S3 跨区域复制或 Amazon Transit Gateway 区域间对等连接,这些类型的功能仅在同一分区中的区域之间受支持。
区域和可用区
截止到 2023 年 12 月,亚马逊云科技的服务横跨全球 32 个地理区域。每个区域由同一地理区域内多个物理上独立的可用区组成。所有区域目前都有 3 个以上的可用区。每个区域都是独立于其他区域, 区域之间的这种隔离机制确保单个区域发生服务故障时,其他区域的能正常运营,不受影响。32 个区域共有 102 个可用区,区域中的每个可用区彼此相隔几十公里到 100 公里,这样既能防止关联故障,又能实现数据的同步复制。可用区的这种隔离机制,确保它们不会同时受到公用电力或水中断、光纤中断、地震、火灾、龙卷风或洪水的影响。每个可用区都是由一个或多个独立的数据中心组成,具有独立且冗余的电力基础设施和网络连接。亚马逊云科技拥的区域和可用区模型已得到认可,并被 Gartner 列为运行高可用企业应用程序的推荐方法。
控制平面和数据平面隔离
亚马逊云科技服务分为控制平面和数据平面两部分。控制平面提供用于创建、读取/描述、更新、删除和列出(CRUDL)资源的管理 API,例如,启动新的 Amazon EC2 实例、创建 Amazon S3 存储桶以及描述 Amazon SQS 队列。数据平面是提供服务的主要功能。例如,正在运行的 EC2 实例本身、读取和写入 EBS 卷、在 S3 存储桶中获取和放置对象,以及回答 DNS 查询和执行运行状况检查的 Route 53。
控制平面往往是复杂的协调和聚合系统。当您启动 EC2 实例时,控制平面必须执行多项任务,例如查找具有容量的物理主机、分配网络接口、准备 Amazon EBS卷、生成 IAM 证书、添加安全组规则等。与控制平面相比,数据平面没有那么复杂,从统计学上讲,数据平面中发生故障事件的可能性较小。尽管数据平面和控制平面都有助于服务的整体运行和成功,但我们将它们视为不同的组件,即控制平面和数据平面是独立设计的,这种隔离既有性能方面的好处,又有可用性方面的好处。
亚马逊云科技提供的三种服务类型
根据区域和可用区的隔离机制以及控制平面和数据平面分离的原则,亚马逊云科技提供三种服务类型:全局(Global)服务、区域级(Region)服务、可用区级(AZ)服务。
全局(Global)服务
全局服务的控制平面和数据平面不是在每个区域中独立存在的,由于它们的资源不属于特定于区域的,因此将其称为全局服务。全局服务遵循传统的设计模式,即分离控制平面和数据平面,以实现静态稳定性,它们的控制平面托管在单个区域,而其数据平面是全球分布的。所谓静态稳定性,是指系统在依赖项故障或不可用期间,无需进行任何更改,在静态状态下继续正常运行。
让我们以 IAM 为例,以更深入地了解全球服务的架构。在下图中我们可以看到 IAM 的数据平面是独立存在于每个区域,该区域中的每个云服务都直接与 IAM 数据平面交互,以对它们收到的请求进行身份验证和授权。IAM 有独立的控制平面,您可以使用它来管理身份和策略等 IAM 资源,因此,当您调用 CreateRole 时,它会流经控制平面,控制平面还负责将这些更改传播到它们需要去的任何地方,在本例中是分区中的每个区域。当更改传播到数据平面后,数据平面将不再依赖控制平面而独立运行,实现静态稳定性。当 IAM 控制平面故障的情况下,无需任何更改,每个区域的身份验证和授权都可以继续正常运行。
区域级(Region)服务
区域级服务是建立在多个可用区域之上的服务,数据平面和控制平面都是区域级别。Amazon S3 、Amazon SQS 和 Amazon DynamoDB 是区域级服务的示例,它们利用可用区的独立性和冗余性来最大限度地减少基础设施故障带来的影响,例如,Amazon S3 将请求和数据分布在多个可用区之间,可以自动从可用区故障中恢复。客户可以通过使用区域服务实现其韧性目标,您只需要与区域终端节点进行交互。
可用区级(AZ)服务
可用区独立的特性使我们可以提供可用区级别的服务,例如 Amazon EC2 和 Amazon EBS,可用区服务可以指定将资源部署到哪个可用区。这些服务在一个区域内的每个可用区中独立运行,不依赖于其他可用区中的组件,之所以可以这样做是因为有可用区级别的数据平面。在某些情况下,例如 EC2,还提供了区域级控制平面端点,以便于与服务交互。您可以通过部署多可用区架构运行具有更高可用性、容错能力和可扩展性的生产级工作负载,当工作负载使用多个可用区架构时,可以更好地隔离和保护客户免受影响单个可用区物理基础设施问题的影响,如果架构正确,即使一个可用区出现故障,工作负载也能保持运行。
单元架构
单元架构是一种设计模式,该模式将服务切分为多个部署堆栈,每个部署堆栈称为“单元” ,每个单元之间都是互相独立的,不共享任何内容,包括数据库,每个单元服务一个或多个客户。
对于可用区级别的服务,如果没有单元架构,服务的爆炸半径是整个可用区,如果采用了单元架构,理论爆炸半径已从整个可用区减少到仅该可用区中的单元。对于区域级别的服务也是一样的道理,有了单元架构,服务的故障限制在单元内。因此,影响是 1/n,其中 n 是单元的数量,1/n 可能只占您支持的总客户的一小部分,实际上单元的数量远高于下图中显示的 3 个。
随机分片(Shuffle Sharding)
随机分片已成为一种核心设计模式,使我们可以提供具有高性价比的多租户服务,为每个客户提供单租户体验。随机分片简单而不失强大功能,它的强大远超我们最初的设想。我们以 Route 53 为例,说明随机分片的工作原理。
Route 53 是全局服务,其服务可用性至关重要,采用随机分片的方法保证其架构韧性。对于 Route 53,亚马逊将流量分配到 2048 个虚拟名称服务器中,这些服务器是虚拟的,每个客户域由四个虚拟名称服务器组成的分片承载,可能的分片组合达到 7300 亿个。因为我们有很多可能的随机分片,因此我们可以为每个客户域分配一个唯一的分片。实际上,我们可以更进一步,确保没有任何客户域与任何其他客户域共享两个以上的虚拟名称服务器。
亚马逊云科技韧性的运营实现
服务责任模型
我们采用服务责任模型,激励团队不断改进其运营。我们的工程和产品管理工作由小型多学科团队领导,他们对所提供的服务拥有强大的所有权。这种所有权不仅负责设计和启动服务,还负责在生产过程中运营服务,并在出现问题时随时待命。
运营准备情况审核
在启动之前,还需要使用运营准备审核(ORR)流程来审核所有新服务的运营准备情况。启动团队回答一系列有关韧性的问题以及其他已知的最佳实践,并使用标准化的运行手册来确保他们的服务符合标准。服务部署后,每周召开运营会议,检查系统的运营性能以及任何未解决的问题。
安全、持续部署
当对部署软件进行服务更新或推出新服务时,我们使用安全、持续的部署管道。通过使用广泛的预生产测试、自动回滚和交错生产部署,将自动化部署安全构建到发布过程中,使我们能够最大限度地减少错误部署对生产造成的潜在影响。例如,服务的更新从小处开始;该更新首先部署到可用区内的单个最小单元(OneBox 阶段),并经过指定的等待期以验证没有出现问题。从那里开始,更新将部署到整个可用区的其余部分,然后部署到其他可用区,然后部署到单个区域,最后部署到其余区域。
错误流程纠正:如果出现任何问题,我们会利用错误纠正(CoE)流程等事件管理机制来帮助我们的团队了解根本原因。问题得到缓解后,我们会推动全公司范围内的工程冲刺,以确保所有服务中的问题得到解决,从而减少未来类似事件影响其他服务的可能性。这些经验教训会被记录下来并成为运营准备情况审核(ORR)流程的一部分,从而确保类似的问题不会再次发生。
依托亚马逊云科技构建韧性应用
云上高可用系统
当我们考虑在亚马逊云科技上部署具有高可用能力的应用时,我们第一个可以依赖的就是可用区,可用区设计权衡考虑了延迟、可用性、成本,方便客户构建高可用的应用。我们以下图一个非常标准的 Web 三层架构来展示了如何使用多可用区实现高可用性。
首先是网络层,我们将 ELB 的多个 endpoint 部署在每个可用区,建议启用 cross-zone load balancing,从而让 ELB 能够容忍任意 endpoint 的故障。ELB 还通过 TargetGroup 为其背后的应用实例提供健康检查功能,及时摘除异常的应用实例或增加可用的应用实例。建议为应用 health check 设计一个专门页面,能够判断应用是否能够真正处理业务流量(readiness)。NAT Gateway 为 private subnet 主动访问外部提供了网关服务,在设计部署架构时,应该为 VPC 内的每个可用区(AZ)创建 NAT Gateway,并将映射到该 AZ 的所有 subnet 默认路由指向该 AZ 的 NAT Gateway,不仅能够实现 AZ 级别的网络高可用,同时能避免到 Internet 的流量产生 Cross AZ 费用。
其次,在部署时,应将应用 stateless 优化后,部署在跨 3 个可用区的 Auto Scaling Group(ASG)中,并结合 ELB 实现应用的负载均衡。当应用实例故障,ASG 将自动替换故障的节点,帮助系统恢复正常。ASG 能应对一般的高可用需求,但对于关键业务场景,使用 ASG 应对 AZ 级别的故障并不能实现静态稳定性的最佳实践,因为 ASG 依赖控制面来获取计算资源。因此对于核心的关键业务,还需要考虑冗余,保证在故障时 ASG 失效的极端情况下仍然有足够的资源应对 100% 的业务流量,实现静态稳定性。
最后,在 Web 三层架构里,用户往往使用 MySQL/PostgreSQL 等关系数据库用于用户数据的访问存取。针对这些开源数据库软件,用户往往需要花费大量的时间精力,设计数据库的高可用以及确保高可用情况下的数据一致性。亚马逊云科技为用户提供 RDS 服务,为这些开源数据库提供内建的跨 AZ 高可用能力,在 RDS MySQL 中开启 Multi-AZ 情况下,当数据库实例故障,RDS 将自动为用户故障转移数据库到其他的 AZ。RDS 还为用户提供自动备份能力,通过 snapshot 快速备份数据库数据,用于应对误删除等操作。对于关键的业务场景,往往需要更高的可用性和性能,亚马逊云科技为用户提供了 Aurora 数据库服务,Aurora 支持 MySQL 和 PostgreSQL,内建跨多 AZ 的高可用能力。其数据跨 3 个 AZ,共 6 个副本,提供数据层的高度冗余。Aurora 还提供读写和只读的 endpoint 用于帮助客户实现读写分离和更短的故障切换时间。我们看到该架构还使用了一些区域级的服务 Amazon DynamoDB 和 Amazon S3,这些服务不会向用户公开其可用区配置,但会跨多个可用区运行计算和存储,我们依靠区域服务来消除单个可用区故障的的影响。
当我们考虑在亚马逊云科技上部署具有高可用能力的应用时,我们第二个可以依赖的是托管服务来满足各式各样的业务需求,帮助用户减少使用这些技术自身的高可用设计和维护工作。亚马逊云科技提供的托管服务几乎都实现了跨AZ的高可用能力。在标准的 Web 三层架构中使用的常见服务,如 Amazon Elastic Kubernetes Service、Amazon Elastic Container Service、Amazon ElastiCache、Amazon Managed Streaming for Apache Kafka、Amazon DocumentDB、Amazon Keyspaces 等托管服务都提供了跨 AZ 的高可用能力。
以 Amazon EKS 为例,亚马逊云科技在设计此类服务时,充分考虑了组件的跨 AZ 冗余。
EKS 服务分为控制平面和数据平面。其中控制平面完全托管在 EKS-managed VPC 内,核心的 etcd 服务部署在 3 个 AZ,通过至少 3 个奇数节点进行选举 leader,遵循少数服从多数原则,因此跨 AZ 的隔离对于 etcd 非常重要,需要保障单一 AZ 的运行实例异常情况下,仍然有超过 1/2 的运行实例处于健康状态。kube-apiserver 是无状态的服务可随着负载的增大自动的扩展节点,并提升实例的规格。kube-scheduler、kube-controller 服务自身支持高可用,通过 leader 选举只有一个服务实例处于工作状态,故障时重新选举 leader 切换到健康运行实例,因此也需要部署多个确保高可用,这些在 EKS 服务中,都是由亚马逊云科技托管和实现高可用的,用户只需关注 Worker 节点的高可用。
Worker 节点由 Auto Scaling Group 维护,可针对自身的业务需要,将单个 Auto Scaling Group 跨多个 AZ 实现高可用,或者为每个 AZ 创建单独的 Auto Scaling Group。因此,Worker 可轻松地实现高可用。
最后,针对用户的应用部署,应充分的考虑 Pod Disruption Budget、Affinity and anti-affinity、Readiness 和 Liveness 以及 Startup 探针、Graceful Shutdown、PreStop hooks、SIGTERM 等设计,配合 EKS 的机制实现应用的 Zero Downtime 运行。
云上灾难恢复系统
灾难恢复(DR)是韧性策略的重要组成部分,涉及灾难发生时工作负载如何响应(灾难是对您的业务造成严重负面影响的事件,如自然灾害、技术故障、人为错误)。灾难恢复必须基于业务目标设定 RTO(称为恢复时间目标)和 RPO(称为恢复点目标),并制定相应的灾难恢复策略,以避免数据丢失并减少停机时间。
亚马逊云科技可供您使用的灾难恢复策略大致可分为四种方法,从低成本、低复杂性的备份与恢复策略到使用多个区域的更复杂的策略。对于高可用的工作负载,您可能只需要备份和恢复方法来进行灾难恢复,如果您对灾难的定义超出了区域破坏或受损的范围,或者如果您需要遵守法规要求,那么您应该考虑守夜灯、温备/热备或多区域多活的策略。
备份与恢复
备份和恢复是减少数据丢失或损坏的合适方法,此方法还可用于通过将数据复制到其他区域来缓解区域灾难,或者缓解工作负载只部署到单个可用区缺乏冗余的情况。除了数据之外,您还必须在恢复区域中重新部署基础设施、配置和应用程序代码。为了能够快速重新部署基础设施而不会出现错误,您可以使用 CloudFormation 或云开发工具包(Amazon CDK)等服务使用基础设施即代码(IaC)进行部署。除了用户数据之外,还请务必备份代码和配置,包括用于创建 Amazon EC2 实例的 Amazon 系统映像(AMI)。Amazon Backup 提供一个集中位置来配置、计划和监控备份的功能。对于 Amazon S3,您可以使用 Amazon S3 跨区域复制功能(CRR)。
守夜灯
守夜灯方案将数据从一个区域复制到另一个区域,数据(例如数据库和对象存储)始终处于开启状态,但应用程序代码和配置处于“关闭”状态,并且仅在测试期间或灾难恢复故障转移时使用,配置、代码更改同时部署到每个区域。守夜灯方法通过最大限度地减少活动资源来减少灾难恢复的持续成本,并简化灾难发生时的恢复流程。
温备/热备
温备方案确保在另一个区域中存在生产环境的缩小(热备是和生产环境 1:1 配置)但功能齐全的副本,此方案扩展了守夜灯概念并缩短了恢复时间,因为您的工作负载在另一个区域始终处于开启状态。此方法还允许您更轻松地实施灾难恢复测试,以增强您从灾难中恢复能力的信心。
多区域多活
多区域多活方案可以在多个区域同时运行工作负载。通过多区域多活方案,用户可以访问任何区域的工作负载。这种方法是最复杂、成本最高的灾难恢复方法,但通过正确的技术选择和实施,它可以将大多数灾难的恢复时间和数据丢失减少到接近于零。下图是以两个区域为例,并可扩展到多个区域。
使用混沌工程测试韧性
混沌工程是在生产环境或尽可能接近生产的环境中定期进行实验的学科, 目的是建立抵御生产环境故障的能力及信心。利用混沌工程,您的团队能够在基础设施、工作负载和组件级别,以可控的方式不断注入真实世界的故障,而对最终客户的影响极小甚至没有影响。混沌工程使您的团队能够从故障中学习,观察、测量和提高工作负载的韧性,并验证在发生事件时,系统会发出警报并通知团队。如果您的系统能够经受住这些故障,那么应将混沌实验作为自动回归测试的一部分,这样一来,将混沌实验作为系统开发生命周期(SDLC)的一部分,以及作为 CI/CD 管道的一部分来执行,持续提高系统韧性。但需要强调,混沌工程不是一个孤立的系统实验,它需要系统本身的韧性、可靠性设计以及可观测性的实现,是一个系统整体的设计实践。
总结
亚马逊云科技把韧性视为一项最基本的工作,在设计之初就通过技术手段(包括分区、区域和可用区的隔离机制、控制平面和数据平面隔离机制、单元架构和随机分片等)保证了云平台的韧性,并通过运营模型和机制(包括服务责任模型、运营准备情况审核、安全持续部署、错误流程纠正等)保证持续的韧性。客户可以依托亚马逊云科技,根据自身的业务目标构建韧性的架构,包括云上高可用系统和云上灾难恢复系统,并通过混沌工程进行持续提高。
参考文档
Amazon 故障隔离边界-区域隔离:https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/partitions.html
Amazon 故障隔离边界-静态稳定设计: https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/static-stability.html
Amazon 故障隔离边界-服务类别:https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/aws-service-types.html
单元架构:https://docs.aws.amazon.com/zh_cn/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/what-is-a-cell-based-architecture.html
使用随机分区进行工作负载隔离:https://aws.amazon.com/cn/builders-library/workload-isolation-using-shuffle-sharding/
Amazon 运营就绪审查和纠错流程:https://docs.aws.amazon.com/wellarchitected/latest/operational-readiness-reviews/wa-operational-readiness-reviews.html
Amazon 自动化、安全的持续部署:https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/
Amazon Two-Pizza Teams:https://docs.aws.amazon.com/zh_cn/whitepapers/latest/introduction-devops-aws/two-pizza-teams.html
在亚马逊云科技上构建灾难恢复系统:https://docs.aws.amazon.com/zh_cn/whitepapers/latest/disaster-recovery-workloads-on-aws/disaster-recovery-options-in-the-cloud.html
使用混沌工程测试系统韧性:https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_testing_resiliency_failure_injection_resiliency.html
上下滑动获取完整信息
本篇作者
廖良茂
亚马逊云科技解决方案架构师,负责基于亚马逊云科技云计算方案架构的咨询和设计,在国内推广亚马逊云科技云平台技术和各种解决方案,目前专注于韧性和数据库领域。在加入亚马逊云科技之前就职于微软、甲骨文公司,熟悉数据库、备份和容灾等解决方案。
谷雨
亚马逊云科技资深解决方案架构师,专注于迁移上云、云上业务连续性的实现等技术方向。
李俊杰
亚马逊云解决方案架构师,负责云计算方案的咨询与架构设计,同时致力于容器方面研究和推广。在加入亚马逊云科技之前曾在金融行业 IT 部门负责传统金融系统的现代化改造,对传统应用的改造,容器化具有丰富经验。
林旭芳
亚马逊云科技解决方案架构师,主要负责亚马逊云科技云技术和解决方案的推广工作,在 Container、主机、存储、容灾等方向有丰富实践经验。
星标不迷路,开发更极速!
关注后记得星标「亚马逊云开发者」
听说,点完下面4个按钮
就不会碰到bug了!
相关文章:
依托亚马逊云科技构建韧性应用
背景 现代业务系统受到越来越多的韧性相关的挑战,特别是客户要求他们的业务系统 724 不间断的运行。因此,韧性对于云的基础设施和应用系统有着至关重要的作用。 亚马逊云科技把韧性视为一项最基本的工作,为了让我们的业务系统能持续优雅地提供…...
Prometheus-JVM
一. JVM监控 通过 jmx_exporter 启动端口来实现JVM的监控 Github Kubernetes Deployment Java 服务,修改 wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar# 编写配置文件࿰…...
flink sql1.18.0连接SASL_PLAINTEXT认证的kafka3.3.1
阅读此文默认读者对docker、docker-compose有一定了解。 环境 docker-compose运行了一个jobmanager、一个taskmanager和一个sql-client。 如下: version: "2.2" services:jobmanager:image: flink:1.18.0-scala_2.12container_name: jobmanagerports:…...
pytorch张量的创建
张量的创建 张量(Tensors)类似于NumPy的ndarrays ,但张量可以在GPU上进行计算。从本质上来说,PyTorch是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何n维数组。 import torch import numpy torch.manual_seed(7) # 固…...
Web自动化测试工具的优势分析
Web自动化测试工具在现代软件开发中扮演着关键的角色,帮助团队确保Web应用程序的质量和稳定性。然而,选择合适的Web自动化测试工具对项目的成功至关重要。本文将介绍Web自动化测试工具优势是什么! 1. 自动化执行 Web自动化测试工具能够模拟用户的行为&am…...
黑豹程序员-读properties属性文件本地正常,打包jar后运行出错
读properties属性文件本地正常,打包jar后运行出错 java.io.FileNotFoundException:file:\D:\code\xml-load\target\XX.jar!\XXX(文件名、目录名或卷标语法不正确。)原因是读取方式不正确 当使用Spring Boot将应用打成jar时,需要读取resources目录下配置…...
PyQt6 QTimer计时器控件
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计52条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…...
Vue:defineAsyncComponent(异步组件)、component(动态组件)、keep-alive(缓存组件)
异步组件:defineAsyncComponent Vue3 的 defineAsyncComponent 特性可以让我们延迟加载组件。因为在默认情况下,在构建项目或运行项目时,会将所有所需要的打包成一个整体,vue为单页面应用,同步加载大量的页面代码会导…...
14 款最佳文件恢复软件 [2024 年最佳精选工具]
顶级文件恢复软件的综合列表和比较。阅读此详细评论以选择最佳文件恢复工具并轻松恢复您的文件: 您在选择文件恢复工具时遇到困难吗?在阅读了对十大文件恢复软件的评论后,您可以做出正确的决定。 数据丢失是一个严重的问题,会损…...
Redis基础篇-004 Redis的Java客户端
Redis客户端分为三类: 命令行客户端图形化桌面客户端编程客户端(java客户端) redis可视化工具和客户端 1、 Jedis快速入门 Jedis的官网地址: https://github.com/redis/jedis 1.1 新建一个Maven工程并引入以下依赖 <!--引入…...
【数据结构和算法】---栈和队列的互相实现
目录 一、用栈实现队列1.1初始化队列1.2模拟入队列1.3模拟出队列1.4取模拟的队列头元素1.5判断队列是否为空 二、用队列实现栈2.1初始化栈2.2模拟出栈2.3模拟入栈2.4取模拟的栈顶元素2.5判读栈是否为空 一、用栈实现队列 具体题目可以参考LeetCode232. 用栈实现队列 首先要想到…...
机场信息集成系统系列介绍(6):机场协同决策支持系统ACDM
目录 一、背景介绍 1、机场协同决策支持系统是什么? 2、发展历程 3、机场协同决策参与方 4、相关定义 二、机场协同决策ACDM的建设目标 (一)机场协同决策支持系统的宏观目标 1、实现运行数据共享和前序航班信息透明化 2、实现地面资源…...
GO设计模式——17、解释器模式(行为型)
目录 解释器模式(Interpreter Pattern) 解释器模式的核心角色: 优缺点 代码实现 解释器模式(Interpreter Pattern) 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式&am…...
基于SSM的大学生兼职平台的设计与实现
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的大学生兼职平台的设计与实现,j…...
Ignite内存配置
配置内存 #1.内存架构 #1.1.概述 Ignite内存架构通过可以同时在内存和磁盘上存储和处理数据及索引,得到了支持磁盘持久化的内存级性能。 多层存储的运行方式类似于操作系统(例如Linux)的虚拟内存。但是这两种类型架构之间的主要区别是&…...
前端基础vue路由懒加载
为什么用路由懒加载 首屏组件加载速度更快一些,解决白屏问题,常言道需要就加载,不需要就先放一边 懒加载定义 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载。 使用 常用的懒加载方式有两种:即…...
C++系列第九篇 数据类型下篇 - 复合类型(指针高级应用)
系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建(WSL 方向)-CSDN博客 C 系列 第二篇 你真的了解C吗?本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 C 系列 第四篇 C 数据类型…...
python三大开发框架django、 flask 和 fastapi 对比
本文讲述了什么启发了 FastAPI 的诞生,它与其他替代框架的对比,以及从中汲取的经验。 如果不是基于前人的成果,FastAPI 将不会存在。在 FastAPI 之前,前人已经创建了许多工具 。 几年来,我一直在避免创建新框架。首先&…...
html基础2
视频video <video src"视频的路径"controls"控制播放、暂停、音量等"autoplay"自动播放"loop"循环播放"width"视频播放器的宽度"height"视频播放器的高度"> </video>还有做浏览器兼容的方式…...
基于博弈树的开源五子棋AI教程[5 启发式搜索]
文章目录 1 最大化攻击者/最小化防守者排序2 置换表启发3 杀手表启发4 历史表启发历史表以及杀手表的维护初始化追加杀手表项清空杀手表 启发式搜索的姿势千奇百怪,本文只讨论一下几种 //搜索空间 #define Search_Space_MVA 0 //最优价值攻击者[分数最大] #d…...
JavaScript原型,原型链 ? 有什么特点?
一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个…...
Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题
Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题 目录 Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题 一、简单介绍…...
linux 中 C++的环境搭建以及测试工具的简单介绍
文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍 安装 : sudo apt install make makefile 的规则: 举例说明 包括:目标文件 、 依赖文件 、 生成规则 使用 : make make clean CMake : CMake是一个…...
448. 找到所有数组中消失的数字
找到所有数组中消失的数字 描述 : 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 题目 : LeetCode 448. 找到所有数组中消失的数字: 448. 找…...
为何在下雪天它“失宠”了,传统雪地靴居然不适合下雪穿
随着冬至的到来,一年之中最寒冷的“三九天”正式拉开序幕。近期各地纷纷下起了大雪,在这场大雪中雪地靴似乎“失宠”了。在社交媒体上,有网友吐槽“雪地靴根本不能下雪穿”,后面有不少网友纷纷分享了自己在雪地靴上尴尬的经历&…...
第34节: Vue3 调用内联处理程序中的方法
在UniApp中使用Vue3框架时,你可以在模板中直接调用组件内联处理程序中的方法。以下是一个示例: <template> <view> <button click"handleClick">Click me</button> <p>{{ message }}</p> </view&…...
JavaScript--明明白白Promise (Park One)
明明白白Promise (Park One) Promise是一种用于处理异步操作的特殊对象。它代表了一个尚未完成但最终会完成的操作,并可以在操作完成后返回结果或错误。 Promise有三种状态:pending(进行中)、fulfilled(已完成&#…...
el-form与el-upload结合上传带附件的表单数据(后端篇)
1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈,参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据(前端篇)-CSDN博客。 2.需求描述 在OA办公系统中,流程表单申请人…...
postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升
最近遇到一个问题,就是不同源的两个网页之间进行localstorage或者cookie的共享。 上周其实遇到过一次,觉得麻烦就让后端换了种方式处理了,昨天又遇到了同样的问题。 使用场景 比如从网页A通过iframe跳转到网页B,而且这两个网页…...
上市公司-绿色投资者数据集(2000-2022)
上市公司-绿色投资者数据(2000-2022年)是一份涵盖了过去二十多年中国上市公司绿色投资情况的详细数据集。该数据集包括了各上市公司的股票代码、年份、会计年度、股票简称,以及STPT(特殊处理股票的标识),行…...
哈尔滨大型网站建设电话/站长工具关键词
Buffer Pools 1 Locks vs. Latches 在讨论 DBMS 如何保护其内部元素时,我们需要区分 lock 和 latches。 锁 lock 保护数据库逻辑内容(例如,元组、表、数据库)免受其他事务的影响。在交易期间持有。需要能够回滚更改。 锁存器…...
wordpress showposts/2021百度最新收录方法
计算机网络 练习(一百一十) 当使用时间到达租约期的()时,DHCP 客户端和 DHCP 服务器将更新租约。 A. 50% B. 75% C. 87.5% D. 100% ---------------------------------------- 答案: A 解析: …...
免费的建设网站软件下载/提升关键词排名seo软件
方式1、 直接保存视频预览的数据帧 在预览方法中imgData数据就是视频帧 android默认的视频采集格式是NV21,(属于YUV420) 在onPreviewFrame中传进来的byte[] data即为NV21格式。 NV21 的存储格式是,以4 X 4 图片为例子 占用内…...
做程序题的国外网站/营销型网站建设实训总结
1、django是怎么用的?具体的呢? 2、能自己写前端代码吗?前端的框架呢? 3、支付宝/微信支付实现,是自己看的接口文档吗?能看懂开发文档吗? 4、你之前做的项目中,最复杂的查询是&#…...
主流网站模板/搜索引擎网站排名
上篇:第 22 节 Flink 状态、恢复、快照 1、State Backend(状态的后端存储) 2、Restart Strategies(重启策略) 3、重启策略之固定间隔 (Fixed delay) 4、重启策略之失败率 (Failure rate) 5、重启策略之无重启 (No restart) 第一种:全局配置 flink-conf…...
免费做网站公司/网站人多怎么优化
作者:岑川链接:https://www.zhihu.com/question/51179323/answer/124680433来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。为什么实现同样的电路,asic频率总是(几乎是一定…...