---
# System prepended metadata

title: Untitled

---

## 你最自豪的一個項目是什麼？

完成財訊的官方網站和內容管理後台([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/)
---
