tarsdocs
  • Readme.md
  • CLA
  • LICENSE
  • 基础介绍
    • 简介
    • 基础概念
    • 基础通信协议 Tars
    • 统一通信协议 Tup
    • 开发模式介绍
    • 模板配置
    • 服务市场
    • 服务扩展
    • 框架版本说明
  • 开源版框架介绍
    • 开源版本部署
      • 部署总体介绍
      • Docker环境安装
      • Mysql安装
      • 框架源码部署(Linux/Mac)
      • 框架源码部署(Windows)
      • 框架Docker部署
      • 框架节点部署
      • 业务服务容器化
      • 框架K8SDocker 部署
      • 框架K8STARS 部署
      • 框架K8SFramework 部署(强烈推荐)
      • 框架更新及扩容
      • 调用链升级注意事项
      • TarsWeb-v3.0.3升级说明
    • 开源版管理平台
      • TarsWeb说明
      • web用户体系
      • web管理平台 API
  • 企业版本介绍
    • 企业版说明
    • 框架集群化机制
    • 框架单节点机制
    • 使用二进制包部署
    • 使用容器部署
    • 业务服务一主多备机制
    • 命令行控制终端
    • IP-LIST级联缓存机制
    • 多数据中心管理
    • 多网络支持
    • 第三方服务管理
    • 数据产生和管理机制
    • 密码重置
    • TarsPython介绍
  • 框架关键特性
    • 业务配置
    • 服务监控
    • 无损发布/重启
    • 调用链
    • IDC分组
    • 鉴权功能
  • TarsCPP
    • 编译
    • 快速开发入门
    • 使用指南
    • 开发规范
    • 服务线程说明文档
    • protobuf 协议支持文档
    • 第三方协议支持
    • HTTP1 支持
    • HTTP2 支持
    • TLS 通信支持
    • Push 功能说明
    • PushCallback 功能说明
    • Cookie 支持
    • 队列模式
    • 手动绑定
    • 性能数据
    • 2.x 版本变化
    • 3.x 版本变化
    • 协程版本说明
    • 基础类库说明
    • [案例]
      • 框架快速入门
      • Http 服务示例
  • TarsJava
    • 快速开始
    • 快速开发入门
    • [使用指南]
      • Tars 服务开发与上线
      • HTTP 服务开发与上线
      • 生成接口调用文件
    • [性能测试]
      • tars java 压测代码
  • TarsGo
    • 基本介绍
    • 快速开始
    • 使用指南
    • cmake 管理代码
    • pb2tarsgo
    • 性能数据
    • 使用示例
  • TarsPHP
    • 搭建 php 环境
    • 快速开发入门
    • [快速起步]
      • 搭建 HttpServer
      • 搭建 TimerServer
      • 搭建 TcpServer
      • 搭建 WebSocketServer
      • 弹幕活动实战
    • [框架简介]
      • 简介
      • tars-server
      • tars-client
      • tars-config
      • tars-deploy
      • tars-extension
      • tars-log
      • tars-monitor
      • tars-registry
      • tars-report
      • tars-utils
      • tars2php
    • [高阶应用]
      • PHP 的 Swoole 框架如何接入 Tars
      • 与 thinkphp 结合使用
      • 与 Swoft 结合使用
      • 与 Laravel 结合使用
      • 与 Yii2 结合使用
      • 持续集成方案
    • [其他]
      • 常见问题
      • 如何 Debug
      • changelog
      • 其他外部文档
  • Tars.js
    • 基本介绍
    • 脚手架
    • 快速开发入门
    • @tars/stream
    • @tars/rpc
    • @tars/logs
    • @tars/config
    • @tars/monitor
    • @tars/notify
    • @tars/utils
    • @tars/dyeing
    • @tars/node-agent
    • @tars/winston-tars
    • tars2node
  • K8SFramework
    • [安装和使用说明]
      • 介绍
      • 特性
      • 安装
      • 升级
      • 云原生运维
      • 管理平台
      • 证书
    • [开发环境构建]
      • Dockerfile 说明
      • 服务发布流程说明
      • 制作基础编译镜像
      • 制作业务服务镜像
      • 制作 Helm 包
      • 发布业务镜像到 K8S 集群
      • 服务发布示例
      • 如何调试业务服务
  • 服务扩展
    • 云告警
    • 接口及压测工具
    • 网关服务
    • dcache缓存服务
    • 发送邮件服务
    • 一致性存储服务
    • 一致性存储web管理平台
    • 唯一计数服务
  • 常见问题
    • 安装常见问题
    • Issues
    • Issues-tarscpp
    • Issues-tarsjava
    • Issues-tarsgo
    • Issues-tarsphp
  • 开源合作
    • TarsFramework 项目 Git 合作规范
  • 直播视频
    • B 站 TARS 培训系列课程
  • 相关文章
    • TARS 技术文章
  • 其它资源分享
    • 下载
    • Tars 介绍.pptx
    • TarsPHP 解密.pdf
    • TarsJava 本地调试.pdf
    • 微服务在腾讯的业务实践.pptx
Powered by GitBook
On this page
  • 网络层说明
  • 协程说明
  • 服务模型说明
  • 关于协程网络的混合调度问题

Was this helpful?

  1. TarsCPP

3.x 版本变化

3.x版本是tarscpp在底层, 尤其是网络层做的一次重大版本升级, 重点支持了以下特性:

  • 框架中网络层, 统一使用: TC_Transceiver, TC_Transceiver接口层面使用回调机制且默认支持ssl, 和tc_epoller配合, 可以快速开发任何网络模型

  • 协程处理提炼到公共类中, 可以参考文件: tc_coroutine.h

  • tc_epoller完善接口, 网络和协程调度都通过tc_epoller统一调度

  • 服务模型变更为4四种模型

  • tc_http_async支持了ssl

  • 支持了无损发布

网络层说明

  • TC_Transceiver: 3.x版本在网络层做了完整的统一, 客户端和服务端的网络收发都通过统一的类处理了: TC_Transceiver, 具体可以参考TC_Transceiver的头文件说明

  • TC_Epoller: 完善了TC_Epoller的处理机制, 说明如下:

  • TC_Epoller本身继承于TC_TimerBase, 因此它本身也是一个定时器, 但是定时任务的执行都在epoller的loop循环中

  • TC_Epoller事件回调改成了注册监听回调机制, 通过子类EpollInfo类来注册事件的回调

  • 协程调度底层也是通过TC_Epoller来实现, 这样保证了协程/网络能统一调度, 这个是3.x版本最大的设计变更!!!

协程说明

  • 协程类统一提炼到公共库中(tc_coroutine.h), 代码中涉及到协程的类主要以下几个:

  • TC_CoroutineInfo, 协程信息类, 正常情况下业务代码不需要感知该对象

  • TC_Coroutine, 协程类, 继承于线程类(TC_Thread), 用来给业务快速使用协程, 这个类主要在一个线程中启动一批协程

  • TC_CoroutineScheduler, 协程调度器类, 负责管理和调度协程, 本质上就是管理和调度TC_CoroutineInfo

  • 如果希望自己创建和调度协程, 需要重点理解TC_CoroutineScheduler

  • 每个线程都有唯一的TC_CoroutineScheduler, 可以通过: TC_CoroutineScheduler::create/scheduler获取掉调度器, 从而自己控制协程创建等逻辑

  • TC_Thread, 线程类增加了协程的支持

  • 使用它的startCoroutine方法启动以后, TC_Thread::run则在协程运行

  • 可以run中使用TC_CoroutineScheduler来自己实现协程的创建等逻辑

  • TC_CoroutineQueue, 用于跨线程的协程的数据交互, 队列没有数据时, 协程会阻塞在epoller上, 当有网络事件或者其他协程调度时会被唤醒处理其他事件!

服务模型说明

由于框架底层支持了协程, 因此服务模型也做了变更, 支持更多的服务模型, 目的是充分利用协程, 同时协程模型的优点时能降低延时. 四种服务模型说明如下:

  • NET_THREAD_QUEUE_HANDLES_THREAD 独立网路线程 + 独立handle线程: 网络线程负责收发包, 通过队列唤醒handle线程中处理, 这个和老版本是一样的服务模型

  • NET_THREAD_QUEUE_HANDLES_CO 独立网路线程 + 独立handle线程: 网络线程负责收发包, 通过队列唤醒handle线程中处理, handle线程中启动协程处理, 这个模型和老版本中启用协程后的模型相同

  • NET_THREAD_MERGE_HANDLES_THREAD 合并网路线程 + handle线程(线程个数以业务线程配置为准, 网络线程配置无效): 连接分配到不同线程中处理(如果是UDP, 则网络线程竞争接收包), 这种模式下延时最小, 相当于每个包的收发以及业务处理都在一个线程中

  • NET_THREAD_MERGE_HANDLES_CO 合并网路线程 + handle线程(线程个数以处理线程配置为准, 网络线程配置无效): 连接分配到不同线程中处理(如果是UDP, 则网络线程竞争接收包), 每个包会启动协程来处理

关于协程网络的混合调度问题

3.x版本一个重大的改进就是将协程的调度阻塞在epoller上, 通过唤醒epoller来完成协程的调度, 这个逻辑和网络层的事件唤醒保持了一致, 这样做得好处是网络收发等事件可以和协程事件混合在一起调度.

这样最直接的影响是: 客户端网络线程可以和服务端的处理线程混合在同一个线程中处理, 在3.x的rpc调用过程中, 如果服务模型是: NET_THREAD_QUEUE_HANDLES_CO or NET_THREAD_MERGE_HANDLES_CO情况下, 服务端收到网络请求后, 发起rpc到rpc回调, 都在同一个服务端的逻辑线程中处理的, 从而大幅度减小了线程切换, 降低了rpc的延时!

Previous2.x 版本变化Next协程版本说明

Last updated 3 years ago

Was this helpful?