2020年11月22日 星期日

[雲端服務] 被ban ip又沒有穩定的proxy server怎麼辦? 用Azure Function自己架個代理伺服器吧

由於自己之前做的掃雷網會用到YAHOO財經API, 而YAHOO財經API是有限制的, 只要你一分鐘內打太多request, 就會被ban ip大概幾分鐘左右。 由於這個限制, 所以如果我想從YAHOO拿到所有美股的資料的話, 扣掉市值跟成交量太小的個股至少也要花一個多禮拜才有辦法拿到所有資料。

要解決這個問題, 一個就是買YAHOO財經的付費數據源, 不過那個夭壽貴也用不到那麼多功能, 所以不考慮; 而第二種解決辦法就是看有沒有辦法生多個IP, 或是找proxy server的免費或付費服務。 基本上要多個IP就是得花錢多辦網路, 而免費的proxy服務又不穩定且常常失效, 付費的proxy也不確定是不是能符合要求不踩雷...。

想了些方案後忽然想到, 現在市面上的雲端服務都有一定額度的免費用量, 應該可以有辦法在不花錢的情況下解決這問題吧!! 基本上先不考慮要錢的VM, 以Azure來說可以選的就是Azure App Service以及Azure Function了。

以下是Azure web app以及Azure function的免費層價位:

Azure App Service(免費層最多10個app): 


Azure Function:


以上述兩種服務來說, Azure App Service最多可以開10個代表我最多可以拿到10組IP, 而Azure Function沒有個數限制, 代表我可以拿到的IP數沒有限制, 用Azure App Service的話只要每天超過1小時CPU用量當天就會不給連了, 而Azure Function則是要小心不要超過一百萬次 * 資源取用量。

再來就是POC了, 下面我寫了簡單的proxy轉發程式, 然後一次部署了五台Azure Function的服務, 分別開在不同的地區:



再來開個服務同時建五個async task往這五個proxy server打, 在用這些資料生成各美股的掃雷報表, 下圖是其中一個Azure Function的資源使用量:


沒想到資源的使用量比我想的大得多, 畢竟每生成一個報表都要打十幾個request, 稍微來換算一下, 一個小時我的執行次數就有2360次, 資源用量則是94.7M, 假設我繼續這樣不眠不休全力運轉打下去, 一個月的總用量:

-----

執行次數: 2360 * 24 * 30 = 1699200次

資源用量: 94.7M * 24 * 30 / 1024 = 68.69 GB-s

再加上我一次開五台, 所以總共是:

執行次數: 1699200 * 5 = 8496000次

資源用量: 68.69 * 5 = 343.45 GB-s

-----

資源用量離40萬GB-s還差得遠, 可是執行次數已經超過免費額度了, 所以一個月的費用為:
 (8496000- 1000000免費額度) / 1000000 * 6.011 = 45.05 台幣。

可以看見, 因為執行的都是I/O bound的工作, 所以用不到什記憶體, 可是執行次數還是閃不掉的, 不過不要整天 + 開多個服務去打request的話, 要用到一百萬次執行其實也蠻難的。不過這做法最讚的是, 我如果分散流量打得更開, 我要有多少IP就有多少IP, 根本就是Unlimited IP Works了!!


至於呼叫次數太多的問題, 我目前是打算在開個Azure Function的服務, 不過我這次會把生成掃雷報表的後端程式直接放上去, 這樣執行次數應該可以變成1/10以下, 相對的資源用量則會上漲許多, 不過看了上面的計算結果, I/O bound的工作資源用量要爆應該很難, 試試看就知道了XD

沒有留言:

張貼留言