设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 服务器 > 安全 > 正文

链家网技术总监陈尔冬:链家网的第三种运维(3)

发布时间:2021-01-12 10:48 所属栏目:53 来源:网络整理
导读:我觉得这里面有两个问题: 第一个问题,如果你的超时时间设计得很短,首先这个延迟增大总是可能出现的,不可能认为自己的服务或者网络永远那么正常,异常可能会突然出现.这个我们先放在我的假定范围之内,一定会有可能出

我觉得这里面有两个问题:

  • 第一个问题,如果你的超时时间设计得很短,首先这个延迟增大总是可能出现的,不可能认为自己的服务或者网络永远那么正常,异常可能会突然出现.这个我们先放在我的假定范围之内,一定会有可能出现异常.
  • 另一个问题,出现异常的时候,如果你的超时时间设计的特别长,调用方就会被堵死.如果你的超时时间设计得特别短,后面就会把服务方压死.那怎么办?

4.3 解决问题的思路

在这个点我们团队从系统层面角度给了一个方案,我们现在的方式是这样:当我慢了之后,M 个服务器,N 个进程,你就是 M+N 全部调到服务方了.我有 M 台机器,有 N 个进程,最后还是M个服务器去调这个服务,我肯定还是有调用,可以让它去尝试,如果慢就不要再调了.

我们给的方案是这样,针对问题一,如果说我调用超时时间设得比较慢,在系统层检测到后端的延迟,在慢的时候快速失败,防止堵塞.

针对问题二,超时时间设得比较短,后面会被压死,实际上是给了后面资源一个负向的正反馈.我们把这个反馈隔离,不要让这个调用到后面去,后面是不是就不会压死了.

那么解决方案就出来了:我们把这个系统叫做 RASH.我们把 Rash 运行在每一个应用服务器上.

4.4 RASH分析

首先我们先写了一个动态链接库,把这个动态连接库配到了 LD_PRELOAD.这么做的目的是为了劫持所有调用.所有的网络调用会被劫持到 Socks4 代理上.

Socks4 使用协程模型,每个协程处理一个连接.它会监测后面资源端给我们响应的第一个应用包,第一个应用协议的响应包的延时是多大,如果很慢,我们就快速的反馈失败,如果很快就让它正常运作.

很快或者很慢,现在说起来很简单,到底怎么做呢?这里有个算法来处理这个问题.

我们先做一些假设,设最大超时时间是 M,初始连接时间是 0,以后一旦有过连接就有统计了,这个连接用时设为Tt,本次连接的用时就是 Tc,现在队列中已经有进程数为 N.有了 M,N,Tt,Tc,当来了一个新的连接,入不入队列呢?

需要判断 Tt*N 是否小于等于 M.如果小于等于 M,那么就入队列,如果大于,直接结束,返回一个错误.如果连接完成了,比如入队列了,有一个连接完成了,我们会对这个连接记一个应用返回的响应时间 Tc,将 (Tt+Tc)/2 作为新的 Tt 值.

这样就给他上一次连接做了一次反馈,如果上一个连接很快,它的历史连接时间就会越来越短,如果上一个连接很慢,它的历史连接时间就会越来越长.

算法讲起来比较抽象,给大家用实例解释一下.首先设置连接总队列的时长,比如说 1 秒.随后处理了一个连接,如果这个连接首包是 500 毫秒,这个队列里面我就可以让他进两个连接.

如果下一个连接完成了,用的是 100 毫秒,下次我就可以让他进三个.如果变长了,变成 1 秒甚至超过 1 秒了,那么未来只会让队列保持一个连接,一个以上的连接通通反馈失败.

这样的一个基础设施就实现了刚才讲的功能,如果被调用方出现延迟,就给超出延迟的连接快速的反馈失败.如果他还重试,我们就把这个重试的反馈中断,不让它调用到被调用方.

5、另类的命名服务

5.1 命名服务初探

命名服务不是一个新的概念,现在各位的公司大概都有自己的命名服务.实际上在有互联网的时候就有命名服务.命名服务就有点像我小时候的黄页.

小时候去我父母的公司玩,那时候电话数量很少,可能也就每一个国企有一部电话,每一个机关单位有一个电话.这时候每个单位都会在电话旁放一本黄页,这个黄页里能查到所有的机关单位的电话.基本上查一下,交通局是什么电话,就可以打电话打过去,我觉得很像我们的命名服务.

说到命名服务有很多方案,肯定有一种方案大家耳熟能详,那就是 etcd.我们也用,但不仅仅用 etcd,还用了 kubernetes 项目中用到的 SkyDNS.

我加入到这些团队的时候,不管是新浪、华为还是链家,我来的时候基础设施已经在用了.可能在已经有基础设施里面有很多环节没有命名服务,大家是直接 IP 端口连的.

这时候我给他们建议,我建议大家用命名服务,开发工程师说你建议很好,我们会考虑,但是我现在开发的周期很紧张,我的工期很短,我的工作压力很大,能不能你帮我做.

这个时候我就愁了,因为我是系统团队,不能改应用代码嘛.如果用 etcd 做命名服务的话,需要应用程序主动去联命名服务获取后端拓扑,再去连真正的服务器,这可能要涉及代码改动.所以我想这么个辙,DNS 协议的命名服务.

5.2 基于DNS的命名服务

我在新浪也做过,但是这个基础设施跟在新浪的时候已经不一样了.DNS 命名服务有什么优势呢?

如果你的代码不想改,比如你连一个ip地址,你只需要把 IP 地址改成域名就可以了,域名就是我们互联网最早也是最基础的命名服务.

域名作为命名服务的接口有一个问题,我们知道域名是有缓存的,缓存时间称作 TTL.比如我设 30 秒,是为了不让权威域名服务器过载,不能每一个域名都调用权威域名服务器,那权威域名服务器还不被压垮了?

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读