我們曾在部落格類型這講討論過動態網站 vs 靜態網站,兩者最大的差異就在於「資料庫」:動態網站通常將文章以純粹文字的形式存入資料庫,而靜態網站則是先建置成 HTML、CSS 等檔案,不涉及資料庫的存取。
既然我們所挑選的 SSG(靜態網站產生器)這條技術路徑沒有資料庫,我們該怎麼儲存每篇文章的瀏覽量這個數字呢?總不可能每次瀏覽就重新建置一次吧!這樣不但成本高,也無法即時反應瀏覽量的增加。
那究竟該怎麼做?接下來我們就來詳細聊聊。
如果是在動態網站中實作,相對於靜態網站就簡單許多,因為我們不但能更靈活的控制網頁伺服器,更有專職的資料庫可以儲存這個統計數字。
所以只要在每次有人瀏覽網站的頁面時,將此頁面的計數器往上加,存到資料庫裡面即可。
*動態網站記錄瀏覽次數
但由於靜態網站沒有辦法控制網頁伺服器,也沒有資料庫,我們便沒有辦法透過既有的網頁伺服器來記錄文章瀏覽數。
不可避免的,仍然需要一個第三方的資料庫來儲存這個資訊了。
*第三方資料庫儲存文章瀏覽數
首先我們需要在 SSG 產生頁面時就預先指定好第三方資料庫的位置,例如使用 Google Analytics,其本質上就是一座資料庫,可以透過埋入追蹤碼,當頁面被瀏覽時通知 Google Analytics 來記錄新增的瀏覽數。
除了 Google Analytics 外,也能使用類似的服務,例如 Matomo、不蒜子(Busuanzi)等等,又或是自己硬架一台資料庫也不是不行。
使用 Matomo 的話,除了瀏覽數的記錄之外,也能做到我在 PRD 裡有列出的,算出熱門文章這個需求。但是缺點就是需要額外花錢使用他們的服務,如果想要自架的話,就得自己設定 PHP + MySQL,也是額外的成本。
而不蒜子(Busuanzi)則是一個相當容易入門的,且免費的第三方服務,如果只是很單純的要記錄瀏覽量,透過加上一段不蒜子的 Script 能夠達成。然而這是個公開服務,意味著雖然免費,卻不太穩定。
最後則要提到透過 Google Analytics 來取得瀏覽量,我曾在使用過 Hexo 的時候實作過這個功能,其最大優點就是對齊 Google Analytics 的瀏覽量,不需要自己處理計算問題,例如重複瀏覽該算幾次。
我們可以透過 Data API 從 Google Analytics 取得瀏覽量,但這是需要帶入一段 API Key 的,因此直接放在前端並不妥當,所以當時我在外面套了一層 AWS Lambda 來提供 Public API。
*Data API 方案示意圖
在選擇 Google Analytics 加上 AWS Lambda 時,兩者的共通點就是價格相當低。但所謂天下沒有白吃的午餐,要使用價格低廉的服務就勢必得付出一些代價。
在這個方案中的最大缺點就是效能蠻差的,更具體一點,是執行的速度很緩慢。透過 Google Analytics Data API 取得頁面瀏覽數在我的體感上就大致需要 1-3 秒;而 AWS Lambda 的效能則更差,最差的狀況之下,需要等待長達 10 秒。
這是由於 Serverless 的特性,在長時間沒有使用的情況下,AWS Lambda 會把資源分配出去,所以在下次的 Request 時,API 會進入 Cold Start 的狀態,要等待資源被重新被取得,才能繼續「快速」的被使用。
簡單分析了不同的第三方服務,我其實最後挑了另一種方案:AWS Lambda + AWS DynamoDB,就是將 Google Analytics 的計算邏輯拉回來自己做了,主因是原方案速度實在有點慢,其次是自己使用資料庫就能自己組出熱門文章的搜尋 Query。