【开源】Tseer:Tars名字服务功能的轻量化实现

原创 2018年04月17日 15:47:27

作者: 钟科

一.TSeer简介

TSeer是一套服务注册发现容错的方案,是对Tars名字服务功能的轻量化。在腾讯浏览器、应用宝、管家、手机书城、腾讯文学、广点通等众多业务中广泛采用,目前日均承载百亿级的请求量。

TSeer轻巧灵便,对业务的侵入性低,非tars服务亦可无缝接入。在服务发现的核心功能之上,Tseer还支持多种负载均衡算法,提供可靠的故障容错策略,可有效解决业务跨地区跨机房调用等难题,极大提升服务的可用性和调用质量,是微服务框架中优秀的名字服务解决方案。

TSeer拥有web管理界面和API接入两种方式可供用户根据需求自由选择,通过代理节点和代理服务器机制为需要频繁发布变更的业务提供透明的服务发现功能,学习成本很低,操作也很方便,对于业务维护人员十分友好。

目前TSeer已正式开源。Github地址为:https://github.com/Tencent/Tseer

二.研发背景

在传统的单体式应用中,变更发布相对较少,系统中的网络位置也很少变化,偶尔的变更也可以通过手动更改配置的方式来应对。但是在当前海量服务的大环境下,这种架构已经无法高效稳定的支撑高速增长的业务。越来越庞大的分布式服务集群和微服务框架已经逐渐成为主流。

但是新型架构为业务提供更好支撑的同时,频繁的发布更新与动态伸缩也导致了网络位置的频繁变化,在这种情况下业务维护人员手动更改配置这种大规模重复性工作不仅增大了出错的风险,其低效也会限制业务的高速发展。往往配置还没改完,新的变更就需要发布了。所以就必须要一个自动化的服务发现工具来解决这些问题。

然而这些也并不是问题的全部。在保证访问成功的前提下,响应时间作为服务质量中最重要的指标,是影响业务发展最关键的一环。多业务集之间复杂的调用关系再加上跨地区跨网络调用等其他因素,响应时间达不到预期是持续困扰整个业务发展周期的棘手问题。与此同时,无论是采用物理机还是虚拟机,节点挂掉导致的不可用时有发生,如何有效容错也是亟待解决的问题。
基于这些问题,我们开发了TSeer。

三.TSeer架构


整个Tseer的结构分为四部分:TseerServer、业务客户端(主调)、业务服务端(被调)、web管理。

• TseerServer

TseerServer是整个Tseer的枢纽与核心模块。 当新节点上线时,需要先通过WEB管理平台在Tseer服务集群注册,将其网络位置信息记录在Tseer系统中。当需要对节点进行下线或者其他修改时,也需要在WEB管理平台就行相关操作。被调节点也会定时上报心跳给TseerServer,server端会屏蔽心跳超时的节点使其无法被调用。

• 业务客户端

业务客户端是需要调用其他服务的节点,称之为主调,是服务发现功能的使用者。 Tseer为业务客户端提供了:安装Agent与API调用两种方式来从TseerServer获得需要调用的服务(被调)的地址来完成调用。

• 业务服务端

业务服务端是需要被调用的节点,称之为被调,是服务的提供者。 当新节点上线时,被调需要在TseerServer注册。不论同一个被调服务集群有多少个节点,注册时该服务集群都需要注册一个统一的名字。主调在调用逻辑中只需要写明需要调用的服务的名字,Tseer会根据被调名字来返回被调地址。当被调需要扩容时,只需要把新节点加在该服务对应的名字下面即可。业务人员无需管理被调集群下繁多的服务节点信息,十分方便。

• Web管理

业务信息及节点路由信息的增删改查都是通过web管理界面操作,简便快捷直观。甚至agent安装包都可以通过web平台更新发布。详细使用方式可参考github上TSeer项目的使用文档。

四.Tseer功能的特点

1.负载均衡

当同一业务集群中某些节点被频繁调用而另一些节点没有承担合理的负载时,不仅业务的服务质量和响应时间会大幅下降,同时也会造成资源的浪费。

Tseer系统中,当主调发起调用时,会针对被调名字下所有可用节点为调用提供四种负载均衡方式来保障各个节点的合理负载,分别是

• 轮询

• 随机

• 静态权重

• 一致性哈希

用户还可以使用调用分组的方式来自定义负载均衡实现,调用分组会在下文中提到。

2.故障容错

为了解决节点故障导致的业务不可用与服务质量降低,Tseer还提供了可靠的故障容错机制。

当主调进行一次调用之后,会将调用结果上报。如果调用失败Tseer会暂时将该节点屏蔽来避免故障节点被反复调用,Tseer会定时探测被屏蔽的节点,当发现故障节点恢复服务时,会重新将其激活。

对于任意被调节点,满足下列条件之一则屏蔽该节点:

1.在一个检测周期(60秒)内调用失败次数达到2次,且调用错误数占总调用次数的50%以上

2.在5秒内连续调用失败5次以上

对于被屏蔽的节点Tseer Agent/Api将每隔30秒对已屏蔽的节点进行重试。

同时当Tseer故障时,主调也能根据缓存信息继续调用。

3.调用优化

Tseer为调用逻辑提供IDC分组、Set分组、All三种方式来解决跨地区调用等问题。

• All

为主调提供所有可用被调节点地址

• IDC分组

IDC分组可以近似的看作就近接入。

该方法按照两个层次进行划分。第一个是物理小组,是最小的组调度单位,即按照节点所在的机房或者区域分配统 一的组名。第二个是物理小组组成的逻辑组,可以理解为按照更大的区域来划分的统一的组名。

针对IDC的逻辑分组,Tseer还定义了调用优先级策略。即部分逻辑组不可用时,会按照优先级策略返回可用被调节点地址列表。

• Set分组

IDC分组主要是在区域概念上去划分分组,实现就近访问策略,在后台服务架构中,业务规模达到一定数量时,如果要对某几个服务节点实现根据容量、灰度,分区域管理的隔离控制,IDC分组是无法满足的,而Set分组则是对IDC分组的再细化。

Set分组的命名规则为: Set名.Set地区.Set组。其中Set组是最小区分单元的名称,支持通配符*,表示Set地区下的所有分组。比如0,1,2,3,4或者a,b,c,d。

Set分组的调用逻辑如下:

1.主调(客户端)和被调(服务端)都启用了Set分组,并且Set名要一致才认为是启用同SET内

2.启用Set分组的主调和被调只能访问同Set内的节点

3.主调启用Set分组,被调没有启用Set分组,则默认会走按IDC分组查询的逻辑(前提是启用了IDC分组)

4.两种接入方式

根据服务客户端是否在其物理机中部署Tseer Agent,Tseer的使用方式可以分为Agent 和Tseer API两种方式:

• Agent 方式

名字路由

Agent 方式下,Tseer Agent会定期缓存被调方的信息。并根据调用方指定的负载均衡策略将被调节点信息返给调用方。如果调用方希望通过服务特性来实现负载均衡,Tseer也支持按照调用方指定的分组策略将被调的组信息返给调用方。

数据上报

每次调用完成后,调用方需要调用Tseer Api提供的上报接口上报调用信息,调用信息将由Tseer Api即使上报至Tseer Agent。Tseer Agent将根据调用信息剔除失效被调节点。

容错 使用Agent 方式时,如果Tseer Agent失效,Tseer Api将会从内存中返回已访问过的节点给主调,如果Tseer Api缓存失效,此时Tseer Api将会从本地磁盘中的缓存文件恢复缓存信息提供给主调。需要注意的是此时Tseer Api提供给主调服务的信息为有损信息,Tseer Api不保证节点一定健康。

• Tseer Api方式

名字路由

Agent 方式与Tseer Api方式的区别在于是否需要在主调的宿主机中部署Tseer Agent。Tseer Api会直接访问Tseer server。并且被调方信息缓存、负载均衡以及失效节点剔除都在Tseer Api中完成。

Tseer Api会定时拉取Tseerserver的后端信息并屏蔽不可用的被调节点。

容错

Tseerserver故障时,Tseer Api会将内存中缓存的信息返回给主调。当内存缓存不可用时,Tseer Api将会用本地磁盘中的缓存恢复内存缓存。

Agent Api方式 与Tseer Api方式对比

【腾讯TMQ】开源微服务TARS接口测试揭秘

在了解具体如何做tars接口测试之前,我们先简单了解下这个测试的背景知识: Tars平台和Tars协议。一、Tars是什么?Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化...
  • TMQ1225
  • TMQ1225
  • 2017-05-03 16:21:07
  • 983

腾讯高性能RPC开发框架Tars实现服务治理(微服务)

Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars是将腾讯内部使用的微服务架构TAF...
  • boonya
  • boonya
  • 2017-05-21 18:11:56
  • 2918

阿里&百度&腾讯&facebook&Microsoft&Google开源项目汇总

BAT && YMFTTencent GitHub地址:https://github.com/Tencent/tinker Tinker是Android的热修复解决方案库,它支持dex,库和资源更...
  • wh211212
  • wh211212
  • 2017-04-12 21:09:47
  • 3713

TARS快速入门(NodeJs)

1 前言 一个NodeJs应用程序框架需要关注很多问题,如自动发布、多机部署、负载均衡、监控报警、日志的输出与管理、服务异常重启等等,而Tars应用程序框架就提供了解决这些问题的一整套方案。 Tars...
  • mergerly
  • mergerly
  • 2017-11-17 14:16:41
  • 570

tars源码漫谈第7篇------tc_config.h/tc_config.cpp(易用的配置类)

      配置文件能实现配置参数与代码逻辑的分离, 如果需要修改配置参数, 仅仅改配置文件即可。 发布的时候, 风险更小, 也更灵活。      在tc_config中, 实现了配置类。在看代码之前...
  • stpeace
  • stpeace
  • 2018-04-01 09:42:55
  • 64

tars源码漫谈第5篇------tc_epoller.h/tc_epoller.cpp(epoll基本操作的封装)

       马上就是4月1日了, 愚人节。 但2018年已经过了1/4,   好快, 这不是愚人的。       在tars代码中, 目前还没有看到select/poll的痕迹, 光芒被epoll遮...
  • stpeace
  • stpeace
  • 2018-03-31 23:59:46
  • 48

tars源码漫谈第8篇------tc_md5.h/tc_md5.cpp(计算md5来这里找)

      tc_md5很简单, 所谓简单, 并不是说, 每行代码的含义能轻易弄懂, 而是说, 它呈现出来的整体含义很简单, 无非就是md5的计算而已。 如果你需要计算md5的代码, 那就去找tc_m...
  • stpeace
  • stpeace
  • 2018-04-01 09:51:34
  • 34

Bimangle Forge Browser 2017.10 好用而且免费的BIM轻量化模型浏览器

  • 2017年09月30日 17:18
  • 113B
  • 下载

腾讯公司副总裁曾宇:技术必须产生价值,开源需要携手发展

近日,由中国工信部指导,信通院主办的”云计算开源产业大会”在国家会议中心举行。大会邀请了行业内多位重磅人物与共同探讨、交流云计算开源技术及产业化经验,探索开源技术创新的发展途径,也开启了中国信通院和腾...
  • tencent__open
  • tencent__open
  • 2018-03-26 16:49:56
  • 49

YetAnotherForum开源论坛使用备忘

最近弄YetAnotherForum作为一个项目的论坛,中间走了不少弯路阿,在有些地方浪费了不少时间,所以一定要记录下来,免得以后忘了,也让对这个东西有兴趣的朋友也少走点弯路。一。安装吧没有什么好说了...
  • liyun919
  • liyun919
  • 2008-05-13 12:16:00
  • 1815
收藏助手
不良信息举报
您举报文章:【开源】Tseer:Tars名字服务功能的轻量化实现
举报原因:
原因补充:

(最多只允许输入30个字)