博客
关于我
【TARS】TARS-CPP客户端学习二
阅读量:763 次
发布时间:2019-03-23

本文共 1208 字,大约阅读时间需要 4 分钟。

TARS客户端线程与异步调用的实现分析

1. 客户端线程分布与初始化

TARS客户端的线程分布主要由以下几个部分组成:

1.1 线程总体分布

客户端线程主要分为主线程和次要线程两大类:

  • 主线程(main线程):负责初始化客户端代理,并管理客户端的逻辑流程。
  • 次要线程:用于处理网络通信、异步回调等任务。

这些线程通过一些同步机制(如互斥锁)互相协调,确保资源的安全使用。


2. 线程与源码分析

2.1 从调用流程看线程分布

通过分析stringToProxygetServantProxyinitialize等函数的实现,可以清晰看到线程分配的逻辑:

  • stringToProxy:负责获取服务代理,并将请求打包发送到服务器。
  • getServantProxy:根据配置信息获取服务代理,负责初始化相关资源。
  • initialize:启动客户端的网络线程和异步处理线程。

2.2 getStatReport()与createPropertyReport

getStatReport()createPropertyReport虽然看起来会生成线程,但实际上它们会返回一个空结果,不会真正生成新的线程。这个机制专注于数据统计和性能分析,而不是线程管理。


2.3 _communicatorEpoll[i] -> start()

_communicatorEpoll[i]的启动涉及到两个主要步骤:

  • 初始化ServantProxyFactory,创建对应的CommunicatorEpoll实例。
  • 启动异步回调处理线程。

  • 2.4 Synchronization Call 的线程模型

    同步调用模型采用阻塞式的线程模型:

  • 调用tars_invoke,生成请求包并发送到服务器。
  • 等待服务器的响应,通过条件变量或队列机制保完整性。

  • 3 客户端异步调用的实现

    3.1 异步回调的处理流程

    异步调用通过以下步骤完成:

  • 调用tars_invoke_async,生成请求包并发送到服务器。
  • 等待服务器的响应,通过异步回调处理线程执行用户定义的 回调函数。

  • 3.2 分段处理与跨线程通信

    避免长时间占用单线程通过分段处理和异步通信实现:

    • 请求信息推送至请求队列。
    • 响应信息通过异步回调处理线程进行处理。

    4 负载均衡与技术实现

    TARS的负载均衡策略分为两层:

  • 网络线程层:通过轮询选择不同的ObjectProxy(网络线程)。
  • 连接层:通过负载均衡算法选择不同的AdapterProxy

  • 5 性能优化与考虑因素

  • 线程数量:根据配置管理网络线程和异步线程数量。
  • 队列管理:通过固定大小的队列来限制并发请求。
  • 线程安全:通过锁机制确保线程安全。

  • 结语

    通过分析线程分配、同步与异步调用的实现,可看出TARS框架在客户端监控与处理上具备较高的灵活性和扩展性。其核心思想在于通过多层次的负载均衡和异步模型,为高并发场景提供了强大的支持能力。

    转载地址:http://ssqzk.baihongyu.com/

    你可能感兴趣的文章
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>