前文,我们访问地址的时候服务端会输出类似trace信息。那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件

在demo里的调用原理是

EasySwooleEvent::30行,
initialize方法设置了链追踪器的,生成Token和链结束的回调
//调用链追踪器设置Token获取值为协程id
TrackerManager::getInstance()->setTokenGenerator(function (){
return \Swoole\Coroutine::getuid();
});
//每个链结束的时候,都会执行的回调
TrackerManager::getInstance()->setEndTrackerHook(function ($token,Tracker $tracker){
Logger::getInstance()->console((string)$tracker);
});
EasySwooleEvent::98行,在onRequest和afterRequest分别设置了属性和关闭最终链
public static function onRequest(Request $request, Response $response): bool
{
//为每个请求做标记
TrackerManager::getInstance()->getTracker()->addAttribute('workerId',ServerManager::getInstance()->getSwooleServer()->worker_id);
return true;
} public static function afterRequest(Request $request, Response $response): void
{
// TODO: Implement afterAction() method.
//因为在onRequest 中部分代码有埋点,比如UserModelOne,会产生追踪链,因此需要清理。
TrackerManager::getInstance()->closeTracker();
}  
App\HttpController\Api1::50行,调用了协程mysql连接池,然后通过Model对象访问数据库。
App\Model\User\UserModelOne::66行,
$caller = TrackerManager::getInstance()->getTracker()->addCaller('allUser',null,'DB');//创建TrackerCaller对象,这个对象会用debug_backtrace记录当前的执行文件和行数以及调用的名称启动参数等
$ret = $this->getDb()->get($this->table);
//endCall会将TrackerCaller对象设置结束状态和结束时间和结束的记录信息
$caller->endCall($caller::STATUS_SUCCESS,[
'sql'=>$this->getDb()->getLastQuery(),
]);

这样就连在一起就是,一开始EasySwooleEvent的init回调设置了TrackerManager的生成Token和关闭链路的回调。也就说明这个TrackerManager是全局期的,所以每次调用都应该去回收去关闭链路。注意为什么生成Token是用的协程id,是为了确保在进程中不会重复

这样当前的访问代码就能确定唯一的token,这样就不会因为并发访问导致链路串掉,比如A,B请求都被分配到同一个worker进程,如果A,B的token一致,那么这个链路就会混淆。Trace的原理也简单,就是通过addCaller和endCall来记录一个trace开始调用和结束调用的相关信息。

分析easyswoole3.0源码,Trace组件(四)的更多相关文章

  1. 分析easyswoole3.0源码,服务启动为例(二)

    以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...

  2. 分析easyswoole3.0源码,consoleTcpService(六)

    前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...

  3. 分析easyswoole3.0源码,协程连接池(五)

    连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去. es3demo里,有mysql的连接池. E ...

  4. 分析easyswoole3.0源码,体验es3(三)

    demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...

  5. 分析easyswoole3.0源码,服务启动为例(一)

    swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...

  6. AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization

    本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...

  7. solr&lucene3.6.0源码解析(四)

    本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...

  8. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  9. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

随机推荐

  1. app:processOfficalDebugResources报错的几种解决方法;

    Error:Execution failed for task ':app:processDebugResources'. 出现这个错误的同事,大多还会伴随的R文件的报错,对!是全部R文件都报错: 1 ...

  2. python-pytest学习

    一:pytest基于unittest之上的单元测试框架1.自动发现测试模块和测试方法:2.断言使用assert+表达式即可:3.可以设置会话级.模块级.类级.函数级的fixtures :数据准备+清理 ...

  3. [java,2017-06-12] myEclipse双击无法打开文件

    点击 Window---->Preferences---> General---> Editors ---> File Associations 选择Associated ed ...

  4. spring boot + easypoi两行代码excel导入导出

    easypoi封装了poi让我们能够非常简单的实现Excel导出,Excel模板导出,Excel导入,Word模板导出等,具体可见官网:http://www.afterturn.cn/. 我这边实现了 ...

  5. nodejs版 阿里云开放api签名算法

    阿里云 API 签名 github:https://github.com/liuyinglong/aliyun; npm :https://www.npmjs.com/package/aliyun-a ...

  6. 编译APR包报错 rm: cannot remove `libtoolT': No such file or directory

    centos 6  编译APR包报错 在当前apr 目录 : #Vi configure +31880  ,注释掉此行 再次编译即可.

  7. 新的blog站地址

    自己用Jekyll搭建了一个静态blog网站 以后的blog随笔就更新在:https:/blog.hudunsec.cn

  8. Lightgbm 随笔

    lightGBM LightGBM 是一个梯度 boosting 框架,使用基于学习算法的决策树.它可以说是分布式的,高效的,有以下优势: 更快的训练效率 低内存使用 更高的准确率 支持并行化学习 可 ...

  9. Python11

    os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os ...

  10. jedisCluster 报错: redis.clients.jedis.exceptions.JedisClusterException: No way to dispatch this command to Redis Cluster because keys have different slots.

    根本原因:jedisCluster不支持mget/mset等跨槽位的操作. 版本:2.9.0 解决办法,推荐更改redis的驱动修改为: lettuce lettuce 项目地址:https://gi ...