TARS 服务优雅关闭

tars服务端(一):server的启动流程 分析tars服务端的启动流程和几个重要的概念 阅读详情

TARS 服务优雅关闭

 

TARS是腾讯开源的微服务调用框架,框架基础设施(RegistryServer,NodeServer,ConfigServer等)是由C++编写,框架上的微服务支持C++、Java、Go等。在众多介绍TARS的使用文章中都是介绍服务的开发及部署,没有文章介绍服务如何进行优雅关闭,优雅关闭对于生产环境尤为重要,不支持优雅关闭将在服务升级或服务实例调整时对业务产生影响。本文将讲通过分析TARS框架源码介绍一种实现优雅关闭的方式。

 

TARS服务关闭逻辑

AdminRegistryServer

WEB调用AdminRegistryServer的stopServer方法停止服务,stopServer代码比较简单概括说此方法做了两件事:

  1. 更新数据库服务状态(RegistryServer查询服务数据库)
  2. 通知tarsnode关闭服务,stopServer方法

 

NodeServer

NodeServer是结束进程的实施者,AdminRegistryServer通过调用NodeServer接口方法stopServer关闭服务,在stopServer中由CommandStop类来处理具体的服务进程停止操作,我们看一下CommandStop的核心方法executor的源代码:

int CommandStop::execute(string& sResult)

{

    bool needWait = false;

    ...........

        string sStopScript   = _serverObjectPtr->getStopScript();

        //配置了脚本或者非tars服务

        if( TC_Common::lower(TC_Common::trim(_desc.serverType)) == "tars_php" ){

            生成停止shell脚本 

            ...............

           

 

        }else if (!sStopScript.empty() || _serverObjectPtr->isTarsServer() == false) {

            如果设置了停止脚本,则运行启动脚本

            map<string, string> mResult;

            _serverObjectPtr->getActivator()->doScript(sStopScript, sResult, mResult);

            设置需要等待

            needWait = true;

        }

        else

        {

            如果没有设置关闭脚本,直接调用Admin服务关闭(每个TARS服务都会自动产生一个Admin服务)

            if (_useAdmin)

            {

                AdminFPrx pAdminPrx;    //服务管理代理

                string  sAdminPrx = "AdminObj@" + _serverObjectPtr->getLocalEndpoint().toString();

                异步调用关闭方法,并设置等待

                pAdminPrx->async_shutdown(NULL);

                needWait = true;

            }

        }

 

    }

    catch (exception& e)

    {  .....   }

    catch (...)

    {  .....   }

 

    //等待STOP_WAIT_INTERVAL秒

    time_t tNow = TNOW;

    int iStopWaitInterval = STOP_WAIT_INTERVAL;

    try

    {

        服务停止,超时时间自己定义,单位MS

        TC_Config conf;

        conf.parseFile(_serverObjectPtr->getConfigFile());

        iStopWaitInterval = TC_Common::strto<int>(conf["/tars/application/server<deactivating-timeout>"]) / 1000;

        最短不短于,服务停止检测间隔 2S

        if (iStopWaitInterval < STOP_WAIT_INTERVAL)

        {

            iStopWaitInterval = STOP_WAIT_INTERVAL;

        }

        时间最长不超过60S

        if (iStopWaitInterval > 60)

        {

            iStopWaitInterval = 60;

        }

 

    }

    catch (...)

    {

    }

    等待服务进程关闭

    if (needWait)

    {

        while (TNOW - iStopWaitInterval < tNow)

        {

            if (_serverObjectPtr->checkPid() != 0)  //如果pid已经不存在

            {

                等待过程中服务关闭,则完成服务关闭

                return 0;

            }

        }

        ........

    }

 

    仍然失败。用kill -9,再等待STOP_WAIT_INTERVAL秒。

..............

 

    return  -1;

}

 

 

服务Admin接口(AdminFServantImpl)

    public void shutdown() {

        try {

            System.out.println(ConfigurationManager.getInstance().getServerConfig().getApplication() + "." +

                                          ConfigurationManager.getInstance().getServerConfig().getServerName() + " is stopped.");

            NotifyHelper.getInstance().syncReport("[alarm] server is stopped.");

        } catch (Exception e) {

            OmLogger.record("shutdown error", e);

        }

        System.exit(0);

    }

分析

以上是对代码的分析(关键部分已经红字标注),我们可以画出整体逻辑图。

 

TARS服务发现及关闭逻辑图:

 

其中红色线条为服务管理数据流,黑色为微服务运行时数据流。

先来看微服务运行时:

  1. 客户端通过RegistryServer查询调用服务的服务器列表
  2. RegistryServer查询数据库,找出active的服务
  3. 客户端根据此列表负载均衡的访问各个服务。
  4. 客户端通过RegistryServer定期更新服务列表,通常20-30s

 

服务管理:

  1. 管理员通过WEB调用AdminRegistryServer关闭服务
  2. AdminRegistryServer更新数据库服务状态位inactive
  3. 通过调用相应服务器节点的NodeServer关闭服务

 

如果我们没有设置过停止脚本,那么Admin结束后直接关闭了服务。如果这时客户端还没有刷新服务器列表则一定时间内将出现服务调用失败,如下图所示:

 

通过分析服务关闭逻辑我们可以利用关闭脚本延迟服务的关闭,在客户端刷新周期内使服务继续服务:

  1. 服务延时一段时间关闭,延时时间为框架默认通过TarsQuery模块刷新服务地址的时间(<30s)
  2. 配置服务deactivating-timeout时间,避免服务被NodeServer强行关闭

 

1.配置服务关闭脚本

 

2.配置服务模板,修改deactivating-timeout

 

3.添加关闭脚本

 

 

脚本内容:

#!/bin/sh

PID=`ps -eopid,cmd | grep "服务名特征" |  grep -v "grep" |awk '{print $1}'`

 

echo $PID

 

sleep 40    延迟40s关闭

 

if [ "$PID" != "" ]; then

    echo "kill -2 $PID"

    kill -2 $PID          使用2,是应用有机会处理退出逻辑

fi

 

完成以上配制后再关闭服务,node将延时时间T关闭服务,只要客户端的服务列表刷新时间小于T,将不会出现错误实现优雅关闭,如下图:

 

1.关闭服务节点

 

节点状态在数据库中置为inactive

 

2.客户端刷新列表

 

排除inactive节点

 

3.到达时间T

 

节点上服务关闭

服务停不掉?systemctl 终止异常的排查与处理指南 在使用停止服务时,偶尔会遇到服务 “停不掉” 的情况(服务状态始终显示或。 阅读详情

相关推荐

tars linux版搭建

腾讯开源的分布式服务框架。基于官方文档的搭建教程。

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

Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars是将腾讯内部使用的微服务架构TAF(Total Application Framework)多年的实践成果总结而成的开源项目。Tars这个名字来自星际穿越电影人机器人Tars,电影中Tars有着非常友好的交互方式,任何初次接触它的人都可以轻松的和它进行交流,同时能在外太空、外星等复杂地形上,超预期的高效率的完成托付的所有任务。拥有着类似设计理念

纸上得来终觉浅,绝知此事要躬行 1万+

从MCU到MPU:瑞萨RZN2L上手初体验,给Cortex-M工程师的Cortex-R52入门避坑指南

本文详细介绍了从MCU到MPU的过渡经验,特别是瑞萨RZN2L开发板的实战避坑指南。针对Cortex-M工程师转向Cortex-R52内核的挑战,文章深入解析了启动流程、内存管理、中断响应等九大本质差异,并提供了硬件设计陷阱和软件迁移的实用技巧,帮助开发者快速适应MPU开发环境。

weixin_29158413的博客 258

【TARS】TARS学习文章链接(感谢哈)及自己的链接

微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端

Edidaughter的博客 687

数据库实验报告--MySQL

数据库完整版报告--MySQL 包括数据库创建、表的创建、视图以及授权和触发器的创建等内容,全是精华!看完点赞加收藏O(∩_∩)O~。

Mortalz7 4924

Vue3项目实战:CKEditor5富文本编辑器从安装到隐藏不需要的功能

本文详细介绍了在Vue3项目中集成并深度定制CKEditor5富文本编辑器的完整流程。通过分析其模块化架构,指导开发者从标准构建出发,移除图片、表格等冗余插件,创建专属轻量构建,从而显著减小打包体积并提升用户体验。文章结合实战代码,涵盖了环境搭建、自定义构建配置、高级优化技巧等关键步骤。

weixin_29016833的博客 286

动手实践Tars服务的搭建

一、关于Tars Tars是腾讯2017年开源出来的微服务开发框架,内部叫TAF框架,内部使用已经有十年,很多业务在用,部署了上万台机器,成熟度高。 Tars与业界其他同类或相识的应用框架相比: 一是Tars提供了支持多语言(C++/Java)的高性能(性能可达40w/s)RPC开发框架,比如业界开源的Dubbo只支持Java,业界开源的Thrift、gRPC性能没有Tars好; 二是Ta...

李世平的专栏 1万+

大模型——CoPaw:阿里云通义推出的个人智能体工作台,让 AI 助理真正落地

阿里云通义实验室于2026年2月发布CoPaw个人智能助理,采用"本地+云端"双部署模式,支持多平台接入和技能扩展。该产品基于AgentScope多智能体生态构建,具备极简部署、长期记忆系统和灵活的技能插件体系三大核心特性。用户可通过简单命令快速安装,并通过记忆文件系统实现个性化交互体验。CoPaw还支持钉钉、飞书等主流平台接入,并开源了模块化架构,允许本地模型接入。技术架构采用多频道对话网关与可插拔Skills系统,为用户提供真正的AI助理服务体验。

2134

UI-TARS 桌面端开源 mcp-http-server:构建 HTTP+SSE 双协议 MCP 服务端的完整指南

`mcp-http-server` 是 UI-TARS-desktop 仓库中 `packages/agent-infra/mcp-http-server` 目录下的一个可独立发布的高性能 MCP(Model Context Protocol)HTTP 服务库,它同时支持 Streamable HTTP 与 Server-Sent Events(SSE)两种传输协议,并把「HTTP 请求头透传到

gitblog_01200的博客 448

ClaudeCode入门01-环境安装(小白入门:手把手教你配置,超简单的一种接入方式)

文手把手教你从零搭建 Claude Code 开发环境。针对国内网络现状,我们采用 OpenRouter + Claude Code Router 的方案,支持支付宝/微信充值,无需科学上网即可完成配置。内容涵盖 Node.js 安装(macOS/Windows/Linux)、OpenRouter 注册与充值、Claude Code 和 Router 安装配置,以及一键启动脚本的编写。跟着截图一步步操作,10分钟搞定全部环境!

yueyeguzhuo的专栏 282

把收款差异从扯皮变成闭环:SAP S/4HANA Dispute Resolution 模块到底解决什么问题?

本文摘要: SAP S/4HANA的争议解决模块(Dispute Resolution)通过标准化流程管理企业应收争议,解决发票与收款差异问题。核心是创建可追踪的Dispute Case工单,明确处理角色(Processor和Manager),并与财务系统联动实现自动清账。系统支持手工/自动创建争议工单,通过动态默认值减少错误,并最终实现争议金额归零的闭环管理。文中给出制造业客户扣款的完整处理案例,并强调组织落地需统一权限与目录。最后提供ABAP代码示例展示如何通过BAPI创建争议工单。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 167

什么是RPC?原理是什么?如何实现一个 RPC 框架?

01 前言 什么是RPC?它的原理是什么?它有什么特点?如果让你实现一个RPC框架,你会如何是实现?带着这些问题,开始今天的学习。 02 RPC概述 2.1 什么是RPC ? RPC是远程过程调用(Remote Procedure Call)。 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用...

lvlei19911108的博客 544

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TARS 染色日志|收集记录特定日志

作者|Eaton 导语| 记日志可以说是程序猿/媛日常开发中的家常便饭了。在日常业务场景中,经常需要分析特定用户的日志,一般的日志记录方式很难满足需求,有什么解决办法呢?TARS 框架中包含染色日志的功能,能够记录特定用户的日志,优雅地解决这一问题。本文将会介绍染色日志的原理和功能,以及如何在 TARS 中使用染色日志。 目录 背景 初识染色日志 TARS 染色功能概述 染色日志初体验 主动打开染色日志 被动打开染色日志 添加特定逻辑 总结 背景 很多业务场景中,需要对特定用户的行为进行追踪.

TARSFoundation的博客 1697

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入解析TARS C++服务端源码:架构、协程与性能调优实战

在构建高并发、低延迟的分布式系统时,RPC框架是核心基础设施。其工作原理在于通过网络通信实现进程间透明的方法调用,核心价值在于解耦服务、提升开发效率和系统可维护性。在微服务架构中,一个成熟的RPC框架需要处理网络通信、服务发现、负载均衡等复杂问题,其性能直接决定了整个系统的吞吐与稳定性。TARS作为一个历经海量业务验证的微服务PaaS平台,其C++服务端实现了一套高效、稳定的**RPC通信**模型。本文将从其核心的**三层架构**(网络层、协议层、业务层)与两类线程池(NetThread与业务线程池)的设计

weixin_30421809的博客 413

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

UI-TARS手机自动化:告别重复点击,5分钟实现智能操作

自动化技术旨在通过预设规则或智能程序,替代人工执行重复性任务,其核心原理在于模拟用户交互与决策过程。在软件测试、数据采集和日常办公等领域,自动化能显著提升效率、降低错误率并释放人力。随着低代码和人工智能技术的发展,自动化工具正变得更易用和智能。UI-TARS作为一款代表性的跨平台桌面自动化工具,巧妙结合了图像识别与控件识别双引擎,通过可视化流程编排,让用户无需编码即可快速构建稳定的手机自动化脚本。本文聚焦于UI-TARS的实战应用,深入探讨其连接控制、流程设计及稳定性优化等关键环节,为希望实现业务流程自动化

weixin_34037173的博客 363

UI-TARS桌面版:零代码AI操作员,让电脑听懂你的指令

还在为重复的鼠标点击和键盘操作烦恼吗?每天花费数小时在枯燥的GUI操作上?现在,只需用自然语言告诉AI您想做什么,剩下的交给UI-TARS桌面版!🚀 这款革命性的开源工具将视觉语言模型与桌面自动化完美结合,让您像指挥真人助手一样控制电脑。无论是网页操作、文件管理还是软件配置,只需一句话就能完成。今天,让我们一起探索如何用AI解放双手,提升10倍工作效率! ## 痛点分析:为什么需要智能GUI

gitblog_02761的博客 416

告别重复造轮子:用快马AI一键生成ui-tars-desktop业务组件,效率提升300%

这意味着,对于前端项目,我可以在生成代码后,直接在平台上点击“运行”或“预览”按钮,立刻看到这个模态框渲染出来的实际效果,检查布局和交互是否符合预期,而无需启动本地的开发服务器。,在它的AI对话区里,用自然语言描述了我的需求:“请使用ui-tars-desktop组件库,生成一个用户信息编辑模态框的React组件代码,需要包含头像上传、用户名、邮箱、角色选择、状态开关和个人简介字段,并实现表单验证。这个过程,熟练的话可能也需要半小时到一小时,对于追求效率的团队来说,这仍然是宝贵的“重复造轮子”时间。

RubyLion28的博客 244

从“国产龙虾”风暴看企业架构演进:AI Agent 如何在“屎山代码”中优雅突围?

摘要: 2026年3月,国产开源智能体"OpenClaw"因权限失控引发安全讨论,折射出企业数字化转型的深层痛点——如何让AI在穿透系统壁垒的同时确保架构安全。本文以生鲜电商对账场景为例,对比传统脚本与"实在Agent"方案的优劣,揭示非侵入式自动化(ISSUT视觉语义理解+TARS大模型规划)的核心价值:不修改代码即可实现跨系统协同,规避"API地狱"与"屎山代码"风险。建议企业摒弃"全量重构"幻想,通过A

2501_92351994的博客 329

OpenChamber Terminal Subsystem 深度解析:PTY 生命周期、v3 WebSocket 协议与安全回收机制

本文基于 OpenChamber(基于 OpenCode AI Agent 的 Agentic Development Environment)仓库中 [terminal/DOCUMENTATION.md](https://link.gitcode.com/i/cfa07af5d90f26a646227ce59e44fa79) 的架构说明,结合 [runtime.js](https://link.

gitblog_00843的博客 355

【架构师长文】拒绝“屎山”集成:老王聊聊“大模型+Agent”如何打穿企业级数据孤岛与流程自动化

在数字化转型喊了十几年的今天,很多企业的IT架构依然像是一座座“孤岛”组成的群岛。虽然大模型(LLM)在2023年火遍全球,但在大多数CIO和架构师眼里,只会“吟诗作赋”的对话机器人更像是昂贵的玩具,而非生产力工具。企业真正需要的,是能够深入业务腹地、自主调用工具、并在复杂异构系统中完成闭环任务的“数字员工”。本文将以资深架构师的视角,深度剖析当前企业在系统集成与自动化执行中的底层痛点,并评测一种基于“大模型+Agent”的非侵入式架构方案。

2501_92351994的博客 354

Youtu-Parsing镜像免配置优势:Supervisor自动拉起进程+OOM Killer防护+崩溃自动恢复

本文介绍了如何在星图GPU平台上自动化部署Youtu-Parsing多模态文档智能解析模型镜像。该镜像内置Supervisor进程管理、OOM Killer防护与崩溃自动恢复机制,开箱即用,能显著提升服务稳定性。用户可轻松将其应用于财务报告、合同等复杂文档的自动化解析与结构化数据提取场景。

weixin_35829279的博客 175

TEN Framework C++ HTTP Server 扩展深度解析:simple_http_server_cpp 从请求接入到命令分发的完整实现

本篇以 TEN Framework 官方示例包 `simple_http_server_cpp` 为主体,结合其完整源码实现,讲解一个生产级 C++ HTTP 服务器扩展是如何构建的:基于 libwebsockets 的事件循环、HTTP 请求到 TEN 命令的协议映射、双线程世界的同步写入机制,以及优雅停机状态机。读完后你将掌握在 TEN Framework 中编写 C++ 扩展接入外部 HTT

gitblog_00543的博客 223

从“PPT造车”到“数字员工”:资深架构师眼中的 AI Agent 企业落地实战与避坑指南

摘要 2026年,企业数字化转型面临的核心矛盾已从数据获取转向业务逻辑的高效执行。传统大模型难以穿透企业内网或操作老旧系统,无法解决数据孤岛问题。本文从企业架构师视角,分析基于大模型的自主智能体(AI Agent)产品,聚焦“实在Agent”等非侵入式方案。通过ISSUT(智能屏幕语义理解)技术,这类方案无需API即可实现跨系统自动化,显著降低集成成本。以财务对账场景为例,对比传统脚本与AI Agent的优劣,揭示非侵入式架构在复杂企业环境中的优势。最终建议企业采用轻量化、高可用的Agent方案,平衡安全性

2501_92351994的博客 224

Dism++ 清理C盘完整指南:4步夺回磁盘空间,系统备份还原一次搞定

C 盘总是弹红条、Windows 更新动不动报错?Dism++ 是一款免费、免安装的绿色系统维护工具,核心能力是深度清理垃圾、系统备份还原与补丁管理。跟着本文做完三步操作,你既能腾出 C 盘空间,还会得到一份随时可回滚的系统备份。 ## Dism++ 到底能帮你做什么 | 你的需求 | 对应功能 | 做完后的变化 | | --- | --- | --- | | C 盘快满了,删无可删 | 空间

gitblog_00246的博客 686
wangping2012
博客等级 码龄11年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值