zoukankan      html  css  js  c++  java
  • 【springcloud】hystrix面试题

    1 hystrix是什么?

    Netflix(国外最大的类似于,爱奇艺,优酷)视频网站,五六年前,也是,感觉自己的系统,整个网站,经常出故障,可用性不太高

    有时候一些vip会员不能支付,有时候看视频就卡顿,看不了视频。。。

    影响公司的收入!!!

    五六年前,netflix,api team,提升高可用性,开发了一个框架,类似于spring,mybatis,hibernate,等等这种框架

    高可用性的框架,hystrix

    hystrix,框架,提供了高可用相关的各种各样的功能,然后确保说在hystrix的保护下,整个系统可以长期处于高可用的状态

    最理想的状况下,软件的故障,就不应该说导致整个系统的崩溃,服务器硬件的一些故障,服务的冗余

    唯一有可能导致系统彻底崩溃,就是类似于之前,支付宝的那个事故,工人施工,挖断了电缆,导致几个机房都停电

    不可用,和产生一些故障或者bug的区别

    2 hystrix的提供的功能

    资源隔离、限流、熔断、降级、运维监控

    资源隔离

    让你的系统里,某一块东西,在故障的情况下,不会耗尽系统所有的资源,比如线程资源

    我实际的项目中的一个case,有一块东西,是要用多线程做一些事情,小伙伴做项目的时候,没有太留神,资源隔离,那块代码,在遇到一些故障的情况下,每个线程在跑的时候,因为那个bug,直接就死循环了,导致那块东西启动了大量的线程,每个线程都死循环

    最终导致我的系统资源耗尽,崩溃,不工作,不可用,废掉了

    资源隔离,那一块代码,最多最多就是用掉10个线程,不能再多了,就废掉了,限定好的一些资源

    限流

    高并发的流量涌入进来,比如说突然间一秒钟100万QPS,废掉了,10万QPS进入系统,其他90万QPS被拒绝了

    熔断

    系统后端的一些依赖,出了一些故障,比如说mysql挂掉了,每次请求都是报错的,熔断了,后续的请求过来直接不接收了,拒绝访问,10分钟之后再尝试去看看mysql恢复没有

    降级

    mysql挂了,系统发现了,自动降级,从内存里存的少量数据中,去提取一些数据出来

    运维监控

    监控+报警+优化,各种异常的情况,有问题就及时报警,优化一些系统的配置和参数,或者代码

    3 如何讲解这块内容?

    (1)如何将eshop-cache,核心的缓存服务改造成高可用的架构
    (2)hystrix中的一部分内容,单拉出来,做成一个免费的小课程,作为福利发放出去
    (3)eshop-cache,写代码,eshop-cache-ha,业务场景,跟之前衔接起来,重新去写代码
    (4)hystrix做服务高可用这一块的内容,讲解成只有一个业务背景,重新写代码,独立

    eshop-cache,在各级缓存数据都失效的情况下,会重新从源系统中调用接口,依赖源系统去查询mysql数据库去重新获取数据

    如果你的各种依赖的服务有了故障,那么很可能会导致你的系统不可用

    hystrix对系统进行各种高可用性的系统加固,来应对各种不可用的情况

    4 Hystrix 的设计原则

    • 对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护。
    • 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延。比如某一个服务故障了,导致其它服务也跟着故障。
    • 提供 fail-fast(快速失败)和快速恢复的支持。
    • 提供 fallback 优雅降级的支持。
    • 支持近实时的监控、报警以及运维操作。
    举个例子:
        有一个分布式系统,服务A依赖于服务B,服务B依赖于服务C/D/E。在这样一个成熟的系统内,比如说最多可能只有100个线程资源。正常情况下,40个线程并发调用服务C,各30个线程并发调用 D/E。 
        调用服务 C,只需要 20ms,现在因为服务C故障了,比如延迟,或者挂了,此时线程会吊住2s左右。40个线程全部被卡住,由于请求不断涌入,其它的线程也用来调用服务 C,同样也会被卡住。这样导致服务B的线程资源被耗尽,无法接收新的请求,甚至可能因为大量线程不断的运转,导致自己宕机。服务A也挂了。
         Hystrix可以对其进行资源隔离,比如限制服务B只有40个线程调用服务C。当此40个线程被hang住时,其它60个线程依然能正常调用工作。从而确保整个系统不会被拖垮。
     

    5 Hystrix 更加细节的设计原则

    • 阻止任何一个依赖服务耗尽所有的资源,比如 tomcat 中的所有线程资源。
    • 避免请求排队和积压,采用限流和 fail fast 来控制故障。
    • 提供 fallback 降级机制来应对故障。
    • 使用资源隔离技术,比如 bulkhead(舱壁隔离技术)、swimlane(泳道技术)、circuit breaker(断路技术)来限制任何一个依赖服务的故障的影响。
    • 通过近实时的统计/监控/报警功能,来提高故障发现的速度。
    • 通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度。
    • 保护依赖服务调用的所有故障情况,而不仅仅只是网络故障情况。

    参考:
            https://www.nowcoder.com/discuss/188033

      https://www.cnblogs.com/yzh-blog/p/11703037.html#1817129157

  • 相关阅读:
    JAVA中使用FTPClient上传下载
    js 计算题
    js 中的call apply
    js闭包、原型、继承、作用域
    jQuery中.bind() .live() .delegate() .on()的区别
    Javascript中String、Array常用方法介绍
    常用函数
    事件委托,阻止默认事件
    【探讨】javascript事件机制底层实现原理
    css 垂直水平居中
  • 原文地址:https://www.cnblogs.com/wjqhuaxia/p/11827448.html
Copyright © 2011-2022 走看看