這邊寫下目前經歷過的 "真" microservice 的設計思路
我們先看一下舊的環境或狀況,假設一個 blog system 為範例,user 需要 login 的狀況,然後每篇 blog 支援 comment,還要記錄每篇的瀏覽量
- 不管 DB auth 或 OAuth2 甚至 PKCE,最終發出一個亂碼的 session_id 到 cookie 去
- user request 拿該 session_id 來對照 DB / Redis 進行登入換得 user_id,確認後得知已登入
- login 後 server return user info 丟到 web site 的 top bar 去
- user create 一篇 blog,DB 用 auto increment primary key 來做 pkey 然後 INSERT
- another user 使用 pkey 來回覆 comment
- 每篇 blog 有人 get 時下一個 redis incrby 的指令
這份目前有點問題,下面是疑問的部分
- frontend / app 需要戳 server 才知道該 session_id 是否過期,且 DB / Redis 才有這把 session_id 與 user_id 之間的對照
- 需要 login 後才能得到 user info 即使每次都是一樣的
- blog 本身 pkey 會連號
- 每次 read 都會需要 trigger write!?
- 把 session_id 改為 JWT 並把部分 info 丟到 JWT 內去
- 前端可以弄個 JWT reader 就能知道是否 expired 不用戳 server 才知道
- user basic info 在 JWT 內有,類似 name & avatar 不用戳 server 才知道
- pkey 從 int 改為 rand UUID(包含 user_id)
- table(data) relation 重點是 relation 而非 pkey 的 format
- 不用 auto increment 不會有 global effect 所以 INSERT 會變快且平行處理
- 不用管連號的問題,而你也不該用 pkey 當作 sorting / ordering 的依據,用別的 column 會更好些,類似 nano sec timestamp (NOW) 也行
- 瀏覽量使用 background job 來執行,建立類似 5 sec 一次的 batch update
- 也可以用 logger parsing 的方式完成,如果有專用 logger server 的話
- 任何東西 batch update (batch INSERT) 永遠是最快的,包括 redis 的 mset 系列
- 大幅減少 latency 且保持回應的最高速
- 這樣的 logger / tracer 才不會影響到正常流程的速度