over 3 years ago

https://github.com/ensky/Proxy.js/

前言

最近因為另外一份專案需要使用Crawler爬別人家的網站,而傳統proxy不太容易作到Connection pool,他們通常妳抓多快就用多快速度去抓,但因為我的Backend使用PHP,每次抓取是用不同的process去抓的,若沒有Connection pool很容易造成被抓取網站的困擾。

Related works

之前使用過Squid, TrafficServer和Varnish,其中Squid效能普普,使用記憶體頗多,而TrafficServer那時測試結果不太穩定(2012),之後就沒有使用,最後Varnish沒辦法用來做Forward proxy,因此打算自己寫一個

實做

採用Node.js當proxy server主體 + Redis用來存放LRU快取資訊以及當Memory cache,使用到的package大概主要是connect, request, http-proxy, redis等
主要邏輯就像我在github寫的一樣,做些前置動作之後就依序check memory, disk,若都不在則fetch, 最後存回cache中, 並更新LRU table

var main = function () {
    proxy.use(initialPass)
        .use(hitCheck('memory'))
        .use(hitCheck('disk'))
        .use(fetch)
        .use(saveCache('disk'))
        .use(saveCache('memory'));
    http.createServer(proxy).listen(conf.proxy.port);
};

LRU實做部份則使用HashMap和List實做。用List模擬Queue資料結構,重複的Item被插進去的時候會在HashMap中counter+=1,這樣就知道List中共有多少筆重複的Item,刪除的時候先做Counter --,若Counter != 0則不要刪掉他。

 
comments powered by Disqus