Git Product home page Git Product logo

tseer's Introduction

Click me switch to English version

TSeer

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

在服务发现的核心功能之上,TSeer还支持多种优秀的负载均衡算法,提供可靠的故障容错策略。针对发展迅速的海量服务,还支持就近接入,按SET逻辑分组,全量调度三种不同的路由策略。实现了高度智能的调度优化,有效解决了业务跨地区跨机房调用等难题,极大提升服务的可用性和调用质量。

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

同时TSeer轻巧灵便,对业务的侵入性低,非Tars服务亦可无缝接入,是微服务框架中优秀的名字服务解决方案。

产品详细说明文档参见TSeer产品介绍

支持平台

  • Linux

支持语言

  • JAVA
  • C++
  • 更多版本持续开发中...

安装指引

TSeer提供了一键部署脚本,安装方便快捷。详见TSeer安装文档

api

c++ api

java api

tseer's People

Contributors

chhy2009 avatar loveyacper avatar mr-workaholic avatar troycheng avatar zhaonanyu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tseer's Issues

TSeer Agent Api works in a synchronous way which is slow while TSeerServer is down

The Tseer Api becomes very slow when TSeerServer is down (occasionally core dump as mentioned in issue #12 ), because it works in a synchronous way and will wait for response from server until timeout (500ms). If it happens in a high efficiency online system it will cause performance problem, every request using agent api to get backend service host will be slow down by this issue.

The asynchronous way should be better, the agent is responsible for fetching host list and the api just get the result that already cached.

当TseerServer挂掉(issue #12 中遇到的,写日志阶段偶发 core)的时候,Agent api 响应会变得非常的慢,因为目前是一种同步获取的方式,api 会先触发一个请求去 TseerServer 同步信息,然后返回结果,当 TseerServer 有问题,这个请求就会等到超时(500ms)才返回。在一些请求量大耗时敏感的系统里,这个问题会造成请求拥塞,系统吞吐急剧下降。

这里异步应该是更好的方法,Agent 只负责同步 host 信息并更新缓存,而接口只从缓存中获取数据保证响应速度。考虑 Tseer 作为内部系统应该早已经过千锤百炼,这种问题肯定早有方案, 还请同步或明示应该如何使用。

A simple way to reproduce this problem:
一个简单复现的办法:

CODE:

struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
iRet = ApiGetRoute(req, sErr);
gettimeofday(&tv2, NULL);
fprintf(stderr, "cost %f\n", (tv2.tv_sec - tv1.tv_sec)*1000.0 + (tv2.tv_usec - tv1.tv_usec)/1000.0);
cout << "[out]iRet: " << iRet << " sErr: " << sErr << endl;
cout << "[out]ip: " << req.ip << endl;
cout << "[out]port: " << req.port << endl;
cout << "[out]isTcp: " << req.isTcp << endl;

OUTPUT:

cost 500.177000
[out]iRet: 0 sErr: /home/tcheng/tools/TSeer/api/cplus/src/conn.cpp:QueryAndRecvRouterFromAgent:136|socket recvfrom error|ip:127.0.0.1|port:8865|ret:-1|timeOut:500|fd:4|errno:11|info:Resource temporarily unavailable
[out]ip: 10.181.32.11
[out]port: 8724
[out]isTcp: 1
[report]sErr: /home/tcheng/tools/TSeer/api/cplus/src/conn.cpp:QueryAndRecvRouterFromAgent:136|socket recvfrom error|ip:127.0.0.1|port:8865|ret:-1|timeOut:500|fd:4|errno:11|info:Resource temporarily unavailable

执行安装脚本报缺少文件

执行如下:
cd build; python tseer_deploy.py
[INFO] 2018-12-17 11:57:32 Starting deploy tars...
[INFO] 2018-12-17 11:57:32 downloading tars...
sed: can't read ./Tars/cpp/build/CMakeLists.txt: No such file or directory
sed: can't read ./Tars/cpp/build/CMakeLists.txt: No such file or directory
sed: can't read ./Tars/cpp/build/CMakeLists.txt: No such file or directory
[INFO] 2018-12-17 11:59:26 building tars into /root/TSeer/build/../thirdparty/tars/ ...
./cmake/deploy_tars.sh: line 30: cd: ./Tars/cpp/build: No such file or directory
[ERROR] 2018-12-17 11:59:26 Compile Tars failed.

这里有几个问题不怎么清晰

1、TseerServer是怎么集群部署的,内部之间怎么通信的;
2、被调节点是怎么向TseerServer上报心跳的,我的理解是被调节点与TseerServer没有关联的地方啊?可能是我理解错了,我的被调节点就是一个demon进程,没使用任何Tseer,Tars相关组件。
3、安装Tseer的时候,需要安装Tars和etcd,Tars文件下面的很多文件貌似不全或者不是最新的,再个就是depoy完了之后程序全部就启动了,这样岂不是有点不合理?为啥不把安装和启动分开来做,而是在depoy里面默认启动etcd, TseesServer, Agent?
4、Tseer 的C++API 经过测试有错误的地方

本人研究了几天,能力有限,发现还是有很多问题,感觉很难用在实际生产中,望大佬解疑答惑,感激不尽

TSeer与L5

请问,之前在腾讯内部,多用内部L5系统,手动配置 服务的 对应 主机列表
外面的spring cloud 组件库中有一个 eureka, 是自动注册的方式,好像不支持权重分配

请问TSeer更接近于哪种 名字服务呢

TseerAgent 挂掉时,Tseer api的缓存未生效,getRoute全部失败

RT,当 TseerAgent 意外关闭时,tseer api 的调用全部失败,文档中所说的,“使用Agent 方式时,如果Tseer Agent失效,Tseer Api将会从内存中返回已访问过的节点给主调,如果Tseer Api缓存失效,此时Tseer Api将会从本地磁盘中的缓存文件恢复缓存信息提供给主调”,均未生效

安装失败

多次尝试,均是失败在:

chmod: 无法访问"thirdparty/tars/tools/tars2cpp": 没有那个文件或目录

日志输出如下:

[root@rdqa-ocr-3-69 build]# python tseer_deploy.py
[INFO] 2018-06-12 18:53:31 Starting deploy tars...
[INFO] 2018-06-12 18:53:31 Deploy tars success!
[INFO] 2018-06-12 18:53:31 Starting deploy tseer...
[INFO] 2018-06-12 18:53:31 Starting install etcd...
[ERROR] 2018-06-12 18:55:28 check etcd failed, see log /home/data/tseer/etcd//log
[INFO] 2018-06-12 18:53:31 Starting resolve dependency...
[INFO] 2018-06-12 18:55:28 resolve depedency rapidjson...
[SUCC] 2018-06-12 18:55:28 Successfully resolve dependency
[INFO] 2018-06-12 18:53:31 Starting build tseer...
[INFO] 2018-06-12 18:59:12 start build tseer...
chmod: 无法访问"thirdparty/tars/tools/tars2cpp": 没有那个文件或目录
[ERROR] 2018-06-12 18:59:12 make install seer failed, see log tseer_make.log.

另外,check etcd failed是缺少 etcd 的 bin 文件,第一次成功之后,清空环境重新执行脚本,每次都会出现这个错误

Agent 管理工具未更新TSeerServer缓存,下载的 agent 包是老的

问题现象:

由于需要部署的 agent 机器 gcc 版本较低,原来生成的 TseerAgent 所依赖的libstdc++.so版本较低无法使用,因此更新 TseerAgent 的编译选项,静态链接 libstdc++.a 重新生成 bin 文件,手动验证可以使用之后:

  1. 在管理平台->发布包管理中将老的包删除
  2. 上传新编译的包
  3. 重新生成命令,在目标机器执行,下载包并安装

此时问题出现,下载的包仍然是老的(对比 bin 文件 md5 可知)。

问题排查:

起初以为是上传覆盖未成功,但搜索文件发现,在 TseerServer/data/目录下其实新老包都存在,说明上传并没有问题。问题出现在获取的时候,没有拿到最新的包。于是将老的包从 data 目录下删除,在目标机器清理环境并重新下载 agent,然而发现下载的仍然是老的包。在更大范围搜索并没有老的包存在,于是查看脚本,发现是从 TseerServer下载(起初以为是resin 上的 web 项目在管理),于是猜测文件被缓存了,重启 TSeerServer,重新下载,生效,问题解决。

搜索代码,TSeerAgent 这个包缓存的逻辑应该是封装起来了,没有明显看到,但从 installscript.tgz 的处理方式来看,很可能是读入缓存后就再未做过更新,因此即便在 web 平台删除,重新上传 agent 包,下载的时候仍然还是老的包。

需修改:

  1. web 管理平台上操作 TseerAgent 的包之后,TSeerServer 缓存的文件需同步更新

执行py脚本安装时提示错误

[root@localhost build]# python tseer_deploy.py
[INFO] 2019-07-24 11:43:05 Starting deploy tars...
[INFO] 2019-07-24 11:43:05 downloading tars...
error: option `recurse-submodules' takes no value
用法:git clone [选项] [--] <版本库> [<路径>]

-v, --verbose         更加详细
-q, --quiet           更加安静
--progress            强制显示进度报告
-n, --no-checkout     不创建一个检出
--bare                创建一个裸版本库
--mirror              创建一个镜像版本库(也是裸版本库)
-l, --local           从本地版本库克隆
--no-hardlinks        不使用本地硬链接,始终复制
-s, --shared          设置为共享版本库
--recursive           在克隆时初始化子模组
--recurse-submodules  在克隆时初始化子模组
--template <模板目录>
                      模板目录将被使用
--reference <版本库>  引用版本库
-o, --origin <名称>   使用<名称>而不是 'origin' 去跟踪上游
-b, --branch <分支>   检出<分支>而不是远程HEAD
-u, --upload-pack <路径>
                      远程 git-upload-pack 路径
--depth <深度>        创建一个指定深度的浅克隆
--single-branch       只克隆一个分支、HEAD 或 --branch
--separate-git-dir <git目录>
                      git目录和工作区分离
-c, --config <key=value>
                      在新版本库中设置配置信息

[ERROR] 2019-07-24 11:43:05 Download Tars failed.

TSeerServer不稳定 core

目前试用中还是会遇到 TSeerServer 不稳定 core 的问题,目前还没有找出稳定复现的条件,会继续尝试。
现将 core 信息贴出,期望能获得一些有效信息,最终解决这个问题:

core文件1:

#0  0x00007f95ce5ccec5 in _IO_vfscanf_internal () from /lib64/libc.so.6
#1  0x00007f95ce5e1685 in vsscanf () from /lib64/libc.so.6
#2  0x00007f95ce5db6e8 in sscanf () from /lib64/libc.so.6
#3  0x00007f95ce615152 in __tzset_parse_tz () from /lib64/libc.so.6
#4  0x00007f95ce61632e in __tzfile_compute () from /lib64/libc.so.6
#5  0x00007f95ce615cb7 in __tz_convert () from /lib64/libc.so.6
#6  0x000000000046eba1 in tars::TC_Logger<tars::RollWriteT, tars::TC_RollBySize>::stream(int) ()
    at /home/tcheng/tools/TSeer/thirdparty/tars/include/util/tc_logger.h:727
#7  0x000000000046ed3e in tars::TC_Logger<tars::RollWriteT, tars::TC_RollBySize>::debug() ()
    at /home/tcheng/tools/TSeer/thirdparty/tars/include/util/tc_logger.h:689
#8  0x00000000004957ec in RequestEtcdCallback::responseClient(int, long, std::vector<Tseer::RouterData, std::allocator<Tseer::RouterData> > const&) () at /home/tcheng/tools/TSeer/TseerServer/src/RequestEtcdCallback.cpp:1299
#9  0x00000000004a1b8c in RequestEtcdCallback::onResponse(bool, tars::TC_HttpResponse&) ()
    at /home/tcheng/tools/TSeer/TseerServer/src/RequestEtcdCallback.cpp:168
#10 0x0000000000609a81 in tars::TC_HttpAsync::AsyncRequest::doReceive() ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_http_async.cpp:264
#11 0x0000000000609be1 in tars::TC_HttpAsync::process(tars::TC_AutoPtr<tars::TC_HttpAsync::AsyncRequest>&, int) ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_http_async.cpp:462
#12 0x0000000000609d2d in tars::TC_HttpAsync::run() () at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_http_async.cpp:505
#13 0x0000000000610acf in tars::TC_ThreadPool::ThreadWorker::run() ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_thread_pool.cpp:60
#14 0x00000000005f7e7a in tars::TC_Thread::threadEntry(tars::TC_Thread*) ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_thread.cpp:93
#15 0x00007f95cf0b6aa1 in start_thread () from /lib64/libpthread.so.0
#16 0x00007f95ce660aad in clone () from /lib64/libc.so.6

core 文件2:

#0  std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
    at /usr/local/include/c++/4.8.3/bits/basic_string.h:716
#1  0x00000000004a314a in EtcdReqStr(EtcdReqestInfo const&) () at /home/tcheng/tools/TSeer/TseerServer/src/RequestEtcdCallback.h:284
#2  0x00000000004957af in RequestEtcdCallback::responseClient(int, long, std::vector<Tseer::RouterData, std::allocator<Tseer::RouterData> > const&) () at /home/tcheng/tools/TSeer/TseerServer/src/RequestEtcdCallback.cpp:1299
#3  0x0000000000499291 in RequestEtcdCallback::doGetSeerAgentResponse(rapidjson::GenericDocument<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>, rapidjson::CrtAllocator> const&) ()
    at /home/tcheng/tools/TSeer/TseerServer/src/RequestEtcdCallback.cpp:316
#4  0x00000000004a207b in RequestEtcdCallback::onResponse(bool, tars::TC_HttpResponse&) ()
    at /home/tcheng/tools/TSeer/TseerServer/src/RequestEtcdCallback.cpp:120
#5  0x0000000000609a81 in tars::TC_HttpAsync::AsyncRequest::doReceive() ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_http_async.cpp:264
#6  0x0000000000609be1 in tars::TC_HttpAsync::process(tars::TC_AutoPtr<tars::TC_HttpAsync::AsyncRequest>&, int) ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_http_async.cpp:462
#7  0x0000000000609d2d in tars::TC_HttpAsync::run() () at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_http_async.cpp:505
#8  0x0000000000610acf in tars::TC_ThreadPool::ThreadWorker::run() ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_thread_pool.cpp:60
#9  0x00000000005f7e7a in tars::TC_Thread::threadEntry(tars::TC_Thread*) ()
    at /home/tcheng/tools/TSeer/build/Tars/cpp/util/src/tc_thread.cpp:93
#10 0x00007f0febe71aa1 in start_thread () from /lib64/libpthread.so.0
#11 0x00007f0feb41baad in clone () from /lib64/libc.so.6

入口都是 tars::TC_HttpAsync::AsyncRequest::doReceive(),中间路径略有由不同,看起来是字符串的处理上有点儿问题,但简单 debug 了一下没有找出原因。

LBStaticWeight死循环

TSeer/api/cplus/src/lb_static_weight.cpp
int LBStaticWeight::getRouter(Tseer::RouterNodeInfo& nodeInfo, std::string &errMsg)
当所有节点都不可用时,会死循环

获取ip会报错

运行一键安装脚本会报错,把 在build目录下的 utils/get_os_info.py 文件中的def get_ip(): 定义为 return "127.0.0.1"才能正常运行

php支持

目前已经支持php的调用了吗?大兄弟们

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.