分析easyswoole3.0源码,Trace组件(四)
前文,我们访问地址的时候服务端会输出类似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组件(四)的更多相关文章
- 分析easyswoole3.0源码,服务启动为例(二)
以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...
- 分析easyswoole3.0源码,consoleTcpService(六)
前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...
- 分析easyswoole3.0源码,协程连接池(五)
连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去. es3demo里,有mysql的连接池. E ...
- 分析easyswoole3.0源码,体验es3(三)
demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...
- 分析easyswoole3.0源码,服务启动为例(一)
swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...
- AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- solr&lucene3.6.0源码解析(四)
本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...
- AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
随机推荐
- Could not create local repository at /home/yizhenn/.m、IDEA倒入maven项目无法导报问题
问题描述: 用自己电脑新搭建环境,用idea倒入项目后发现无法倒入jar包,很少郁闷,折腾了很久,最终发现问题 settings文件中下面这个配置,需要是自己电脑的路径 <localReposi ...
- MySQL 设置cmd命令行登陆
1.MySQL自带工具的存放路径: D:\Program Files\MySQL\MySQL Server 5.6\bin 为了方便使用,我们可以将以上路径添加到系统的环境变量path中 如果你不放, ...
- oracle入坑日记<二>认识oracle(含sqlplus基础使用)
1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...
- nodejs版 阿里云开放api签名算法
阿里云 API 签名 github:https://github.com/liuyinglong/aliyun; npm :https://www.npmjs.com/package/aliyun-a ...
- django中forms和modelform组件的区别
首先,我们来看看modelform的实现 model.py class Book(models.Model): title=models.CharField(max_length=32) price= ...
- 学会使用box-sizing布局
盒子模型 关于CSS重要的一个概念就是CSS盒子模型.它控制着页面这些元素的高度和宽度.盒子模型多少会让人产生一些困惑,尤其当涉及到高度和宽度计算的时候.真正盒子的宽度(在页面呈现出来的宽度)和高度, ...
- redis的使用与 django的redis的使用
1. 使用redis数据库分为两种: 第一种是在python语言中直接使用的方式, 第二种就是在django中使用django_redis模块来数用 第一种直接在python语言中使用redis im ...
- Linux su命令
本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行, ...
- List 去重
private static List removeDuplicate(List list) { HashSet h = new HashSet(list); list.clear(); list.a ...
- P61 实践作业
网络攻防实验环境搭建 根据链接下载的实验工具包,将其解压 打开VM虚拟机,点击图中红色框,扫描虚拟机 选择文件所在位置 点击下一步,完成.即可 在VM虚拟机设置中把网络适配器修改为桥接模式.如下图 在 ...