• 分析easyswoole3.0源码,Trace组件(四)


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

    在demo里的调用原理是

    EasySwooleEvent::30行,
    initialize方法设置了链追踪器的,生成Token和链结束的回调
    //调用链追踪器设置Token获取值为协程id
            TrackerManager::getInstance()->setTokenGenerator(function (){
                return SwooleCoroutine::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();
        }  
    AppHttpControllerApi1::50行,调用了协程mysql连接池,然后通过Model对象访问数据库。
    AppModelUserUserModelOne::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开始调用和结束调用的相关信息。

  • 相关阅读:
    2016 多校赛3 A 水 B 期望,规律 C 各种博弈 J 物理题,积分 K 暴力,水
    2016 多校赛4 A dp,KMP E(待补) F(待补) J LIS变形,套路 K 水 L 水
    2016-12-27 spoj MINSUB 二分,单调栈 spoj INTSUB 思维
    sqlmap用户手册
    用PROXYCHAINS实现SSH全局代理
    linux之sort用法
    PHP 变量定义及使用
    查漏补缺
    总结2
    最近
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/9858204.html
Copyright © 2020-2023  润新知