同学,要不要来挑战双11零点流量洪峰?

阿里妹导读:双十一的零点,整个电商系统的请求速率到达峰值。如果将这些请求流量只分配给少部分 server,这些机器接收到的请求速率会远超过处理速率,新来的任务来不及处理,就会产生请求任务堆积。

今年的中间件性能挑战赛就围绕“挑战双11零点流量洪峰”展开。自2015年开始,中间件性能挑战赛已经成功举办了四届,被历年大赛选手称为“中间件技术的风向标”。接下来,跟随阿里巴巴中间件团队的郭浩,一起来围观赛题,解读赛题。

在现代分布式应用中,服务请求是由物理机或虚拟机组成的 server 池进行处理的。 通常,server 池规模巨大且服务容量各不相同,受网络、内存、CPU、下游服务等各种因素影响,一个 server 的服务容量始终处于动态变动和趋于稳定的状态,如何设计和实现这种系统的负载均衡算法是一个极具挑战的难题。

自适应负载均衡的需求背景

负载均衡有两个主要目标:

  • 保持较短的请求响应时间和较小的请求阻塞概率;
  • 负载均衡算法的 overhead 在可控级别,不占用过多的 CPU 、网络等资源。

自适应负载均衡是指无论系统处于空闲、稳定还是繁忙状态,负载均衡算法都会自动评估系统的服务能力,进行合理的流量分配,使整个系统始终保持较好的性能,不产生饥饿或者过载、宕机。

这种算法对于现在的电商系统、数据中心、云计算等领域都很有必要,使用自适应负载均衡能够更合理的利用资源,提高性能。

对用户而言,一旦产生任务堆积,请求会变慢甚至超时,体验严重下降,甚至导致服务不可用。而处理请求的机器也会由于堆积的任务越来越多而发生严重过载,直到被打垮。剩余的尚未宕机的其它机器会逐渐重复这个过程,直至整个应用不可用,发生系统故障。

为了避免这种情况发生,我们可能会想到一种常用的办法:在服务上线前提前进行压测,使用压测的容量作为限流值,当线上服务的请求速率大于限流值的时候,服务拒绝新到的服务,从而保障服务始终可用。但是这种方式也存在问题:压测时测试的容量进行限流通常会趋于保守,不能充分发挥异构系统的全部性能;也无法智能地应对由于网络、下游服务变化而导致的容量下降等问题,系统仍然存在宕机风险。

因此,我们需要具备自适应能力的负载均衡算法,来更好地进行流量分配调度以及稳定性保障,追求极致性能,挑战大促等场景下的流量洪峰。

结合中间件性能挑战赛的赛题

我们结合「第五届中间件性能挑战赛」中的初赛场景,来一起探讨一下设计和实现一个自适应的负载均衡的基本思路。

image

本次挑战赛的场景由施压程序(阿里云性能测试PTS)、服务调用方(Consumer)和三个规格不同的服务提供方(Provider) 组成。在评测过程中,每个程序都部署在不同的物理机上,以避免因 CPU、网络资源的竞争,导致评测程序抖动,影响最终评测成绩。

Becnhmarker 负责请求 Consumer, Consumer 收到请求后,从三台物理规格不同、服务响应时间和最大并发都不同的 Provider 中选择一个进行调用并返回结果。选择哪一个 Provider 进行调用的流程就是本次挑战赛需要实现的负载均衡算法。

为了简化环境部署和提升性能,本次挑战赛没有使用服务注册和发现机制。三个 Provider 对应的 URL 都已经被直接配置在了 Consumer 中,选手在开发和测试时可直接通过 Provider-small 等 hostname 访问相应的 Provider。

赛题分析

题目描述很简单,不考虑 Consumer 直接拒绝的情况下,场景可以简化为 3 选 1 的问题,但如何进行这个决策则是本次挑战赛考察的难点和重点。

官方题目组提供了 Random 算法作为默认实现:从 3 个 Provider 中随机取任意一个。对于单 dispatcher (在本次赛题中是 Consumer) 同构系统的场景,Random可以达到渐近负载均衡, 每个 Provider 接收到的总请求数接近。但是对于多 dispatcher 或异构系统而言,Random 算法由于缺少全局状态,无法保证全局随机,极端条件下,多个 dispatcher 可能将请求同时分配到一台 Provider 上,导致系统存在服务过载和宕机的风险;异构系统中,不同 Provider 服务容量实际是不同的,即使每个 Provider 请求速率相同也会产生空闲、稳定、过载等不同的服务状态,无法实现最优流量分配,更不能做到响应时间最小。显而易见,Random 并不是符合赛题要求的自适应算法。

那么,如何实现自适应负载均衡呢?接下来我们将利用题目给出的条件由浅入深的描述这个算法的设计过程。

自适应算法首先要解决如何对服务进行容量评估的问题。

本次比赛按照硬件规格不同,Provider 被分为 small、medium、和 large 三种,CPU 和内存对应的比例为 1:2:3 。在评测过程中,每个 Provider 的处理能力都会动态变化,主要体现在单次响应时间的变化和允许的最大的并发数上。来自 Consumer 的请求速率过快时, Provider 端新到的请求会排队等待处理,当排队线程数和工作线程数量之和达到最大线程数时,Provider 返回线程池用尽异常。在算法的实现和调优过程中,应该尽量避免产生线程池异常,减少排队。如何结合好程序和硬件的限制,区分出不同阶段的瓶颈,做出符合实际的容量评估是赛题的第一个难点。对于本次题目所采用的参数和变化过程,仅凭现有的理论和实践很难达到最优,所以需要选手充分理解题意和各参数配置,设计出更适合实际场景的算法。

第二个需要考虑的问题是如何应用容量评估结果,即如何维护代表 Provider 服务能力的状态,又如何在选择 Provider 阶段根据这些状态进行决策?

传统的单 Dispatcher 负载均衡模型由一个 Dispatcher 维护所有 Provider 的状态,在同构系统中,这种方式能够达到渐进最优负载均衡。但是它存在的问题也很明显:单 Dispatcher 性能存在天然瓶颈,可扩容性较差,当 Provider 数量成倍上升时,Dispatcher 需要维护的状态也在成倍上升,通信成本也在上升。本次挑战赛中为了降低难度,没有基于多 Dispatcher 模型构建题目,但多 Dispatcher 、多 Provider 才是 Dubbo 等微服务框架在实际生产环境中最常见的情况。因此,若能实现高性能且可扩展性良好的均衡算法,会是一个不错的加分项。

第三点是辅助接口的使用。为了不限制算法设计思路,赛题提供了多个可能用到的辅助接口,包括双向通信、Provider 限流等支持。但是这些接口都是非必选项,是否使用这些接口取决于算法实现的需要。

在评测环境中,任意一个 Provider 服务处理速率都小于评测程序的请求速率。三个 Provider 总的处理速率会在请求速率上下浮动。最终成绩由请求成功数和最大 TPS 组成,失败的请求不计入成绩。对于这个限制,可以有两种解读方式,一是为了保证服务不严重过载,可以适当拒绝请求。第二点是需要充分利用每个 Provider 的服务容量,保证性能最优的 Provider 请求数合理,适当的过载也是允许的。

以上仅作为一个主要的算法设计思路,优秀的负载均衡算法在工程上的实现也是很关键的一点,需要选取合适的数据结构,充分利用好内存和 CPU,压榨出比赛环境的每一点性能。当然,评测成绩并不代表一切,良好的代码结构、编码风格以及通用性,也在最终初赛成绩中占据很大比例。

关注“阿里技术”官方公众号,并在对话框内回复“中间件”,即可获得初赛赛题。

赛题评测

评测环境由 1 台 4 核 8G 的施压机,1 台 4 核 8G 的网关机和 3 台 4 核 8G 的 Provider组成。Consumer 和 Provider 程序都会限制 CPU 和内存使用,每个评测任务都会独占五台机器。

  • 准备跑分环境,创建并锁定工作区;
  • 根据提交的 Git 地址,从代码仓库中拉取代码;
  • 构建代码,生成最终执行的 fat JAR;
  • 启动三个 Provider ,并验证服务可用性;
  • 启动 Consumer ,并验证服务可用性;
  • 对系统进行预热,持续 30 秒;
  • 正式评测 1 分钟;
  • 取正式评测的总成功请求数和最大 TPS 作为最终成绩,上报天池系统;
  • 按顺序依次停止 Consumer、三个 Provider;
  • 清理 Docker 实例及镜像;
  • 收集日志并上传到 OSS;
  • 解锁工作区,清理环境。

总结

本文结合第五届中间件性能挑战赛的赛题背景、题目场景、题目分析和评测环境与过程的角度,介绍了自适应负载均衡算法的基本设计思路,希望对即将参加比赛的同学们能有所帮助,也欢迎更多的技术同学报名参加我们的挑战赛,分享你在算法方面的思考和实践。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 疑遭中间人攻击,最大暗网托管商再被黑!

整理 | 伍杏玲出品 | 程序人生(ID:coder_life)近期,在全球关注新冠肺炎疫情之际,黑客却频频动作,发动攻击:GitHub 疑遭中间人攻击,无法访问从26日下午开始,有网友表示国内…

Java-什么是面向对象

https://www.bilibili.com/video/BV12J41137hu?p60

Jenkins Pipeline脚本优化:为Kubernetes应用部署增加状态检测

引言 在软件部署的世界中,Jenkins已经成为自动化流程的代名词。不断变化的技术环境要求我们持续改进部署流程以满足现代应用部署的需要。在本篇博客中,作为一位资深运维工程师,我将分享如何将Jenkins Pipeline进化至不仅能支持部署应用直至R…

Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理

文章目录: Apache Flink 应用程序中的 Exactly-Once 语义Flink 应用程序端到端的 Exactly-Once 语义示例 Flink 应用程序启动预提交阶段在 Flink 中实现两阶段提交 Operator总结 Apache Flink 自2017年12月发布的1.4.0版本开始,为流计算引入了一个重要的…

一文教你如何使用 MongoDB 和 HATEOAS 创建 REST Web 服务

作者 | Ion Pascari译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国最近,作者在把HATEOAS实现到REST Web服务时遇到了一件有趣的事情,而且他也很幸运地尝试了一个名为MongoDB的NoSQL数据库,他发现该数据库在许多不需要管理实务的不同…

使用NGINX作为HTTPS正向代理服务器

NGINX主要设计作为反向代理服务器,但随着NGINX的发展,它同样能作为正向代理的选项之一。正向代理本身并不复杂,而如何代理加密的HTTPS流量是正向代理需要解决的主要问题。本文将介绍利用NGINX来正向代理HTTPS流量两种方案,及其使用…

IoT SaaS加速器——助力阿尔茨海默病人护理

场景介绍 阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病。据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人。痴呆症患者数量到2050年预计将是现在的近…

一个数据科学家需要哪些核心工具包?

作者 | Rebecca Vickery译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国数据科学家的主要作用是将机器学习、统计方法和探索性分析应用到数据中,来提取见解并帮助制定决策。 编程和计算工具的使用对该角色来说必不可少。 实际上,许多人都用这句…

Java-静态方法、非静态方法

// 学生类 public class Student {// 静态方法 staticpublic static void say01(){System.out.println("学生01 静态方法说话了");}// 非静态方法public void say02(){System.out.println("学生02 非静态方法说话了");} }静态方法、非静态方法 public cla…

SpringBoot2.x Flowable 6.4.2 开源项目

文章目录一、项目服务端初始化1. 创建数据库2. 初始化表结构.3. 表结构补充4. 配置文件修改5. 下载依赖6. 异常解决7. 启动服务端二、前端初始化2.1. 安装Node(V12.x.x以上)和NPM(V6.x.x以上)2.2. 安装淘宝镜像2.2. 初始化前端项目2.3. 启动项目2.4. web登录页面2.5. 效果图三、…

MongoDB 4.2 新特性解读

云数据库 MongoDB 版 基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。 了解更多 MongoDB World 2019 上发布新版本 MongoDB 4.2…

Java-类与对象的创建

// 学生类 public class Student {// 属性String name; // 默认 nullint age; // 默认 0// 方法public void study(){System.out.println(this.name " 在学习");} }public class Application {public static void main(String[] args) {// 实例化后会返回一个自己…

Spark3.0发布了,代码拉过来,打个包,跑起来!| 附源码编译

作者 | 敏叔V587责编 | 徐威龙封图| CSDN 下载于视觉中国Spark3.0已经发布有一阵子了,官方发布了预览版,带来了一大波更新,对于我们程序员来说,首先当然是代码拉过来,打个包,跑起来!&#xff01…

MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?

今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行。那么,你觉得这个数值多少才合适呢? 曾经在中国互联网技术圈广为流传着这么一个说法&#xff1…

Java-构造器

一个类即使什么都不写,它也会存在一个方法 package oop.demo02;/*** author blake.wang* date 2021-04-19 18:58*/ public class Person {// 一个类即使什么都不写,它也会存在一个方法,具体可以看一个空 类 的编译后的class文件// 显示的定…

IntelliJ IDEA 2020 基础设置

文章目录1. 字体设置2. 编码设置3. jdk设置4. 自动引入包和删除无用引入的包5. 打开文件左右联动定位1. 字体设置 菜单字体 编辑区 控制台 收缩自如 2. 编码设置 3. jdk设置 4. 自动引入包和删除无用引入的包 5. 打开文件左右联动定位

跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现

来源 | 阿丸笔记提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关。而事务的ACID(即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性D…

Java-封装

// 类 public class Student {// 属性私有private String name; // 名字private int id; // 学号private char sex; // 性别private int age; // 年龄// 提供一些可以操作这个属性的方法// 提供一些 public 的 get \ set 方法// get 获得这个数据public String getName(){r…

一条数据的漫游奇遇记

数据库存储引擎是一个有历史的技术,经过数十年的发展,已经出现很多优秀成熟的产品。阿里巴巴 X-Engine 团队撰写的论文 "X-Engine: An Optimized Storage Engine for Large-scale E-Commerce Transaction Processing",详细讲述了团…

idea 编辑区设置

文章目录1. 显示行号2. tabs位置3. tabs排序4.tabs数量5.1. 显示行号 2. tabs位置 3. tabs排序 鼠标按住上下拖拽 按字母排序 4.tabs数量 5.