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
Last editor:undefined Update time:2024-09-26 13:40