Asynchronous Programming - 第四章:彼岸未歸的異步任務
textMessage在同步環境中強行等待非同步 Task 完成實驗篇結果分析summary
她在深夜寫了一段訊息,對著那個熟悉的對話框,輕輕按下「傳送」
網路似乎是卡住了,畫面顯示「正在傳送…」,她關上了手機,心想:「應該已經送出了吧。」
隔天,她等不到回應。那人說沒收到。
她打開訊息記錄,那串話仍顯示為「未送達」,就像訊息從未存在過
一個沒有被接收的訊息,不會自動變成世界的理解;一個沒有被等待的結果,也無法保證會如你所想地完成
在實務開發中,我們經常面臨一種情境:必須等待某個非同步任務完成,才能繼續執行接下來的邏輯。但如果我們當下的環境是同步方法(例如 Main() 或某些事件處理函式),該怎麼辦?
這時,許多開發者會選擇以下方式強行「同步化」等待
.Wait()
.Result
GetAwaiter().GetResult()
它們都會強迫等待 Task 結束,但錯誤處理機制卻有天壤之別,而這個差異,正是許多初學者第一次遇到的陷阱。以下,我們將模仿實驗,實際觀察其錯誤行為與影響,像是 .Wait() 和 .Result 不是把錯誤丟給你,而是「包一層再丟」,讓你更難看清真相 ...
CloudFront
CloudFront 就是 AWS 在全球各地設置了許多 Server,稱為 edge locations,這些 Server 可能存了網站的副本內容(如圖片、影片、網頁…等)。當使用者訪問網站時,他們會從最近的邊緣位置獲取內容,台灣雖然不是 AZ (Availability Zones) 但也設有 edge location!
幾個重要的名詞解釋Origin:
所有的原始文件(如圖片、影片、網頁等)都存放在這裡可以是 Amazon S3 存儲桶、EC2 伺服器,或者是由多台 EC2 伺服器組成的負載均衡系統
Edge Server:
這些就像是分布在世界各地的小型倉庫它們儲存源站內容的副本當用戶請求內容時,如果 Edge Server 有該內容,就直接提供如果沒有,就會向 Origin 請求,然後儲存並提供給用戶
Distribution:
這是 CDN 服務的入口點。就像是一個智能導航系統。當用戶訪問網站時,這個系統會自動將他們引導到最近的 Edge Server
Web Distribution:
這是專門為網站設計的分發類型。處理常見的網站文件,如圖片、CSS、JavaSc ...
Stripe (串接 ApplyPay 所需要知道的事)
最近在串接 Stripe 的 ApplePay,花了一段時間理解 Stripe 的付款流程,這邊整理一下 ApplePay Server side 這邊要知道的一些事情備忘
名詞解釋Platform Account : 平台帳戶,底下可能會有多個子帳戶Connected Account : 底下的子帳戶,就是你管理的商戶們
Direct Charge : Platform Account 與 Connected Account 是以 Standard 模式關聯在一起,客戶付款時,錢會直接流向 Connected Account,通常若商店選擇這種方式表示他們有能力處理與 Stripe 談到較好費率的能力,不需要電商平台處理
Destination Charge :
Direct charge 概念:
Direct chargen 所指的方面是在 Stripe Connect 平台中,最終用戶(客戶)直接與商家(關聯帳戶)進行交易的模式。
客戶感知:在這種模式下,客戶可能不知道有一個中間平台參與其中。他們認為自己是直接與商家交易。
收費歸屬:交易記錄會出現在商家的 Stripe 帳 ...
刷新之間,藏著多少重來與等待 - 網頁快取
清晨七點半🔹X-Cache 是「快取結果的回報」🔹Cache-Control 是「告訴瀏覽器要怎麼快取」❔ 資源 Cache 在哪裡🕒 Expires:設定「絕對時間」🕒 Cache-Control:設定「相對時間」🕒 🔹快取過期後怎麼辦清晨七點半,你手捧著一杯還冒著熱氣的黑咖啡,筆電剛開機,PChome 的首頁已經靜靜等著。今天,是傳說中的限量開搶日 —— PS5 Spider-Man 2 限定版主機,早上八點整正式開賣。明明一個月前,你才下定決心要戒掉電動,結果看到廣告那一瞬間,理智直接下線:「反正只是收藏,不一定要打開來玩。」這麼說服自己之後,還特地設了三個鬧鐘,把商品頁加進書籤,信用卡也提前擺在桌上待命。
滑鼠懸停在「重新整理」按鈕上,指尖微微冒汗,內心默唸著:「這不算破戒,這叫做支持正版!」
當秒針跳到 7:59:59,你一口氣按下刷新,畫面瞬間閃動。那張帥氣的限量主機圖,早已從最近的新竹 CDN Edge Server 快取而來,商品庫存與折扣倒數,則剛剛從台北資料中心即時更新,因為你的瀏覽器在快取過期後,發送了 If-Modified-Since 的精確詢問。 ...
Content Delivery Network(CDN)
在勤美綠園道上🍮 用布丁理解 CDN:就近提供內容👾 技術面看 CDN Cache 怎麼運作?CloudFront Distribution用 S3 + CloudFront 建立 CDN 快取CDN 的本質是什麼?適合的情境🔹頻寬🔹攻擊防範(DoS / DDoS)🤔 我的網站有需要使用 CDN 嗎?Serverless CDN 與邊緣計算(Edge Computing)在一個大熱天的午後,你走在勤美綠園道上,突然想吃點冰冰涼涼的甜點。你走了 3 分鐘,到附近的全家便利商店,打開冰櫃看到一盒寫著「東京限定布丁」的商品,決定嚐嚐這份來自職人之國的綿密滋味
等等 為什麼我在台中,卻能在便利商店買到「東京限定」的布丁?
如果是從日本工廠直寄過來,理論上要等上好幾天、還可能被海關卡住。但今天我們能即時吃到,是因為「全家便利商店」早就跟日本合作,把布丁大量送到全台分店的冷藏庫裡,你走路 3 分鐘就能買到!CDN 預先把內容(如圖片、影片、靜態網頁)複製到遍佈世界各地的節點,當使用者要存取網站時,就能從最近的節點取得資料,而不用跨越半個地球回到原始主機
📦 布丁=靜態資源🏪 ...
Array - Collection
Array(T[])是什麼?IEnumerable(IEnumerable)是什麼?為什麼 Enum.GetValues 回傳的是 Array(而且是非泛型)LINQ 不是「不能用在 Array」,是因為遇到「非泛型」問題選 Array 還是 IEnumerable選 Array 還是 IEnumerable當我們有一塊連續記憶體的資料結構(大小固定),就會有 Lengthf、values[i] 直接索引(O(1)),這是真正「已經全部在手上」的一批資料,適合需要高速索引、固定長度、確定要把資料一次放好的場景
它不是資料結構,它是「你可以被 foreach 一個個拿出來」的能力(介面),可能背後是 array / list / db query / 檔案讀取 / generator / yield return…,重點在於,它允許 deferred execution(延遲執行),也就是寫了 Select/Where 不代表立刻跑,是 foreach / ToList() / Count() 的那刻才真正開 ...
Cache - 從頭開始
Node🥥 第一階段:打造屬於自己的「最簡快取機制」🥥 關於 Thread-Safety🧠 鎖定ConcurrentDictionary🥥 過期機制🌟 總結村裡,有位小學徒 Yoyo,每天最常被叫去做的工作,就是幫村裡人查詢「住戶資料」。
「Yoyo,去問資料庫大師,這位用戶住哪裡?」「Yoyo,再去查一次,那筆我剛剛沒記住。」
一開始,Yoyo 也不以為意。畢竟這是學徒的日常
「欸,再去……」
可重複個幾百次後,他終於受不了了:「為什麼我每次查完,都要重跑一樣的路?而且連名字都懶得叫了內」,有天,他開始在口袋裡放一本小筆記本,把查過的資料寫在上面。從此以後,他只要看看自己的筆記本,就能直接回應問題,不必每次都跑一趟,這本小筆記本,就是 Yoyo 發明的「快取系統」
在這一階段,我們要實作一個最基礎、卻實用的快取系統
Lazy Load + Dictionary現在我們選擇兩樣工具
Dictionary 當作資料容器
一個 Func<T> 委派來延遲建立資料(Lazy Load)
實作規劃
元件
說明
Dictionary<string, ...
Host
ASP.NET Core 的誕生ASP.NET VS ASP.NET COREHostHost.CreateDefaultBuilderIHostEnvironmentIConfigurationGeneric Host 和 WebApplication Hosthost.Run / host.Start / 直接跑summary以前的 ASP.NET 只能跑在 Windows + IIS 的組合裡。換句話說,你想開發網站,就必須用 Windows Server,因為 ASP.NET 被「綁死」在那個環境。後來微軟想要讓它更自由,所以從頭開始重寫,這就是 ASP.NET Core 的誕生
它一開始用「ASP.NET vNext」這種暫時的名字登場,後來一度被叫做 ASP.NET 5,最後才定名為 ASP.NET Core。這裡的「Core」代表:
全新框架 → 不是 ASP.NET 4.x 的小改版,而是重頭設計。
精簡核心 → 把最必要的功能保留下來,刪掉複雜、不必要的包袱。
跨平台 → 不再侷限於 Windows,可以跑在 Linux、macOS,甚至容器(Docker)裡。
...
OAuth 2.0
OpenIDOAuthOAuth 2.0 (Open Authorization)為什麼中間會先回一個 Authorization Code,而且還暴露在 Url上資料分享summary讓我們想像一下,如果每次進入一個新的國家,都需要重新申請一個新的身份證會很麻煩,但這就是早期網路使用者的日常生活 —— 每個網站都需要一個新的帳號和密碼。於是,OpenID 的概念應運而生,它就像是網路世界的通用護照,為技術發展添加了人性化的一面
故事開始於 Blaine Cook 試圖在 Twitter 上實現 OpenID。這就像是試圖讓你的護照(OpenID)不僅能證明你的身份,還能授權別人代表你處理一些事務。但 Blaine 和他的朋友發現,OpenID 的核心價值,是讓「證明你是誰」這件事可以被重複使用,而不用每個系統都自己養一套帳密系統,而不是授權(允許別人做什麼)
使用者已經在某個可信任的地方有身分,例如一個 OpenID Provider(身分提供者),接著他嘗試登入另一個網站,這個網站不想自己管理帳密,而網站把「你是誰的驗證責任」交給 OpenID Provider,因此網站不碰你 ...
關於 host file ( Windows )
開始研究 host files 這東西的契機是,在看動畫瘋時一直被廣告煩得很不爽,然後就沒想說隨便 Google 看看有沒有什麼招,沒想到有人有一樣的想法而且還把心思動到 host file 上,覺得這個用法滿有意思的
host file網路就像一個巨大的城市,而每個網站都是這個城市中的一個建築物。在這個城市裡,每棟建築物都有一個獨特的地址(IP 地址)。但是,我們的頭腦無法記住地址,所以我們給每棟建築物起了名字(域名)。現在,想像你的電腦會幫你連接到你想去的建築物,有兩種方式來幫你找到正確的地址:
1.打電話給城市的訊息中心(DNS Server)詢問地址。2.查看一本特殊的私人電話簿(hosts 文件)。
hosts 文件的運作機制如下:
優先級:當你想訪問一個網站時,你的電腦首先會查看 hosts 文件(私人電話簿)。格式:hosts 文件中的每一行都像是電話簿中的一個條目,包含一個 IP 地址和對應的域名。覆蓋 DNS:如果 hosts 文件中有你要找的網站,電腦就會直接使用這個地址,而不會去詢問 DNS Server。
hosts 文件就像是一個可以自定義的、優先級很高的小型 ...









