RFC-0108:元件繫結通訊協定

RFC-0108:元件繫結器通訊協定
狀態已接受
領域
  • 元件架構
說明

由架構提供的通訊協定,可讓元件啟動其他元件。

毛皮變化
作者
審查人員
提交日期 (年-月-日)2021-05-21
審查日期 (年-月-日)2021-06-30

摘要

這個 RFC 導入了新的架構提供的通訊協定 fuchsia.component.Binder,可讓元件啟動其他 公開元件

提振精神

fuchsia.sys2.Realm 通訊協定是架構提供的 API, 可讓元件在執行階段操控自己的運作範圍。使用這項 通訊協定元件可建立子項元件,並繫結至 功能,並由執行階段決策驅動,而不只是靜態宣告。 您可以透過叫用 BindChild,將元件繫結至子項功能 方法。此方法會在成功執行時啟動提供的子項 元件,如果尚未啟動,並開啟與 子項支援的 fuchsia.io.Directory 通訊協定 Kubernetes 元件的公開目錄子項的公開目錄是目錄 包含子項在資訊清單中公開的所有功能。

這個方法有兩個缺點。首先,目前超載 可實現兩種用途可讓元件繫結至子項 元件的功能,而且這個元件也能讓元件用來啟動子項 元件。其次,這與元件架構的能力不如預期 模型大多數元件都會為了滿足能力的要求而啟動。 指出,元件會繫結至功能,而非元件 並提供這些功能這是封裝的重要性 因為如果元件能與功能互動 實作元件時即可替換,完全不需要 用戶端。

因此 BindChild 將淘汰。替代品 OpenExposedDir 方法將新增至 fuchsia.sys2.Realm 通訊協定 家長可以透過這個平台 綁定孩子的功能值得注意的是 這個方法與 BindChild 的差異在於新方法中 子項只會在父項繫結至其其中一個繫結時,才會啟動 即便沒有技術背景,也能因這些工具的功能而受益這項語意變更更符合元件架構 這些設計原則這項遷移作業已開始進行,您可以進行追蹤 fxr/531142

不過,將 BindChild 取代為 OpenExposedDir 是不夠的。 從數量和重要性的角度來看 依賴 BindChild 自動啟動行為的用途數量。 在這些情況下,父項元件不會與任何 子項的功能或父項會啟動一個 並公開所有功能可以在某些整合中觀察到這種模式 測試、驅動程式和工作階段元素在此用途中 架構團隊必須提供解決方案,以便客戶啟動元件。

設計

元件架構將導入新架構提供的通訊協定 fuchsia.component.Binder。這項能力可讓作者 以及能直接繫結元件想要啟動其他元件的元件 然後使用該通訊協定 和其他能力一樣元件 管理員會在這個通訊協定的伺服器端上連線,一旦連線成功, 啟動後,元件會開始公開這項能力目標 觀察 ZX_CHANNEL_PEER_CLOSED 即可擷取元件的終止情形 用戶端連結。

library fuchsia.component;

/// A framework-provided protocol that allows components that use it to start the
/// component that exposes it.
///
/// Note: The component doesn't need to serve this protocol, it is implemented
/// by the framework.
[Discoverable]
protocol Binder {};

元件作者只需要公開通訊協定:

{
    expose: [
        {
            protocol: "fuchsia.component.Binder",
            from: "framework", // Note that this is implemented by the framework on the component's behalf.
        },
    ],
}

會繫結至公開的元件,啟動這類元件的元件 能力:

{
    use: [
        {
            protocol: "fuchsia.component.Binder",
            from: "parent",
        },
    ],
}

本提案的主要優點是,直接發起競價是 元件的 API可直接啟動的元件,尤其是 可在資訊清單檔案中進行稽核此外 啟動其他元件時,不受父項元件限制 直接子項。fuchsia.component.Binder 通訊協定可以是 會像其他功能一樣轉送到任何地方

實作

實作這項設計不需要進行許多變更。這個通訊協定簡介 都應該進行一到兩次 Gerrit 變更。

這項功能發布後,「BindChild」的使用者將會遷移至 使用 OpenExposedDir 或建議的 fuchsia.component.Binder 通訊協定 根據用途選擇對應項目

遷移 BindChild 的所有用途後,該方法就會 已從 fuchsia.sys2.Realm 通訊協定移除。

成效

這個通訊協定會產生效能迴歸現象。目前,父項元件 可能會呼叫 BindChild 來啟動子元件。完成這份提案後,上層發布商 元件必須呼叫 OpenExposedDir,然後「接著」開啟 fuchsia.component.Bind 也能達到相同效果然而,這種迴歸應該具有顯著性 事件。

安全性考量

此通訊協定不應引發安全疑慮。這個通訊協定將可轉送 以便檢查哪些元件可啟動哪些元件可稽核 資訊清單檔案

隱私權注意事項

此通訊協定不應引發隱私權疑慮,因為這只是系統允許機制運作 來啟動其他元件

測試

這項功能將會透過單元和整合測試進行測試。

此外,這個功能讓元件作者可以測試副作用 與其他元件的結合舉例來說,在「診斷」頁面中 整合測試會斷言檢查 VMO 的狀態。此時 驅動程式庫元件會啟動 puppet 元件 驅動程式庫元件會斷言 VMO 的內容提議 可讓驅動程式庫元件在沒有指示性的情況下啟動布偶元件 需要多餘的 FIDL 通訊協定

說明文件

我們會記錄 FIDL API,並進一步記錄這項功能 元件架構運作原理文件

缺點、替代方案和未知

單一執行作業元件

目前尚未接受相關 RFC,因此也允許 用來啟動子項元件該提案能夠同時滿足 只能填入 BindChild,但並非全部。值得注意的是 透過提議的機制開始,必須位於集合中, fuchsia.component.Binder 適用於所有元件。

fuchsia.sys2.Realm/StartChild

另一個選項是新增方法以擴充 fuchsia.sys2.Realm 通訊協定 開始有孩子。這個方法 StartChild 會使用一個參數。 ChildRef,如果參照靜態宣告的子項, 即可動態建立集合 (集合)。這就是同一個參數 收到 BindChild 後,OpenExposedDir 就會接手。這個方法 傳回 Zircon 事件物件,這個物件會在子項傳送後發出信號 元件。子項元件的生命週期會與 父項元件。如果父項元件停止,則子項將 也停了下來

library fuchsia.sys2;

[Discoverable]
protocol Realm {
    /// Start child component instance, if it isn't already. Returns a Zircon
    /// Event object that clients can use to observe when the child component stops.
    /// When the child component stops, Component Manager will set this object's
    /// ZX_EVENT_SIGNALED bit.
    StartChild(ChildRef child) -> (zx.handle:EVENT event) error fuchsia.component.Error;
};

最終,這種替代方案並不不適合,因為這種替代方式允許任何 可直接啟動而不是直接開始改變 能力繫結,只有在元件宣告時才會允許。 由於 StartChild 會採用 ChildRef,因此允許任何元件 已開始。透過集合,您只能觀察在以下位置啟動哪些元件 執行階段。

繫結方法

最後,我們不會介紹上述空的 Binder 通訊協定, 方法可用於觸發啟動

library fuchsia.component;

[Discoverable]
protocol Binder {
    /// Start the associated component instance.
    /// This method is reentrant and safe for concurrency.
    /// Calling `Bind` on an already-binded component is a no-op.
    /// When the child component stops, the `ZX_EVENTPAIR_PEER_CLOSED` signal
    /// will be asserted on the `event` object.
    Bind(zx.handle:EVENTPAIR event) -> () error fuchsia.component.Error;
};

如果這個選項能更明確地觸發啟動事件 (例如做為回應), 相較於通訊協定,這種做法較不可行 也因為這樣較容易協助客戶一定要設定 您必須先建立事件配對物件,才能呼叫方法 (不加入任何程式碼) 功能。

繫結功能

元件架構也可以導入 提議的 fuchsia.component.Binder 通訊協定。

// a.cml
{
    capabilities: [
        {
            binder: "a",
        },
    ],
    expose: [
        {
            binder: "a",
            from: "self",
        },
    ],
}

新能力可帶來許多好處,例如:

  1. 透過不同的類型,您可以更準確地區分啟動能力。例如: 我們可以提高繫結器功能的命名慣例 通訊協定
  2. 與其他功能一致, 繫結 (連線中 == 繫結)
  3. 錯失「framework」關鍵字的機會 (雖然我們可以加入 cmc 廣告, )。

不過,儘管帶來優勢,導入新能力並增添了概念 亦即讓開發人員學習和理解新事物, 聯絡。架構提供的通訊協定更簡單易懂 概念上