任播(anycast)
/ ANY-cast /
想像一支到處都一樣的求助專線——1-800-HELP——但你的來電會被自動轉接到離你最近的客服中心。你撥同一個號碼;由電話網路決定哪個實體據點接聽。任播就是把這個想法用在 IP 位址上:同一個 IP 位址同時從許多地點被宣告,由網際網路自身的路由把每個封包送到最近的副本。多台實體伺服器共用單一位址,而你連到的是網路上最近的那一台。
一個位址怎能同時存在於許多地方?靠路由讓它行得通。每個執行任播服務的地點,都把相同的 IP 前綴宣告進網際網路路由(透過 BGP)。每台路由器依其正常的最佳路徑邏輯,最後都會把目的為該位址的封包,轉送往拓樸上最近的那個宣告。於是使用者的封包被引導到最近的實例,而使用者或其軟體什麼特別的事都不必做——這個位址外觀像單播(一個目的地),卻會落到許多相同節點之一。若某個據點故障並撤回它的宣告,路由就乾脆把流量導向次近的據點,帶來內建的韌性。
為什麼重要:任播是 CDN(或 DNS 服務)把你送到附近邊緣的兩種主要方式之一——另一種是以 DNS 為基礎的重導向。任播又快又自動,且在中斷期間能自我修復,這正是它支撐 DNS 根伺服器與大型公共解析器的原因。它誠實的限制:它依「網路距離」而非必然依地理距離或當前負載來路由,且它對無狀態或短促的請求-回應流量(像 DNS)最自然,因為若路由在連線進行中改變,一個長壽連線偶爾可能被重導向到不同節點——這是工程師會小心設計繞開的問題。
一個公共 DNS 解析器在 1.1.1.1 回應。那單一位址從數百座城市被宣告;拉哥斯的使用者與利馬的使用者都查詢 1.1.1.1,卻各自由幾毫秒外的一台伺服器回應,這要歸功於任播路由。
一個位址、多個節點:路由替你挑出最近的副本。
任播是依路由度量挑最近的節點,而非依「誰負載最輕」或「實際上最近多少公里」。它也不是多播(一對多遞送):一個任播封包仍只送到「剛好一個」目的地——只是去到最近的那個宣告。