首页 文章 精选 留言 我的

精选列表

搜索[双足行走],共9122篇文章
优秀的个人博客,低调大师

双 11 的狂欢,干了这碗「流量防控」汤

这是悟空的第67篇原创文章 作者 | 悟空聊架构 来源 |悟空聊架构(ID:PassJava666) 转载请联系授权(微信ID:PassJava) 临近双十一,从 2009 年第一届双十一开始,成交量只有 5000 万,到去年 2019 年,成交量达到了 2684 亿。今年迎来了第十二届双十一,想想都挺激动。 阿里人喜欢将双十一视为 Team Building(团队建设),广为流传的一句话:打仗是最好的团建,没有参加过双十一的叫同事,参加过双十一的叫战友。 上一篇我通过三国故事讲解了服务雪崩和熔断的机制,而且自己造了一个轮子:熔断器。而这一篇会讲解被一线大厂使用的两款流量防控组件:Sentinel 和 Hystrix,以及对它们的横向对比,以及该如何选型。 本篇主要内容如下: 本文已收录到我的Github:https://github.com/Jackson0714/PassJava-Learning 一、熔断&降级&限流&隔离 面对高并发的流量,我们通常会使用四种方式(熔断&降级&限流&隔离)来防止瞬时大流量对系统的冲击。而今天要介绍的这两款流量防卫兵,是专门用在这方面的。下面我先给同学扫个小盲。 什么是熔断 ? 熔断场景图@悟空聊架构 关键字:断路保护。比如 A 服务调用 B 服务,由于网络问题或 B 服务宕机了或 B 服务的处理时间长,导致请求的时间超长,如果在一定时间内多次出现这种情况,就可以直接将 B 断路了(A 不再请求B)。而调用 B 服务的请求直接返回降级数据,不必等待 B 服务的执行。因此 B 服务的问题,不会级联影响到 A 服务。 什么是降级 ? 降级场景图@悟空聊架构 关键字:返回降级数据。网站处于流量高峰期,服务器压力剧增,根据当前业务情况及流量,对一些服务和页面进行有策略的降级(停止服务,所有的调用直接返回降级数据)。以此缓解服务器资源的压力,保证核心业务的正常运行,保持了客户和大部分客户得到正确的响应。降级数据可以简单理解为快速返回了一个 false,前端页面告诉用户“服务器当前正忙,请稍后再试。” 什么是限流? 限流场景图@悟空聊架构 对请求的流量进行控制, 只放行部分请求,使服务能够承担不超过自己能力的流量压力。 熔断和降级的相同点? 熔断和限流都是为了保证集群大部分服务的 可用性和 可靠性。 防止核心服务崩溃。 给终端用户的感受就是某个功能不可用。 熔断和降级的不同点? 熔断是被调用方出现了故障, 主动触发的操作。 降级是基于全局考虑,停止某些正常服务,释放资源。 什么是隔离? 每个服务看作一个 独立运行的系统,即使某一个系统有问题,也不会影响其他服务。 二、Hystrix Hystrix 是什么 Hystrix:高可用性保障的一个框架。由 Netflix 出品(Netflix可以理解为国内的爱奇艺等视频网站)。 Hystrix 的历史 2011 年,其中的 API 团队为了提升系统的可用性和稳定性,发展出了 Hystrix 框架。 2012 年,Hystrix 区域比较成熟稳定。其他团队也开始使用 Hystrix。 2018 年 11 月,Hystrix在其 Github 主页宣布,不再开放新功能,推荐开发者使用其他仍然活跃的开源项目。但是 Hystrix 价值依旧很大,功能强大,国内很多一线互联网公司在使用。 Hystrix 设计理念 阻止服务的雪崩效应。 快速失败和快速恢复。 优雅降级。 使用资源隔离技术,如 bulkhead(舱壁隔离技术)、swimlane(泳道技术)、circuit breaker(断路技术)。 近实时的监控、报警及运维操作。 Hystrix 线程池隔离技术 使用线程池隔离,比如说有 3 个服务 A、B、C,每个服务的线程池分配 10,20,30个线程,当 A 服务线程池中的 10 个线程都拿出来使用后,如果调用服务 A 的请求量增加,还想再增加线程是不行的,因为 A 服务分配的线程已经用完了,不会拿其他的服务的线程,这样就不会影响其他服务了。Hystrix 默认使用线程池隔离模式。 线程池隔离技术 线程池隔离技术优点 依赖的服务都有隔离的线程池,即使自己的线程池满了,也不会影响任何其他其他的服务调用。 线程池的健康状态会上报,可以近实时修改依赖服务的调用配置。 线程池具有异步特性,可以构建一层异步调用层。 具有超时检测的机制,尤其在服务间调用特别有用。 线程池隔离技术缺点 线程池本身就会带来一些问题,比如 线程切换,线程管理,无疑增加了 CPU 的开销。 如果线程池中的线程利用率很低,则无疑是一种浪费。 Hystrix 信号量隔离技术 如下图所示:简单来说就是一个池子里面放着一定数量的信号量,服务 A 每次调用服务 B 之前,需要从池子里面申请信号量,申请到了,才能去调用 B 服务。 获取信号量 线程池隔离和信号量的场景对比 线程池隔离技术 ,适合大部分场景,但需要设置服务的超时时间。 信号量隔离技术 ,适合内部比较复杂的业务,不涉及网络请求问题。 三、Sentinel 3.1、Sentinel 是什么 Sentinel:面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 3.2、Sentinel 的历史 2012 年,Sentinel 诞生,主要功能为入口流量控制。 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。 2018 年,Sentinel 开源,并持续演进。 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。 3.3、Sentinel 的特征 丰富的应用场景。 支撑阿里的双十一核心场景,如秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用。 完备的实时监控。 可以看到接入应用的单台机器秒级数据,以及集群的汇总情况。 广泛的开源生态。 Spring Cloud、Dubbo、gRPC 都可以接入 Sentinel。 完善的 SPI 扩展点。 实现扩展接口来快速定制逻辑。 用一张图来总结: Sentilel 的主要特性 3.4、Sentinel 的组成 核心库(Java 客户端)不依赖任何框架/库,能在所有的 Java 运行时环境运行,且对 Spring Cloud、Dubbo 等框架有较好的支持。 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。 3.5、Sentinel 的资源 Sentinel 中的资源是核心概念,可以是 Java 应用程序中的任何内容,可以是提供的服务,甚至是一段代码。 可以通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel保护起来。可以如下几种方式来标识资源: 方法签名。 URL。 服务名称等。 3.6、Sentinel 的设计理念 Sentinel 作为一个流量控制器,可以根据需要把随机的请求调整成合适的形状,如下图所示: 流量整形 四、对比 4.1、隔离设计上对比 Hystrix Hystrix 提供两种隔离策略,线程池隔离和信号量隔离。 Hystrix 中最推荐的也是最常用的是线程池隔离。线程池隔离的好处是隔离度很高,不会影响其他资源,但是线程本身也有自己的问题,线程上下文切换时比较耗 CPU 资源的,如果对低延时要求比较高,影响还是挺大的,而且创建线程是需要分配内存的,创建的线程越多,需要分配的内存也会更多。而且如果对每个资源都创建一个线程池,那线程切换会带来更大的损耗。 而 Hystrix 的信号量隔离,可以对某个资源调用的并发数进行限制,轻量级的,不用显式创建线程池,但缺点是不能对慢调用进行自动降级,只能等客户端那边超时,还是有可能出现级联阻塞的情形。 Sentinel Sentinel 可以通过并发线程数模式的流量控制来提供信号量隔离的功能,而且它还具备响应时间的熔断降级模式,防止过多的慢调用占满并发数而影响整个系统。 4.2、熔断降级的对比 Sentinel 和 Hystrix 都是基于熔断器模式。都支持基于异常比率来进行熔断,但 Sentinel 更强大,可以基于响应时间、异常比率和异常数来进行熔断降级。 4.3、实时统计的对比 Sentinel 和 Hystrix 都是基于滑动窗口进行实时统计,但 Hystrix 是基于 RxJava 的事件驱动模型,在服务调用成功/失败/超时的时候发布响应的事件,通过一系列的变换和聚合最终得到实时的指标统计数据流,可以被熔断器或 Dashboard 消费。而 Sentinel 是基于 LeapArray 的滑动窗口。 五、Sentinel 的突出特性 除了上面提到的 三大对比外,Sentinel 还有一些 Hystrix 不具备的功能。 5.1、流量控制 流量控制: 其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 Sentinel 可以基于QPS/并发数进行流量控制,也可以基于调用关系进行流量控制。 基于 QPS 进行流量控制有以下几种方式: 直接拒绝: 当QPS 超过一定阈值时,直接拒绝。适用于对系统处理能力确切已知的情况。 慢启动预热: 当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。 慢启动预热模式原理图 匀速排队: 请求以均匀的速度通过,对应的是漏桶算法。 匀速排队模式原理图 基于调用关系的流量控制: 根据调用方限流。 根据调用链路入口限流:链路限流。 根据具有关系的资源流量限流:关联流量限流。 5.2、系统自适应限流 Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,借助 TCP BBR 思想,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。 自适应限流原理图 我们把系统处理请求的过程想象为一个水管,到来的请求是往这个水管灌水,当系统处理顺畅的时候,请求不需要排队,直接从水管中穿过,这个请求的RT是最短的;反之,当请求堆积的时候,那么处理请求的时间则会变为:排队时间 + 最短处理时间。 推论一: 如果我们能够保证水管里的水量,能够让水顺畅的流动,则不会增加排队的请求;也就是说,这个时候的系统负载不会进一步恶化。 推论二:当保持入口的流量是水管出来的流量的最大的值的时候,可以最大利用水管的处理能力。 5.3、 实时监控和控制面板 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。 Sentinel 控制台 5.4、 发展及生态 Sentinel 针对 Spring Cloud、Dubbo、gRPC 都进行了适配,引入依赖和简单的配置即可快速接入 Sentinel,相信 Sentinel 将是未来流量防控的一大利器。我比较看好 Sentinel。 5.5、 Sentinel 和 Hystrix 对比总结 Hystix 和 Sentinel 对比总结 写在最后 有读者问我秒杀系统该怎么设计,在之前的文章中,我已经揭秘了秒杀系统的架构设计,下面我还是总结下秒杀系统关注的八大点: 服务单一职责、独立部署 库存预热、快速扣减 秒杀链接加密 动静分离 恶意请求拦截 流量错峰 限流&熔断&降级 队列削峰 我是悟空,努力变强成为超级赛亚人。 我们下期见! - END - 点亮,服务器三年不宕机 本文分享自微信公众号 - 悟空聊架构(PassJava666)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Python实现双端队列数据结构及其基本方法

队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头,队列中没有元素时,称为空队列。 队列可由线性表来实现,包括列表和链表都可实现队列,不过在安全性上来说链表比较安全,但是增加额外的内存开销,一般考虑列表来实现队列。 查看Python队列库queue提供的队列源码如下: classQueue: '''Createaqueueobjectwithagivenmaximumsize. Ifmaxsizeis<=0,thequeuesizeisinfinite. ''' def__init__(self,maxsize=0)

优秀的个人博客,低调大师

Chrome与vim双神器融合, vimium完全攻略

vimium是chrome浏览器的一款插件, 可以用键盘代替鼠标的操作, 提高我们的浏览速度和上网体验! 学vimium的理由? vimium能提升我们的浏览速度, 鼠标比键盘简单, 键盘比鼠标快! vim的封号为"编辑器之神", 学会了vimium也就掌握vim的核心用法, 一举两得! vimium的用法真的很酷, 如果喜欢表演的话, 这是一个很好的工具! vimium下载地址 因为vimium的汉化做的不好,所以在国内这个插件并不流行,这对于喜欢表演的小伙伴来讲, 反而是件好事! 我看了网上已有的vimium的文章, 大多在讲vimium的快捷键, 但其实, 远用不到那么多... 我们换一种思路, 只用GIF动图展示vimium的一些功能,然后附上对应的快捷键, 如果你感觉很合胃口, 再决定是否学习vimium 敲击三个字符, 打开任何链接 f + 页面浮动字符 在新标签打开F+页面浮动字符 ,切到左标签J & 切到右标签K 快速向下滚动d & 快速向上滚动u, 滚动到页面顶部gg & 滚动到页面底部G 神技! 快速搜索 (相当于浏览器顶部搜索框), 并在新标签打开 O 快速搜索的好用之处在于, 可以定义无限的数量的搜索引擎(下面贡献出我常用的配置 维基, 谷歌, 百度, 必应, 知乎) w: https://www.wikipedia.org/w/index.php?title=Special:Search&search=%s Wikipedia gg: https://www.google.com/search?q=%s Google bd: https://www.baidu.com/s?wd=%s Baidu b: https://www.bing.com/search?q=%s Bing zh: https://www.zhihu.com/search?type=content&q=%s Zhihu 在当前标签前进H & 后退 L 关闭页面x & 恢复页面X 主动脱离焦点esc 进阶玩法 shift+/,查看所有快捷键 去Github开源地址尝试vimium最新的功能 写在最后: vimium也并非没有缺点, 一些网站需要点击, 拖拽, 才能通过的验证页面, 就只能依赖鼠标来完成了, 但如果你够极客的话, 这都不是问题, 据我所知, 一些python爬虫为了过这些验证程序, 有很多好用的python脚本, 甚至有打码平台专门出售突破验证的服务 哈哈,还是不要走极端, 毕竟正常情况下, 我们遇到验证页面的机会几乎是个位数, 希望读完这篇文章的小伙伴, 能通过vimium让Chrome的浏览速度快到飞起...

优秀的个人博客,低调大师

天猫“双11”成交额实时统计技术详解

阿里巴巴资深技术专家莫问在2017年12月20日云栖大会北京峰会上做了题为“Apache Flink技术进阶”的主题演讲。Apache Flink作为流式计算引擎,支持了“双十一对的”实时计算,已经被国内外的公司使用。其中关于“Flink的技术特点”、“阿里巴巴的Flink版本——Blink”以及“Blink在实际场景中的应用” 等经验首次对外详细剖析,很有价值。以下为视频内容整理: Apache Flink介绍Flink是Storm之后出现的第二个纯流式计算引擎,其特点是支持毫秒级的延迟,同时支持 “至少一次”语义的保证。目前在阿里巴巴的“双十一”上面支持了每秒四亿次的计算。 Flink提供了不同的抽象级别来开发流/批处理应用程序: 最下面一层是有状态的分布式流式执行引擎。 第二层是core APIs,包括DataStream/Data

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册