## 你最自豪的一個項目是什麼? 完成財訊的官方網站和內容管理後台([https://v2.wealth.com.tw/](https://v2.wealth.com.tw/)),為後端的主要負責人、技術 PM ,但同時也有協助前端完成部分功能。在此專案探索和負責完成許多沒嘗試做過的工作內容,如第一次建置後端架構,選用相關技術套件、撰寫 graphQL 和 restful 的 api、完成第三方登入串接、協助完成內容編輯器的部分功能、匯出報表、熟悉 nginx/docker/gcp.......等。 --- ## 如果你來設計一個和Hacker News功能相仿的平台,需要容納百萬級的日活流量,你會如何設計後端,採用哪種語言和什麼樣的架構? 實際上沒有處理過高流量的經驗,但有研究過相關資料,可能思路上還是有謬誤,再請多多指教。 大致上會有以下處置: - 使用 cloudflare 方便將應用層協議設定為 http2/http3 - 因為日活流量大,盡可能的增加資料有 cache 的可能性 - 靜態頁面依賴於 Nextjs 去生成,讓頁面可以被 CDN cache - 採用 graphQL 作為前後端溝通的方式,除了自動產生文件方便外,也可以相較 restful 更容易做細緻的查詢,合併多次查詢或減少不必要的欄位查詢 - 受限於 graphQL 不易被 http cache 的特性,使用 automatic persisted queries 或使用 graphQL CDN 去解決這個問題 - 使用 Typescript/Nodejs 並搭配 apollo server 來建立 API 的服務。前後端使用語言一致可以制定一些共用的常數,也可以加快我開發的速度。但若有效能問題,會使用 Go 為後端主要語言,並採用 gqlgen 作為 graphql 的 server - 一些允許流失的資料(ex: 排行榜)的資料可以用 redis 處理 - 資料庫會有以下處置 - 採用關聯式的資料庫,方便做不同 table 間的 join - 依造需求讀 >> 寫,採用 Master Slave Replication 的架構,將讀寫分離,Master (1台)負責資料寫入,Slave(N台)提供資料檢索;將壓力分散到數台 Server 上 - 依據資料寫入的性質,可能需要做 vertical-scaling 或是 horizontal-scaling 或是 Partition Table - 將所有服務放到雲端(ex: GCP),並在之上設定 load balance, reverse proxy, 且流量一大時可以方便地做 auto scaling ,也可以將資料損毀的風險大幅降低 ### Ref - [System Design Cheatsheet](https://gist.github.com/vasanthk/485d1c25737e8e72759f) - [大型系統入門 — 架構篇](https://lukajojo.medium.com/%E9%87%91%E9%AD%9A%E8%85%A6%E5%BE%8C%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%B8%AB%E5%AF%AB%E7%9A%84%E5%A4%A7%E5%9E%8B%E7%B3%BB%E7%B5%B1%E5%85%A5%E9%96%80-329a0f51b51c) - [一個好的系統攻略本](https://mark-lin.com/tags/it-%E9%90%B5%E4%BA%BA%E8%B3%BD-2019/) ---