[軟體概念入門系列] 同步Synchronous與非同步Asynchronous

Brett Yu
Brett’s dev log
Published in
Nov 4, 2023

本節描述同步與非同步觀念與相關機制

同步 Synchronous

指程式執行時必須要等當下動作完成後才能執行下一個動作, 造成程式效率較低, 伺服器請求吞吐量降低且可能會阻塞執行緒

生活中的實例如: 到商店結帳時必須要等待櫃台人員清點金額無誤後才能離開

非同步 Asynchronous

指程式執行時若遇到需要長時間處理的動作, 在等待期間可以執行其他動作, 等待前一個動作處理完成後再接續後續的動作, 程式效率較高, 讓伺服器可以同時處理更多請求

生活中的實例如: 買便當時點完餐就可以先去買飲料, 等餐點準備完成後再回來拿便當

Async, Await

在Javascript, .Net, Kotlin及Swift中都有對應的Async, Await語法, 都是方便開發者可以較簡易的處理非同步程式的處理邏輯

Async關鍵字主要為標記此method/function為非同步方法, Await關鍵字則為標記在此等待非同步方法完成後才執行後續動作, 此期間執行緒可以處理其他的邏輯, 等到非同步方法實際完成後才回來進行後續動作

跨服務的非同步作業

如同Domain教育訓練中 Product & Wager下注與注單 提到的, 考慮到整個商業流程並不是所有動作都需要當下全部完成, 因此有些後續的流程會使用非同步的架構來處理以加快伺服器及資料庫同時可處理的請求吞吐量, 目前系統中常見的方式有以下

  • Api/Worker將待處理的資料寫入資料庫後, 由另外的Worker定期去處理
  • Api/Worker透過Redis List Queue的方式儲存資料, 由另外的Worker取得資料做後續的處理
  • Api/Worker透過Redis Publish的方式傳送資料, 由Subscribe的Worker做後續的處理
  • Api/Worker透過Kafka的方式傳送資料, 由Consume的Worker做後續的處理

--

--