第6页

  • Docker员工自述:我们为什么“输”给了Kubernetes?

    Docker员工自述:我们为什么“输”给了Kubernetes?

    编译|核子可乐、燕珊Docker 如今的体量与当初的潜在愿景相比实在太过渺小,本文将带你了解 Docker“落得如此田地”的原因和真相的细节。Docker 还活着。尽管它近两三年的境况并不理想,但它还在苦苦挣扎,试图找到自己的商业价值。就在上周,Docker 宣布更改 Docker 软件的许可条款。在不久的...

    Java知识 2021-09-27 54 0

  • 引言

    一个超级疲惫的下午,离下班还有30分钟,小航拿了一袋坚果,对我说:”温哥,来来来,吃个坚果,开心下”

    有了前几次的,经验,我意识到,这兄弟又要问题问题,委婉的回绝到:”谢谢好意,你吃吧,我不饿”。

    小航,一看我有所防备,有拿出了安慕希,并且抓住了我的手臂,说道:“大神,我有困惑,请您帮帮我”

    看他如此诚恳,我不好意思的说道:“大神不敢当,水平有限,恐无法为你解惑”。

    小航一看有戏,有给了我一袋坚果,眼中有光的说道:“哥,您指点一二,无论对错,我都愿意听”

    我感动(dong xi hao chi)的说:“什么问题,我试试看”

    小航立刻说道:“使用缓存都有什么问题”

    我缓缓道来:“主要四个问题,击穿,穿透,雪崩,污染”。

    推荐下自己做的 Spring Boot 的实战项目:

    https://github.com/YunaiV/ruoyi-vue-pro

    问题描述

    卧槽!缓存的问题太多了。。

    卧槽!缓存的问题太多了。。

    来源:my.oschina.net/floor/blog/4964676引言一个超级疲惫的下午,离下班还有30分钟,小航拿了一袋坚果,对我说:”温哥,来来来,吃个坚果,开心下”有了前几次的,经验,我意识到,这兄弟又要问题问题,委婉的回绝到:”谢谢好意,你吃吧,我不饿”。小航,一看我有所防备,有拿出了安慕希,...

    Java知识 2021-09-27 48 0
  • 避免35岁现象,我给技术人的建议永远是架构师!

  • 太尴尬了,双一流硕士面试大厂,一轮被刷

    太尴尬了,双一流硕士面试大厂,一轮被刷

    短视频开发火了!!!随着抖音、快手等一系列短视频APP的火热,一定情况下带动了短视频源码开发业务。而短视频生态与内容爆发对技术提出了更高的挑战。...

    Java知识 2021-09-26 48 0
  • 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!

    面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!

    来源:cnblogs.com/peiyu1988/p/9202224.html 前言 2017年初,我通过一整天的笔试及面试加入一家(某一线城市国资委全资控股)某集团的研究机构(中央研究院),任职高级软件工程师;在这边工作了整整一年,目前已经跳槽到一家互联网公司,在回头看看这一整年,感受颇深,只好一吐为快,...

    Java知识 2021-09-26 47 0

  • 尽管微服务 中的“微”一词表示服务的规模,但它并不是使用微服务的唯一标准。当团队转向基于微服务的架构 时,他们旨在提高敏捷性以及自主且频繁地部署功能。很难确定这种架构风格的简单定义。我喜欢Adrian Cockcroft的关于微服务的简短定义:“ 面向服务的体系结构,它由松散耦合的、具有上下文边界的元素组成。”

    尽管这定义了高级设计启发式技术,但微服务架构具有一些独特的特性,使其有别于以往的面向服务的架构。以下是其中一些特征。这些以及其他一些文档都有据可查-Martin Fowler的文章和Sam Newman的Building Microservices,仅举几例。

    简而言之,我们可以将这种体系结构样式总结如下:

    松耦合的面向服务的体系结构,其中每个服务都包含在定义明确的有界上下文 中,从而可以快速,频繁且可靠地交付应用程序。

    领域驱动设计和有界上下文

    微服务的力量来自明确定义其职责并划分它们之间的边界。此处的目的是在边界内建立高凝聚力,并在边界外建立低耦合(banq注:高凝聚低耦合)。也就是说,趋于一起改变的事物应该属于同一事物。就像在许多现实生活中的问题一样,这说起来容易做起来难,业务在不断发展,逻辑的假设前提也会随之改变。因此,重构的能力是设计系统时要考虑的另一关键问题。

    领域驱动设计(DDD)是关键,在我们看来,这是设计微服务时必不可少的工具,无论是打破整体还是实施未开发项目。领域驱动的设计(Eric Evans在他的书中提出)是一组思想、原理和模式,可帮助基于业务领域的基础模型设计软件系统。开发人员和领域专家共同合作,以通用的通用语言创建业务模型。然后,他们将这些模型绑定到有意义的系统,并在这些系统与从事这些服务的团队之间建立协作协议。更重要的是,他们设计了系统之间的概念轮廓或边界。

    微服务设计从这些概念中汲取了灵感,因为所有这些原理都有助于构建可以相互独立变化和发展的模块化系统。

    在继续进行之前,让我们快速了解一下DDD 的一些基本术语。域驱动设计的完整概述超出了本博客的范围。我们强烈建议任何尝试构建微服务的人推荐Eric Evans的书籍。

    领域:代表组织的工作。例如它是零售或电子商务。

    子域:组织或组织内的业务部门。域由多个子域组成。

    无所不在的语言:这是用于表达模型的语言。在下面的示例中,Item是一个模型,属于这些子域中每个子域的通用语言。开发人员,产品经理,领域专家和业务涉众都同意使用相同的语言,并在其工件(代码,产品文档等)中使用该语言。

    有界上下文:域驱动的设计将有界上下文定义为“单词或语句能确定其含义的设置”。简而言之,这意味着模型是有意义的边界。在上面的示例中,“项目”在每种上下文中的含义不同。在目录上下文中,项目表示可售产品,而在购物车上下文中,则表示客户已将其添加到购物车中的项目。在“运输”上下文中,它表示将要运送给客户的仓库物料。这些模型中的每一个都是不同的,并且每个都有不同的含义,并且可能包含不同的属性。通过将这些模型分离并隔离在它们各自的边界内,我们可以自由地表达模型而没有歧义。

    注意:必须了解子域和有界上下文之间的区别。子域属于问题空间,即您的企业如何看待问题,而受限上下文属于解决方案空间,即我们将如何实施问题的解决方案。从理论上讲,每个子域可能具有多个有界上下文,尽管我们努力为每个子域提供一个有界上下文。

    推荐下自己做的 Spring Boot 的实战项目:

    https://github.com/YunaiV/ruoyi-vue-pro

    微服务与有限上下文如何相关

    现在,微服务在哪里适合?可以说每个有界上下文都映射到微服务吗?是的,我们将明白为什么。在某些情况下,有界上下文的边界或轮廓可能很大。

    如何构建基于 DDD 领域驱动的微服务?

    如何构建基于 DDD 领域驱动的微服务?

    来源:jdon.com/54558尽管微服务 中的“微”一词表示服务的规模,但它并不是使用微服务的唯一标准。当团队转向基于微服务的架构 时,他们旨在提高敏捷性以及自主且频繁地部署功能。很难确定这种架构风格的简单定义。我喜欢Adrian Cockcroft的关于微服务的简短定义:“ 面向服务的体系结构,它由松...

    Java知识 2021-09-26 45 0
  • 因为学历进不了大厂的程序员,还有机会吗?
  • Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?

    Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?

    来源:blog.csdn.net/lizeyang/article/details/40040817你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况「先说第2种情况」null 就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于 api 方法。例如你开发了一个接口...

    Java知识 2021-09-25 45 0

  • 什么是服务降级

    如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢?

    简单来说就是,将一些不太重要的景区项目砍掉,平时就那么三五八个人,景区可以开放湖中游泳啦,摸鱼啦,捉虾啦,有情况工作人员可以下湖捞你,但是现在客流量大了,工作人员关注不过来,都在湖里晃荡万一沉了不太安全,大手一挥,这个项目砍了,将工作人员分配在其他地方。

    在互联网中也有类似的降级措施,像之前双11, 有段时间是只允许下单不允许退单或者改单,这样做目的是什么呢?

    还是为了保证服务的可用性,当硬件软件优化到一定的程度还是有上限,这时候将资源重点倾斜给核心业务,那些不太重要的就砍掉,保证服务的可用性。

    推荐下自己做的 Spring Boot 的实战项目:

    https://github.com/YunaiV/ruoyi-vue-pro

    服务等级定义

    服务等级定义 SLA(Service Level Agreement)是判定压测是否异常的重要依据。压测过程中,通过监控核心服务状态的 SLA 指标数据,可以更直观地了解压测业务的状态。

    SLA则是服务商与您达成的正常运行时间保证。

    关于这个的详细解释,可以参考阿里云的介绍:服务等级定义SLA(https://help.aliyun.com/document_detail/111729.html),这儿不过多描述,SLA 分为网络服务和云服务,提供商的在线保证率通常要求达到6个9。

    6个9含义

    6个9指99.9999%,也就是一个服务有99.9999%概率是安全的,6个9有多安全呢?

    2个9 = (1-99%)X24 X 365 = 87.6 小时 = 3.65天

    3个9 = (1-99.9%)X24 X 365 = 8.76 小时

    4个9 = (1-99.99%)X24 X 365 = 0.876 小时 = 52.56分钟

    5个9 = (1-99.999%)X24 X 365 = 0.0876 小时 = 5.256分钟

    6个9 = (1-99.9999%)X24 X 365 = 0.00876 小时 = 0.5256分钟 = 31秒

    也就是,一年当中,6个9的安全性最多会有31s服务是不可用,相对来说是极高的。

    推荐下自己做的 Spring Cloud 的实战项目:

    https://github.com/YunaiV/onemall

    降级处理

    兜底数据

    这方面有很多例子,比如某些页面挂了会返回寻亲子网。可以对一些关键数据设置一些兜底数据,例如设置默认值、静态值、设置缓存等。

    默认值 : 设置安全的默认值,不会引起数据问题的值,比如库存为0

    静态值 :请求的页面或api无法返回数据,提供一套静态数据展示,比如加载失败提示重试,或者寻亲子网,或者跳到默认菜单,给用户一个稍微好一点的体验。

    缓存 : 缓存无法更新便使用旧的缓存

    限流降级

    限流顾名思义,提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源,也就是当流量洪峰到达的时候,可能需要丢弃一部分用户来保证服务可用性,对于丢弃的用户可以提供友好的提示,比如提示用户当前繁忙、稍后重试等。

    限流需要结合压测等,了解系统的最高水位,也是在实际开发中应用最多的一种稳定性保障手段。当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

    超时降级

    对调用的数据设置超时时间,当调用失败时,对服务降级,举个例子,当访问数据已经超时了,且这个业务不是核心业务,可以在超时之后进行降级,比如商品详情页上有推荐内容或者评价,但是可以降级显示评价暂时不显示,这对主要的用户功能——购物,不产生影响,如果是远程调用,则可以商量一个双方都可以接受的最大响应时间,超时则自动降级。

    故障降级

    如果远程调用的服务器挂了(网络故障、DNS故障、HTTP服务返回错误),则可以进行降级, 例如返回默认值或者兜底数据或者静态页面,也可以返回之前的缓存数据。

    重试/自动处理

    客户端高可用:提供多个可调用的服务地址,这样做

    微服务重试:dubbo重试机制

    API调用重试:当达到重试次数后,增加访问标记,服务降级,异步探测服务是否恢复。

    WEB端:在服务不可用时,web端增加重试按钮或自动重试可以提供更友好的体验。

    自动重试需设置重试次数和数据幂等处理

    降级开关

    在服务器提供支持期间, 如果监控到线上一些服务存在问题,这个时候需要暂时将这些服务去掉,有时候通过服务调用一些服务,但是服务依赖的数据库可能存在,网卡被打满了,数据库挂了,很多慢查询等等,此时要做的就是暂停相关的系统服务,也就是人工使用开关降级。开关可以放在某地,定期同步开关数据,通过判断开关值来决定是否做出降级。

    开关降级还有一个作用,例如新的服务版本刚开发处在灰度测试阶段,不太确定里面的逻辑等等是否正确,如果有问题应该可以根据开关的值切回旧的版本。

    在服务调用方设置一个flag,标记服务是否可用,另外key可以存储存储在在本地,也可以存储在第三方的配置文件中,例如数据库、redis、zookeeper中。

    爬虫和机器人

    分析机器人行为:短时间连续操作,agent,行为轨迹、拖拽(模拟登陆/秒杀/灌水)

    爬虫:引到到静态页或缓存页

    读降级

    简而言之,在一个请求内,多级缓存架构下,后端缓存或db不可用,可以使用前端缓存或兜底数据让用户体验好一点。

    对于读服务降级一般采用的策略有:暂时切换读 : 降级到读缓存、降级到走静态化暂时屏蔽读 : 屏蔽读入口、屏蔽某个读服务

    通常读的流程为: 接入层缓存→应用层本地缓存→分布式缓存→RPC服务/DB

    我们会在接入层、应用层设置开关,当分布式缓存、RPC服务/DB有问题时自动降级为不调用。当然这种情况适用于对读一致性要求不高的场景。

    页面降级、页面片段降级、页面异步请求降级都是读服务降级,目的是丢卒保帅,保护核心线程,或者因数据问题暂时屏蔽。

    还有一种是页面静态化场景。动态化降级为静态化 :比如,平时网站可以走动态化渲染商品详情页,但是,到了大促来临之际可以将其切换为静态化来减少对核心资源的占用,而且可以提升性能。其他还有如列表页、首页、频道页都可以这么处理。可以通过一个程序定期推送静态页到缓存或者生成到磁盘,出问题时直接切过去。静态化降级为动态化 :比如,当使用静态化来实现商品详情页架构时,平时使用静态化来提供服务,但是,因为特殊原因静态化页面有问题了,需要暂时切换回动态化来保证服务正确性。以上都保证了出问题时有预案,用户可以继续使用网站,不影响用户购物体验。

    写降级

    大家都知道硬盘性能比不上内存性能,如果访问量很高的话,数据库频繁读写可能撑不住,那么怎么办呢,可以让内存(假如是Redis)库来暂时满足写任务,同时将执行的指令记录下来,然后将这个信息发送到数据库,也就是不在追求内存与数据库数据的强一致性,只要数据库数据与Redis数据库中的信息满足最终话一致性即可。

    也就是说,正常情况下可以同步扣减库存,在性能扛不住时,降级为异步。另外,如果是秒杀场景可以直接降级为异步,从而保护系统。还有,如下单操作可以在大促时暂时降级,将下单数据写入Redis,然后等峰值过去了再同步回DB,当然也有更好的解决方案,但是更复杂,不是本篇的重点。

    还有如用户评价,如果评价量太大,那么也可以把评价从同步写降级为异步写。当然也可以对评价按钮进行按比例开放(比如,一些人看不到评价操作按钮)。比如,评价成功后会发一些奖励,在必要的时候降级同步到异步。

    总结在cap原理和BASE理论中写操作存在于数据一致性 这个环节,降级的目的是为了提供高可用性,在多数的互联网架构中,可用性是大于数据一致性的。所以丧失写入数据同步,通过上面的理论,我们也能勉强接受数据最终一致性。高并发场景下,写入操作无法及时到达或抗压,可以异步消费数据/cache更新/log等方式

    前端降级

    当系统出现问题的时候,尽量将请求隔离在离用户最近的位置,避免无效链路访问, 在后端服务部分或完全不可用的时候,可以使用本地缓存或兜底数据,在一些特殊场景下,对数据一致性要求不高的时候,比如秒杀、抽奖等可以做假数据。

    JS降级

    在js中埋降级开关,在访问不到达,系统阈值的时候可以避免发送请求

    主要控制页面功能的降级,在页面中,通过JS脚本部署功能降级开关,在适当时机开启/关闭开关。

    接入层降级

    可以在接入层,在用户请求还没到达服务的时候,通过、Nginx + Lua、Haproxy + lua过滤无效请求达到服务降级的目的, 主要控制请求入口的降级,请求进入后,会首先进入接入层,在接入层可以配置功能降级开关,可以根据实际情况进行自动/人工降级。这个可以参考第17章,尤其在后端应用服务出问题时,通过接入层降级从而给应用服务有足够的时间恢复服务。

    应用层降级

    主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/人工降级。

    SpringCloud中可以通过Hystrix配置中心可以进行人工降级,也可以根据服务的超时时间进行自动降级, Hystrix是Netflix开源的一款针对分布式系统的延迟和容错库,目的是用来隔离分布式服务故障。它提供线程和信号量隔离,以减少不同服务之间资源竞争带来的相互影响;官网讲Hystrix提供优雅降级机制;提供熔断机制使得服务可以快速失败,而不是一直阻塞等待服务响应,并能从中快速恢复。Hystrix通过这些机制来阻止级联失败并保证系统弹性、可用。下图是一个典型的分布式服务实现。

    亿级流量架构之服务降级思路与方法

    亿级流量架构之服务降级思路与方法

    来源:www.cnblogs.com/Courage129/p/14427020.html什么是服务降级如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢?简单来说就是,...

    Java知识 2021-09-25 41 0
  • 再见了 SELECT *!大厂的 MySQL 查询优化方案,确实牛逼!

    前几天分享数据库的内容,后台粉丝留言,说某大厂面试挂在了 MySQL 上,由于内容骂骂咧咧,我就不放出来了。 大体面试题如下:为帮助更多开发工程师、架构师掌握 MySQL 核心,玄姐联手快狗打车CTO沈剑、前58集团高级架构师陈东,结合10多年一线大厂实践经验,打磨了一套《MySQL实战34讲》在...

    Java知识 2021-09-24 61 0
识海教程

识海教程

每天学习技术知识,每天进步多一点点。

  • 228975阅读数
  • 4评论数

关于识海

网站将会逐步收集越来越多的技术文章,当然将来也会开启投稿功能,各位朋友们有好的文章可以分享给大家