虎牙直播在微服务改造方面的实践和总结

相比文字和图片,直播提供了人与人之间更丰富的沟通形式,其对平台稳定性的考验很大,那么倡导“以技术驱动娱乐”的虎牙直播(以下简称“虎牙”)是如何在技术上赋能娱乐,本文将为您介绍虎牙在DNS、服务注册、CMDB和服务配置中心等方面的实践。

文章整理自虎牙基础保障部中间件团队负责人张波(社区ID:zhangjimmy)在Dubbo Meetup 广州站沙龙上的分享,阿里巴巴中间件授权发布,分享议题如下:

为什么选用Nacos

DNS-F的技术价值和应用场景

服务注册的实践

CMDB的应用和实践

服务配置的实践

为什么选用 Nacos

虎牙关注 Nacos 是从v0.2 开始的(最新版本:Pre-GA v0.8),我们也参与了社区的建设,可以说是比较早期的企业用户。

Nacos 是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供「注册中心」、「配置中心」和「动态DNS服务」三大功能。

首先,在虎牙的微服务场景中,起初有多个注册中心,每一个注册中心服务于某一部分微服务,缺少一个能融合多个注册中心,并把他们逐一打通,然后实现一个能管理整个微服务体系的大的注册中心。

以下内容摘自我们考虑引入Nacos时,在服务注册中心方案上的选型对比:

Nacos提供 DNS-F功能, 可以与K8S、Spring Cloud和Dubbo等多个开源产品进行集成,实现服务的注册功能。

其次,在服务配置中心方案的选型过程中,我们希望配置中心和注册中心能够打通,这样可以省去我们在微服务治理方面的一些投入。因此,我们也同步比较了一些服务配置中心的开源方案:

例如Spring Cloud Config Server、Zookeeper和ETCD,总体评估下来,基于我们微服务体系现状以及业务场景,我们决定使用Nacos作为我们的服务注册和服务发现的方案。使用过程中,我们发现,随着社区版本的不断更新和虎牙的深入实践,Nacos的优势远比我们调研过程中发现的更多,接下来,我将围绕DNS-F、Nacos-Sync、 CMDB和负载均衡4方面来分享虎牙的实践。

DNS - F 的技术价值

Nacos 提供的DNS-F功能的第一个技术价值在于,弥补了我们内部微服务没有一个全局动态调度能力的空白。刚才提到,虎牙有多个微服务体系,但并没有一个微服务具备全局动态调度的能力,因为它们各自都是独立的。目前,我们通过Nacos已经融合了四个微服务体系的注册中心,最终目标是把所有的微服务都融合在一起,实现全局动态调动的能力。

第二,DNS-F解决了服务端端到端面临的挑战,即延时大、解析不准、故障牵引慢的问题。

如何去理解呢?

当内部有多个微服务体系的时候,每一个体系的成熟度是不同的。例如,有一些微服务框架对同机房或CMDB路由是不支持的,当一个服务注册到了多个IDC中心,去调用它的服务的时候,即便是同机房,也可能调用到一个不是同机房的节点。这样就会无端的造成服务的延时和解析不准。

即使我们基于DNS做一些解析的优化,但仍然无法完全解决服务的延时和解析不准。这是因为DNS都是IP策略的就近解析,无法根据服务的物理状态、物理信息进行路由。此外,当一个核心服务出现问题,如果缺少一个融合了多个调用方和被调用方的信息的统一的注册中心,就很难去准确判断如何去牵引,从而导致故障牵引慢。有了Nacos后,就可以接入一个统一的注册中心以及配置中心,去解决这些问题。(目前,虎牙还在微服务体系的改造过程中,未完全实现统一的注册中心)

第三,提供专线流量牵引能力。虎牙的核心机房的流量互通,是使用专线来实现的。专线的特性就是物理建设的,而且我们的专线建设可能不像BAT那么大,例如我们专线容量的冗余只有50%,假设某个直播异常火爆,突发流量高于平常的两百倍,超过了专线的建设能力,这时候一个服务就有可能会导致全网故障。但是,通过全局的注册中心和调动能力,我们就可以把流量牵引到其他地方,例如迁移到公网,甚至牵引到一个不存在的地址,来平衡一下。即便某个服务出现问题,也不会影响我们的全局服务。

第四,支持服务端的多种调度需求,包括同机房路由、同机器路由,以及同机架路由,Nacos都可以去做适配。此外,基于Nacos 的DNS-F功能,我们还实现了加速外部域名解析和服务故障牵引秒级生效。

DNS - F 的应用场景

这张图是Nacos DNS-F的一个具体实现,实际上是拦截了OS层的DNS请求。如果经过DNS的域名是内部服务,它就会从Nacos Server 获取结果,如果不是,就会转发到其它的LocalDNS进行解析。

以数据库高可用的应用场景为例,我们的数据库切换效率比较低,依赖业务方修改配置,时效不确定,通常需要10分钟以上(备注:我们的数据库实际上已经实现了主备的功能,但当一个主服务出现问题的时候,总是要去切换IP。)切换IP的过程中,依赖运维和开发的协作,这是一个比较长的过程。

引入DNS后,当主出现问题的时候,就可以很快的用另外一个主的IP来进行替换,屏蔽故障,而且节点的故障检测和故障切换都可以自动完成,并不依赖运维和开发的协作,节省了时间。当然,这个场景的解法有很多,比如说使用MySQL - Proxy也可以去解这个问题,但我们的MySQL - Proxy还在建设中,想尽快的把这个问题解决,所以采用了DNS的方式。

下面我们再着重分享下基于DNS-F对LocalDNS的优化。虎牙还没有去建设自己的LocalDNS,大部分使用的是一些公共的DNS,大致有以下这些组成。

这种组成方式会存在一个问题。假设服务突然一下崩溃后,之后服务又马上正常了,这种情况我们无法重现去找到崩溃原因。因为很多场景下,是一个公共DNS的请求超时导致的,甚至一个解析失败导致的,在那一刻,因为无法保留现场的,所以就发现不了问题。

以我们的监测数据来看,DNS解析错误的比例达到1‰左右,超时比例将更高。意思是在使用公共DNS的情况下,服务有1‰的几率是会超时或失败,如果服务没有做好容错,就会出现异常。同时,一些公共DNS解析的延时都是不定的,比如在亚马逊上一些比较不好的节点,它的延时会比较高,平均超过三四十毫秒。

然后我们基于DNS-F对LocalDNS做了一些优化。优化结果如下:

  • 平均解析时间从之前的超过两百毫秒降低到两毫秒以下;
  • 缓存命中率从92%提升到了99%以上;
  • 解析失败率之前是1‰,现在基本上没有了。

优化的效果也体现在我们的风控服务上,平均延迟下降10ms,服务超时比例下降25%,降低了因延迟或服务超时导致的用户上传的图片或文字违规但未被审核到的风险。

服务注册的实践

虎牙的核心业务是跑在Tars上的。

Tars:腾讯开源的一款微服务框架。

Tars主要是支持C++,但对Java、PHP等开发语言的支持力度比较差,这就使得我们非C++的业务方去调用它就会很别扭。引入Nacos以后,我们通过Nacos支持的DNS协议来实现服务发现过程中对全语言的支持。

当然,Nacos不只是一个注册中心,它具备了融合多个数据中心的能力,支持多数据源的同步,例如,我们目前已经支持了Taf(虎牙内部的一个重要微服务体系)、Nacos自身、ZooKeeper、以及K8S上一些服务注册的同步。

同时,基于Nacos集群的双向同步功能(Nacos-Sync),我们实现了国内的两个可用区,以及国外的多个可用区之间的数据值同步,最终实现了一处注册、多地可读。

Nacos-Sync是事件机制,即同步任务通过事件触发,可以灵活地开启和关闭你要同步的任务,然后根据服务变化事件触发监听,保证实时性,最后通过定时的全量突发同步事件,保证服务数据的最终一致。同时,Nacos-Sync也支持服务心跳维持,即多个数据中心的心跳,可以使用Nacos-Sync代理要来实现远端同步。此外,也支持心跳与同步任务绑定,便于灵活控制。

由于Taf上有数万个注册服务,同步的量特别大,所以我们在Nacos-Sync做了一些改造,通过任务分片来实现数万服务同步的可用性保障。改造步骤是先以服务为粒度定义任务,然后在多个分片上分散任务负载,最后以单分片多副本来保证任务可用性。

对接 CMDB,实现就近访问

在服务进行多机房或者多地域部署时,跨地域的服务访问往往延迟较高,一个城市内的机房间的典型网络延迟在1ms左右,而跨城市的网络延迟,例如上海到北京大概为30ms。此时自然而然的一个想法就是能不能让服务消费者和服务提供者进行同地域访问。

Nacos定义了一个SPI接口,里面包含了与第三方CMDB约定的一些方法。用户依照约定实现了相应的SPI接口后,将实现打成Jar包放置到Nacos安装目录下,重启Nacos即可让Nacos与CMDB的数据打通。

在实际的落地过程中,我们是在DNS-F接入Taf,在DNS-F上实现Taf的中控接口,无缝对接Taf的sdk。DNS-F提供缓存负载均衡和实例信息,Nacos则提供负载均衡信息的查询接口。

服务配置的实践

虎牙的域名(www.huya.com)会接入华南、华中、华北多个IDC机房,每个机房都会建设一个Nginx去做负载均衡,经过负载均衡的流量会通过专线返回到我们的后端服务器上。在这个过程中,如果我们去修改一个在中间的配置,需要下发到多个机房的上百个负责负载均衡的机器上,如果出现配置下发不及时,或下发配置失败,极大可能会出现故障,同时,负责均衡服务的机器对弹性能力的要求较高,在业务高峰如果不能快速扩容,容易出现全网故障。

传统的配置下发方式是通过服务端下发文件更新配置,更新配置生效时间长,由于需要预先知道负责均衡集群的机器信息,扩缩容需要等元信息同步以后才能接入流量,扩容流量的接入时间较长。

引入Nacos后,我们采用了配置中心监听方式,通过客户端主动监听配置更新,配置便可秒级生效,新扩容服务主动拉取全量配置,流量接入时长缩短3分钟+。

虎牙对 Nacos 改造和升级的总结

引入Nacos的过程中,我们所做的改造和升级总结如下。

一是在DNS-F上,我们增加了对外部域名的预缓存的支持,Agent的监控数据对接到公司的内部监控,日志输出也对接到内部的日志服务,然后和公司的CMDB对接,并实现了DNS-F Cluster集群。我们之所以去构建一个DNS-FCluster集群,是为了避免内存、硬盘或版本问题导致的DNS服务无效,有了DNS-F Cluster集群,当本地Agent出现问题的时候,就可以通过集群去代理和解析DNS请求。

二是在Nacos-Sync上,我们对接了TAF注册服务和K8S注册服务,以及解决了多数据中心环形同步的问题。

三是在Nacos CMDB上,我们对Nacos CMDB进行了扩展,对接了虎牙自己的CMDB,并对接了内部的负载均衡策略。


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

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

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

相关文章

区块链人才缺口明年将达顶峰,核心开发者年入百万很正常

区块链技术一直备受争议,庞氏骗局、泡沫明显、去中心化无意义,技术无法真正建立信任、区块链技术并不能真正履行货币职能、比特币矿机耗电量大、浪费资源等等。2018年,加密货币市场总价值损失超过80%,链圈就此进入阴影。区块链技术…

阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示。如下图所示: 那么播放…

AES和RSA前后端加解密

先了解AES和RSA加密算法 AES算法 1、运算速度快,在有反馈模式、无反馈模式的软硬件中,Rijndael都表现出非常好的性能。 2、对内存的需求非常低,适合于受限环境。 3、Rijndael 是一个分组迭代密码, 分组长度和密钥长度设计灵活。 4、AES标…

PMBOK第六版最新十大大知识领域ITTO思维导图-干货!

PMBOK学习过程中,ITTO(输入、工具、技术、输出)是每年必考的内容,掌握ITTO的脉络,对学习和梳理PMP非常有帮助。知道这个过程要做什么,为什么做,做完有什么成果。也是项目经理必备的技能之一。 …

这个情人节,工程师用阿里云来试着表达不一样的爱意

年轻的时候谈的恋爱就像TCP链接,恋爱时三次握手即可,可分手时却分了四次。而常常久久的爱情,更像是icmp协议,无论对方身在何处,无论是否是可靠连接,无论你何时去ping她/他,她/他都默默地响应你。…

云+X案例展 | 金融类:金山云为新网银行重塑金融服务提供云计算动力

本案例由金山云投递并参与评选,CSDN云计算独家全网首发;更多关于【云X 案例征集】的相关信息,点击了解详情丨挖掘展现更多优秀案例,为不同行业领域带来启迪,进而推动整个“云行业”的健康发展。作为国内第三家、中西部…

对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网络传输过程中,很有…

Unity人物移动的几种方法

Unity人物移动的几种方法 方法一:transform.Translate世界坐标系移动自身移动的案例 方法二:CharacterController.Move(vector dir)按照世界坐标轴移动按照自身坐标轴移动 方法三:CharacterController.SimpleMove&…

可应用于实际的14个NLP突破性研究成果(四)

可应用于实际的14个NLP突破性研究成果(一) 可应用于实际的14个NLP突破性研究成果(二) 可应用于实际的14个NLP突破性研究成果(三) 11.对序列建模的通用卷积和递归网络的实证评估作者:SHAOJIE …

量子通信,到底是什么工作原理?

戳蓝字“CSDN云计算”关注我们哦!作者 | 小枣君责编 | 阿秃今天,小枣君要和大家聊的是“量子通信”。最开始计划写这个专题的时候,小枣君的内心是很纠结的。鲜枣课堂的目的,就是传递“普通人都能听懂”的知识。每一个知识点专题&a…

图(关系网络)数据分析及阿里应用

2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,阿里巴巴资深技术专家钱正平为大家分享了大数据技术背景下图数据的应用前景,以及阿…

架构的“一小步”,业务的一大步

前言: 谈到“架构”这两个字,会有好多的名词闪现,比如:分层架构、事件驱动架构、DDD、CQRS等。亦或者一堆的软件设计原则,如:KISS原则(Keep it Simple and Stupid)、SOLID原则(单一责任原则、开…

牵手大企,关于图形计算、HPC与AI,NVIDIA言有尽而意无穷!

戳蓝字“CSDN云计算”关注我们哦!作者 | 晶少出品 | CSDN云计算(ID:CSDNcloud)在黄仁勋看来,随着摩尔定律消亡,GPU加速才是撬动未来高性能计算发展的有力杠杆。有数据显示,目前NVIDIA已经销售了…

如何合理的规划jvm性能调优

JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响。但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松。为了更好的理解本篇所介绍的内容。你需要已经了解和遵循以下内…

如何衡量研发效能?阿里资深技术专家提出了5组指标

阿里妹导读:新的一年,相信很多产品技术团队把研发效能提升列为重要的目标,甚至还有团队为此专门成立了项目组。然而,到底什么是好的研发效能,却很少有人能够表达清楚。标准不清晰,又何谈提升? …

官宣!2020年,这5类程序员要过苦日子!网友:明年咋活?!

2020年就要来了,有人说:经历了2019年的“市场变革”后,未来这一年将会至关重要,是决定各自命运的定型年。那么对于程序员来说,明年的风向标是如何?哪些编程语言会持续大热,哪些要做好被“淘汰”…

Perseus-BERT——业内性能极致优化的BERT训练方案【阿里云弹性人工智能】

一,背景——横空出世的BERT全面超越人类 2018年在自然语言处理(NLP)领域最具爆炸性的一朵“蘑菇云”莫过于Google Research提出的BERT(Bidirectional Encoder Representations from Transformers)模型。作为一种新型的…

Kubernetes的共享GPU集群调度

问题背景 全球主要的容器集群服务厂商的Kubernetes服务都提供了Nvidia GPU容器调度能力,但是通常都是将一个GPU卡分配给一个容器。这可以实现比较好的隔离性,确保使用GPU的应用不会被其他应用影响;对于深度学习模型训练的场景非常适合&#…

华为云WeLink正式发布,这是更懂企业的智能工作平台一枚!

今日,华为云在京发布智能工作平台WeLink。 对此,华为云副总裁、联接与协同业务总裁薛浩表示:“华为云WeLink源自华为数字化转型实践,是更懂企业的智能工作平台,具备智能高效、安全可靠、开放共赢三大核心优势&#xff…

一致性协议浅析:从逻辑时钟到Raft

前言 春节在家闲着没事看了几篇论文,把一致性协议的几篇论文都过了一遍。在看这些论文之前,我一直有一些疑惑,比如同样是有Leader和两阶段提交,Zookeeper的ZAB协议和Raft有什么不同,Paxos协议到底要怎样才能用在实际工…