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

6 則留言:

  1. 大大您好,
    很喜歡您的網誌,
    個人覺得很實用。

    想請問一下那個"poc"是什麼意思?
    然後proxy轉發程式是指Azure app去呼叫Azure Function的爬蟲?

    以上
    非常感謝您的資訊,受益良多
    不是很清楚部署機器的概念
    勞煩您了

    回覆刪除
    回覆
    1. 您好, POC是概念性驗證的意思, 就是寫個小工具測試這想法是不是實際可行。

      proxy轉發程式指的就是我寫的Azure function, 我實作了reverse proxy在Azure function上, 之後部署到16個不同地區的Azure function上, 有請求都往那幾個Azure function打。

      至於呼叫那些reverse proxy的程式我也是用Azure function, 我先建立一個master的Azure function, 這個function開了16個執行緒往那些reverse proxy的Azure function打, 藉以取得Yahoo財經所有美股的即時資料, 之後再存到Azure cosmos DB, 這樣一個會自動更新DB資料的爬蟲程式就完成了。

      不過因為Azure function有執行時間的限制, 觸發後最多只能活10~30鐘, 這會導致我的master Azure function沒辦法一直存活, 這個問題的解決辦法我是用Freshping的服務, 讓他每五鐘都去觸發我的master Azure function去工作, 這樣的好處就是我有個免費 & 又可以一直存活的服務使用。 不過缺點則是這個服務很不穩定, 要寫各種error handling處理service不穩的問題。

      刪除
    2. 非常感謝大大這麼細心的講解,因為之前只有一小段時間使用過gcp,對於部署真的不太了解,這篇文章讓我有更多想法。

      如果用一台簡單的app engine每隔一段時間去觸發function,不曉得是不是能夠代替Freshping的方法?

      我趕緊來練習您剛剛提到的方法,再次謝謝您的用心

      刪除
    3. 您好, 只要能定期打https request不管是本機電腦還是雲端服務都可以, Freshping也只是定期幫你打http get request api做health monitor, 只不過我不是拿來做health monitor而是強迫azure function不要睡覺一直工作XD

      還有問題的話歡迎互相討論~

      刪除
  2. 大大您好,
    在搜尋架設proxy server時剛好看到您的文章
    因為想透過proxy玩日本的遊戲(有鎖ip)
    想問問用azure function在日本地區架設proxy server後
    再透過proxifier連線到proxy server
    不知道思路上正不正確XD?

    回覆刪除
    回覆
    1. 您好, 我目前只用Azure Function架設過reverse proxy, 一般的通用proxy我還沒研究能不能用Azure function實現(因為function entry point是固定的, 還有server certificate的問題, 不知道有沒有辦法實現tunnel..)。

      如果不行的話可能就得用雲端的web service或是直接開個VM虛擬機然後架設proxy server, 如果web service不是全天在運行, Azure app service免費層有60 CPU 分鐘數 / 天的扣打, 不要超標的話也是可以用Azure app service架個免費的proxy server, 如果要全天運行的話就算最省錢開VM虛擬機, 大概每個月也要300多塊, 這樣可能買現成的proxy服務還比較好用也說不定。

      刪除