爬蟲那些事兒 任務排程系統設計

2021-08-04 15:28:12 字數 2077 閱讀 1438

前言

對於一家資訊**公司而言,爬蟲可以說是第一道,也是最重要的補給線與產品線。爬蟲聚焦於開發與維護各類網路資訊抓取工具,通過獲取到數量大、質量高的資料,為運營、演算法、大資料等各個部門提供資料支援,保證公司的業務良好執行,而排程則是許多抓取程式中比較重要的一環。

一 、任務排程系統設計的重要性

試想想如果一會一大堆種子要抓取,一會很長時間沒有任務這就導致,閒的時候機器是空閒的,忙的時候特別忙網路請求非常頻繁。

好的任務排程,能夠更有效的利用機器資源,達到負載均衡 ,同時提高抓取效率,也能保證資料的平均。

二、設計思路

圖2-1

圖2-2

圖2-3

此排程系統是慢慢迭代開發,如圖2-1,之前的話種子不是特別多,就通過linux crontab 指令0 */5 * * * sh /data/get_xpath/start.sh 去執行,這樣的話無法做到去區分種子,隨著種子資料變多,這種機制完全不符合需求了。後來就採取區別對待如圖2-2,就是多個 crontab 多個程式分別排程不同週期的程式。這樣的解決方法也真是easy啊,當然還可以用另外一種方式進行處理,利用並發包中的executors.newscheduledthreadpool(1);方式,執行多個schedulewithfixeddelay方法去實現:**如下,

private  scheduledexecutorservice scheduexec = executors.newscheduledthreadpool(1);

mytask fifteenminutask = new mytask(60*15);

scheduexec.schedulewithfixeddelay(fifteenminutask, 0, 15, timeunit.minutes);

mytask onehourtask = new mytask(60*60);

scheduexec.schedulewithfixeddelay(onehourtask, 0 , 1, timeunit.hours);

mytask fourhourtask = new mytask(60*60*4);

scheduexec.schedulewithfixeddelay(fourhourtask, 0, 4, timeunit.hours);

mytask twelvehourtask = new mytask(60*60*12);

scheduexec.schedulewithfixeddelay(twelvehourtask, 0, 12, timeunit.hours);

定義了四個任務排程方法,分別15分鐘,1小時,4小時和12小時排程一次~  

圖2-3是最終的排程實現方式,上面的方法不能滿足需求,乙個是經常性的對資料庫進行操作,操作效率不高,另外乙個就是想修改排程頻率還是需要重新修改**,也不能達到資料的平均化。最終形成圖2-3的模式,引入快取redis,通過定義乙個list佇列和hash儲存結構來滿足需要,可以把起想象成多個環。按抓取週期分布在這個週期的環裡,如

假設一組任務排程週期是10分鐘,讓這組資料平均分配到這600秒這個圓環上,然後不斷的輪詢這個圓 ,正常情況下就能保證相同週期的抓取任務能夠平均的推送到抓取系統中。

資料結構實現是不斷迴圈list,pop一條然後放到列尾,然後去hash去判斷是否應該推送:now() -last_push_time > = crawler_internal 當當前時間減去上一次推送時間就推送到抓取佇列中。

以上就是爬蟲中排程系統的實現方案,通過這種土辦法最終達到需求。~ 

《支付系統設計那些事兒》 初識賬戶

本文主要概覽 賬戶體系設計首先要區分兩個概念,支付賬戶和登入賬號,這是兩個不同業務領域的概念。支付賬戶 登入賬號 交易記錄,交易流水,賬戶流水,交易台賬,這三個容易混淆的概念,從資料上來說,卻並不複雜,它們的核心是交易流水。賬戶流水是從賬戶視角的交易流水 交易記錄將被用於風控和信用分析,能收集到的資...

系統呼叫的那些事兒

1.系統呼叫 我們知道,linux將整個虛擬位址空間劃分為兩部分 使用者空間和核心空間。並且規定,使用者空間不能直接訪問核心空間,而核心空間則可以訪問使用者空間。通過這樣的級別劃分,可以使得核心空間更加的穩定和安全。但是,當使用者程序必須訪問核心或使用某個核心函式時,就得使用系統呼叫 system ...

任務排程系統元件

前言 xxljob 和quzrts 比較 排程任務處理 xxljob quartz 的常見集群方案如下,通過在資料庫中配置定時器資訊,以資料庫悲觀鎖的方式達到同乙個任務始終只有乙個節點在執行 由個人開源的乙個輕量級分布式任務排程框架 主要分為 排程中心和執行器兩部分 排程中心在啟動初始化的時候,會預...