連到別的箱子

link 讓一個箱子用呼叫端原本用的名字,呼叫你另一個箱子裡跑的服務:怎麼宣告、有哪些規則,以及另一個箱子在各種狀態下連線會得到什麼。

link 把一個箱子(B)裡的名字指到你另一個箱子(A)的某個 port,B 就能用呼叫端原本用的名字呼叫跑在 A 裡的服務。在 B 開箱時宣告在 services,或在 B 跑著的時候補上:

sandbox_start { "name": "web 接退款改版的 billing", "goal": "讓 web 前端接箱子 A 裡改版中的退款;在瀏覽器裡下的退款被那個 billing 記下來就算完成", "services": [{ "name": "billing.acme.internal", "port": 8080, "fromBox": "<箱子 A>", "fromPort": 8081 }] }
sandbox_wire  { "id": "<箱子 B>", "service": "billing.acme.internal", "port": 8080, "fromBox": "<箱子 A>", "fromPort": 8081 }
  • 之後 B 裡的 name:port 會連到 A 裡聽 fromPort 的程式,B 自己的程式與容器都一樣。fromPort 沒給時,用 A 裡同名服務的 targetPort,沒有同名服務就是 port。在 A 那邊,boxd 連的是 127.0.0.1:<fromPort>,所以那裡的程式要聽 0.0.0.0 或 127.0.0.1,或是把那個 port 發布出來的容器。

  • 規則:A 必須是同一個帳號的另一個箱子,而且還沒停掉(否則回 410 … link to a running box);名字必須是主機名,不能是位址或範圍;link 沒有 web 也沒有 targetPort;箱子不能 link 到自己;fromPort 不能是 80 或 9095;名字也不能同時是 B 的服務(… is already a service in this box; a link needs a name of its own)。

  • link 蓋過環境裡同一個 host:port 的位址:B 連到 A,不經你的網路,那個位址也從 B 的 environment.reachable 消失。

  • 帶 fromBox 的 sandbox_wire 回 { "links": [...] }。同一個 service 與 port 換一個 fromBox 或 fromPort 再呼叫一次,就是把 link 重新指過去,下一條連線就連到新的目標。link 會記在箱子上:出現在 sandbox_status.services(帶 fromBox 與 fromPort),boxd 重啟後也還在。

  • 在跑著的箱子上補的 link,會立刻接走同一個 host:port 的環境位址:新的連線連到 A,已經開著的連線照舊走原來的路,直到它關掉。在箱子上試過:補 link 之前名字連到連接器,sandbox_wire … fromBox 之後下一個請求就到了 A。之後才補的服務或版本,在有 take-over 功能的箱子上也會這樣接走環境位址,比較舊的箱子則留在連接器(接手 link 或環境位址)。

  • B 連過去時的結果看 A 當下的狀態:

    • 凍結:連線會把 A 解凍,帳號要有點數;A 約 20 秒內沒醒來的話,連線以 box … is still waking up from frozen; retry in a moment 失敗。
    • 有人接手中:照常可用。
    • 還在開機:409 link …: box … is still starting; retry once it is ready。
    • 已停掉或 interrupted:410 link …: box … is terminated (…); start a new box and re-point the link with sandbox_wire。
    • 跑的是 link 上線前的映像:409 … runs an older image … that cannot serve links; start a new box for it and re-point the link with sandbox_wire。
    • fromPort 上沒有程式在聽:502 link …: nothing listens on port … in box …。

    B 裡的程式看到的是連線被重置,原因寫在 B 的 /work/.sbx/logs/private-endpoints.log 與 sandbox_status.links[].lastError。

  • B 有連線開著的期間,A 算是忙碌:不會因閒置而凍結或停掉(A 的 health 以 servedLinks 顯示這些連線)。B 凍結或停掉之後,ParallelSandbox 會在大約一分鐘內關掉它連到 A 的連線,A 之後就照自己的閒置時間凍結。

  • B 的 sandbox_status.links[] 列出每條 link 與 fromStatus(A 的狀態)、active、opened、failed、lastError。A 的 sandbox_status.linkedFrom[] 列出 link 到它的箱子(boxId、boxName、status、name、port、fromPort)。對 A 呼叫 sandbox_stop 會回同樣的 linkedFrom 並附一段提醒:那些 link 在你用 sandbox_wire 重新指過去之前都會失敗。

  • 流量經過 ParallelSandbox 的控制面,不是兩台機器直連;每個方向都算送出那一邊箱子的往外流量(box_egress):B 送的請求算 B 的,A 回的算 A 的。

  • link 上線前開的箱子不能被 link(409 runs an older image),要在跑著的箱子上補 link,那個箱子也要是 link 上線後開的(409 … cannot add a link while it runs; declare the link at sandbox_start on a new box)。

  • 要改 link 連去哪裡,就帶 fromBox 或 fromPort 再 wire 一次。A 快要不在、想換成自己的程式或已發布的版本時,用同樣的名字與 port 帶 port(與 targetPort)或 version 再 wire:在有 take-over 功能的箱子上會就地接手 link,B 的網址不變(接手 link 或環境位址);比較舊的箱子會回 409,只能開新的 B,網址也會換。對 link 切換 mode 一律回 409。一開始就在 B 宣告版本更簡單:見團隊設定。


所有工具與主題都列在工具參考。