Bean Nuts Hazelnut Sauron Legion
C++部分重点总述

提示

由于C++版本和Java 技术大致相同,已阐述的不再重复阐述。

框架架构

爬虫框架:

其中主要设计接口:
Heist: “抢劫任务” 一个具体的任务类,任务管理器
Crew: “队员”,顶级抽象接口,主要是爬虫的执行者,一个具有线程,模板模式、责任链模式、策略模式, C++下顶级接口为Reaver, 使用枚举变量区分。
Stalker:“潜伏者/追猎者”,继承Crew,用于分析网站的索引,一般为单线程任务,也可以多线程,用于得到索引表
Reaver:“掠夺者”,继承Crew,用于下载和缓存页面
Embezzler:“挪用者/洗钱者”,继承Crew,用于分析网站的缓存页面,进行数据清洗、建模、最终写入数据库

异步调用调度系统(消息转发与统一调度):


PHP、Spring风格的控制器

任务分配

等额分配(分治法)

void TaskThreadDispatcher::allocate() {
    this->mMuxDispatch.lock();

    //this->mnMaximumAllocate = this->mnSumTasks / this->mnEachTasksPerThread + 1;
    size_t nAllocations = this->mnMaximumThread - this->mnCurrentTheadSum;
    size_t nDet         = this->mnMaximumAllocate - this->mnCurrEpoch;
    if( nDet < nAllocations ){
        nAllocations = nDet;
    }

    //mutexBootQueueSynchronized.lock();
    for ( size_t i = 0; i < nAllocations; ++i ) {
        ++this->mnCurrentTheadSum;
        size_t nF = this->evalNextRange( (this->mnCurrEpoch - 1) * this->mnEachTasksPerThread ) + this->mnStepTask;
        size_t nT = this->evalNextRange( this->mnCurrEpoch * this->mnEachTasksPerThread ) + this->mnStepTask;

        Task* lpTask = new Task { this->mnCurrEpoch, nF, nT, nullptr };
        std::thread* lpNeoThread = new std::thread( [&]{
            this->mMuxPool.lock();
            lpTask->mpThread = lpNeoThread;
            this->mThreadPool[ std::this_thread::get_id() ] = lpTask; // 放入线程池
            this->mMuxPool.unlock();

            this->vitalizeThreadByRange( this->mnCurrEpoch, nF, nT );
        } );
        lpNeoThread->detach();

        ++this->mnCurrEpoch;
        std::this_thread::sleep_for( std::chrono::milliseconds(100) );
    }

    this->afterThreadAllocated();

    this->mMuxDispatch.unlock();
}

等额分配(伙伴分治法)

网络、集群通信


C++ 服务器实现服务注册

WolfMC (Pinecone Hydra套件)

Medium(媒介接口)、Receiver(接收器)、Messenger、Message等接口,实现任意消息源(如Socket、Channel、HTTP和RabbitMQ等)的异步接收、统一异步消息执行(类似Spring[doDispatch])


RabbitMQ的封装

UMCProtocol (Pinecone Hydra套件)

一种统一的二进制控制协议,C++和JAVA独立实现,都有相应驱动,类似HTTP协议,但是高度简化以节约不必要的处理,目前支持PUT、POST操作。主要结构如下:

/**
 * **********************************************************
 * UlfUMC Message Struct:
 * const char* lpszSignature
 * byteEnum    method
 * uint32      nExtraHeadLength
 * uint64      nBodyLength
 * Atom*       lpjoExtraHead // JSON5 String / JSONObject
 * Stream      bodyStream
 * **********************************************************
 * UlfUMC/1.1 0xFF0xFFFFFFFF0xFFFFFFFFFFFFFFFF{Key:"Val"...}
 * **********************************************************
 * UlfUMC/1.1 0xFF0xFFFFFFFF0xFFFFFFFFFFFFFFFF{Key:"Val"...}
 * MsgBody
 * **********************************************************
 */

struct _PINE_API_OUT UMCHead {
public:
    static const char* DefaultSignature       ;
    static size_t      DefaultSignatureLength ;

public:
    const char* lpszSignature     ;
    size_t      nSignatureLength  ;
    UMCMethod   method            ;
    uint32      nExtraHeadLength  = 2;
    uint64      nBodyLength       = 0;
    String      szExtraHeadString ;
    Atom*       lpjoExtraHead     = nullptr;


通过该协议实现统一的消息控制,完全抽象,忽略具体信源,实现统一调度。

统一配置服务器(Master节点负责配置文件的渲染、重写、变量控制和调度,基于Almond DragonEL模板解释器)

支持模板化配置项和渲染。

支持配置项的继承、重写操作

支持配置项的变量操作

Author:undefined  Create time:2023-07-29 00:56
Last editor:undefined  Update time:2024-09-26 13:40