好文分享 — PayPal 如何只用 8 台 VM 就能每天處理 10 億筆交易?
“How did PayPal handle a billion daily transactions with eight virtual machines?” 1 文介紹讓 PayPal 能夠高效率處理 10 億筆交易的大功臣— Actor Model 。
文章一開始介紹 PayPal 早期怎麼處理持續增長的交易需求,其實跟大家直覺會想到的做法雷同,主要就是改善硬體效能、增加伺服器等做法。
不過隨著伺服器規模超過 1,000 時,帶來不少新的問題,包含網路架構複雜、管理難度上升、資源利用率下降造成浪費等等(大家也可以思考要部署 1,000 台伺服器要怎麼做到短時間、高可靠性等要求,肯定需要投注不少心力)。
所以 PayPal 最後轉往使用 Actor Model (基於 Akka framework)。
Actor Model 有別與常見的程式碼架構,它有幾個特點:
- 把不同的功能拆成多個 Actors
- Actor 有自己獨有的狀態(state),只有 Actor 能夠自己存取、管理,其他 Actors 都無法存取,很大程度避免 side effect 的產生
- Actors 之間透過先進先出(FIFO)的訊息傳遞進行溝通,因此不需要使用 shared memory, lock 等機制,從而增加 concurrency 運算的效率,通常都會用名稱 mailbox 作為儲存訊息的 queue (message queue 的角色)
- Actor 不是 Thread, 也不是 Process, 而是單純的 object, 因此資源使用又比起使用 Thread 或者 Process 來得更少
- Actor 會指派給 Thread 執行,所以可以建立超多 Actors, 並指派給少數 Threads 執行,如果要增加效能可以單單升級 CPU 增加可執行的 Threads 數量達成
Actor Model 相當適合用 Golang 實作,因為 goroutine 的設計就很像 Actor Model 中的 Actor, goroutine 實際運作就是可以建立多個 goroutine 並分配給 Threads 進行執行,而 goroutine 之間的溝通則是透過 channel, 因此在文章最後也展示用 Golang 寫的 Actor Model 的簡單範例,蠻值得閱讀的。
“How did PayPal handle a billion daily transactions with eight virtual machines?”