Leon's Blogging

Coding blogging for hackers.

淺談 Backend 課程筆記 3

| Comments

課程筆記3

理想的 Backend 系統

越少模組越好

  • 需要監控和管理的模組變越少
  • 團隊要掌握的語言/技術變越少

通用 vs 專精

ex : 是否使用ElasticSearch?

  • 需要 tokenization 嗎?(和民居食屋,若打民居是否要顯示出來?)
  • 能不能先在 RDBMS 做 search?

安全 vs 快速開發

ex : 應該把呼叫 GCM 放到獨立的 worker?

  • 多一個 worker,多一個 worker 要管,也要建立 MQ server

沒有 Single Point of Failure

所謂「SPOF」是指當某個零件故障會造成整個系統無法正當運作,那麼這個零件就是整個系統中 的 Single Points Of Failure。

  • 每一系統模組(System Component),都應該要有 standby instance (備用實例)
    • 但 standby instance 只能保護單一隨機性的災難
  • 一旦監控系統發現某一模組當掉,就把它停掉,並用 standby instance 取代
  • 一旦某模組當掉,你的設計應該讓系統停在 Consistent 狀態
    • 除非為了效能,而故意犧牲 Consistency

/ping/ 回傳的是 204 無法發現有什麼問題,正確是回傳 200

對 Surge 有抵抗性

  • 動態加開 AS 會有幫助,但加開的速度不一定能追上流量
  • READ 可以用 Cache 支撐,但 Write 不行
  • 吃大量資源的 end point 可以考慮轉用 async 模式
  • 別再 AS 上執行 async API 的工作,會害 AS 當掉

不需要即時人員支援

  • 停用 Load Balancer 下,一台 AS 當掉便自動停用,只讓系統損失 1/n 的運算能力
  • 監察系統發現 Master RDBMS 當掉後,應該懂得自動把 Slave DB 提升成 Master 並進行運算
  • 交給 Job Farm 的工作,在本來的 Worker Instance 當掉後,會自動由其他 Worker 重做

Backend 架構

DNS

  • 對大型網站,會有多個 data center 的,DNS 會回答該地區最近的 data center 的 IP
  • 對大型網站,一個 domain name 可能對應多個 IP
    • 單一 load balancer 有其物理極限的(頻寬/CPU),因此要多個 load balancer

Load Balancer

  • 通常 LB 會把 HTTPS 轉成 HTTP ,然後才把 Request 轉給 AS
  • 高階的 LB 能根據 url(甚至是 Request body) 做 routing
    • AWS 沒有(陽春的LoadBalance),HAproxy 有,所以可以在 EC2 上架 HAproxy,就能依 url、request body 做 routing,但是AWS ELB的網路流量比EC2好很多
  • AS 架構沒問題的話,round robin (輪詢) 跟 least conn (最少連線數) 沒什麼差別
  • 如果 AS 不是 Stateless
    • source 只能在非流動用戶上(手機ip會改)
    • sticky 需要 LB 解讀 Request 並抽取像 SessionId 的變數,然後根據之前歷史派到特定 AS 上。對 LB 有極高性能要求。

Stateless(Client與Server的溝通不需依賴狀態,每一個 Request 必須包含所有需要的資訊,而不需依賴其他 Request 的狀態。)

參考文件:
Stateful與Stateless
SQL Server 負載平衡架構介紹(Load Balancing)

Application Server

  • 好的 AS 應該是 Stateless
    • 這樣可以是流量加開 AS
    • LB 便不用昂貴的 sticky mode 了
  • AS中 ,不應跑會吃大量資源的工作
    • LB才能使用 round robin / random 模式
    • AS 才不會凍結掉

Long Polling Server (LPS)

  • 如果要將 message 推送到手機,請使用 GCM/APNS ,別自行架 Server
  • 除非系統流量很大,用 AS 來處理 Long Polling 變好
  • 使用獨立 LPS 的好處
    • 你能專精負責 long polling 語言
    • 不用擔心 AS execution worker pool 被用光

參考文件:
WebSocket 通訊協定簡介:比較 Polling、Long-Polling 與 Streaming 的運作原理

Main DB

  • 別輕易使用 noSQL (noSQL 沒有 transation)
  • RAID 只能保護單一 SSD 故障
  • Master/Slave Replication 保護不了壞人刪除數據
  • 只有離線儲存的備份數據,才真正安全
  • 效能,數據安全性,低成本 三者最多只能要兩種

Cache cluster

  • 對小型系統,單獨一台大記憶體的機器做 Caching 也許比較方便
  • 對大型系統,單獨一台機器做 Caching 不合成本效益,所以要用多台機器
  • 要知道物件放在哪台機器上,最簡單方法 MD5(key) mod n
  • 為 Cache cluster 增加/刪減機器時,小心別引發 total cache miss

Hot Data DB

  • 跟 cache 是不同的
  • 暫時性的,丟失了也死不了的數據
  • 在為了效能犧牲 Consistency 的情況下,要延後寫入 main DB 的數據
  • 一般來說 Hot Data 數據量不會太多,所以不需要 Clustering
  • 建議做 Replication 去保護資料

Search DB

  • 沒錢別額外架 Search DB
  • 數據儲存結構有特別為搜尋做特化
  • 有 tokenization 和 auto correction 等等幫助搜尋的重要功能
  • 很多時候 Search DB 的數據和 Main DB 的數據會有時間差

Report DB

  • 專門的 Report DB,很可能採用 denormalized schema
    • 需要高度專業性
    • 需要很多很多的錢
  • Random Sampling 是否能解決問題

File DB

  • 有人說 File 應該以 BLOB 物件被放到 Main DB,但是..
    • 一般建立後極少被改動
    • RDBMS 一般用上系統中最高級的 SSD,而 File 一般不需要這種效能
  • 延伸思考,在檔案名字中額外加上 MD5,能解決很多 File caching 問題

Message Queue

  • Message
    • 會裝有 Json/XML 格式的工作內容
    • 會有 MessageId
  • Producer
    • 訊息生產者,一般來說是 AS 要建立工作
    • 一個 Queue 能有多於一個 Producer
  • Consumer
    • 訊息消耗者,一般來說是 Worker 要執行工作
    • Queue 中沒有 Message 時,Consumer 會被 blocking,不佔用 CPU
    • 一個 Queue 能有多於一個 Consumer
    • 一份訊息,在同一時間內只會讓一個 Consumer 收到
  • 有些 MQ 不保證絕對性的 FIFO 和 no-duplicate,使用上請注意(ex:Amazon SQS)
  • 如果應用較簡單,Redia 某程度上也能當做 MQ 使用
  • 沒有人和 message 佔用 CPU 為 0,因為 worker 都被 blocked

Worker Farm

  • 一個 Message 同一時間只會一個 worker 收到
  • 可以視 Queue 中的剩餘 Message 量,動態決定增減 Worker Server

Cron job worker

  • 跟async task worker 有點不同,只在預定時間睡醒,把工作做完便死亡
  • 為了不要深夜撲火,應該在多於一台機器上執行
    • 為了一份工作不被多個 worker 執行,需要 execution control 機制
    • Database-as-IPC 是很嚴重的 anti-pattren,但如果有很少量的 data exchange 還算可以接受
  • 理想的 Cron job 即使當掉,也無需 data cleanup,單純重跑即可
  • 同時間多個 Worker 執行時,也懂的自動分工,不會出錯

簡報:
TritonHo/slides

Comments