From 14bf81e1e62c6b7aa15d6787a5025102a5e7affe Mon Sep 17 00:00:00 2001 From: Martijn Stevenson Date: Thu, 28 Nov 2024 04:18:20 +0000 Subject: [PATCH 1/4] feat: Publish the first Proxy-Wasm roadmap. This is sure to be a living document, subject to much discussion. Signed-off-by: Martijn Stevenson --- README.md | 3 ++ docs/Roadmap.md | 111 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 docs/Roadmap.md diff --git a/README.md b/README.md index 99c2086..3d7dedd 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,10 @@ Proxy-Wasm extensions across different proxies. The latest and widely implemented version of the specification is [v0.2.1]. +The envisioned evolution for Proxy-Wasm is described in the [roadmap]. + [v0.2.1]: abi-versions/v0.2.1/README.md +[roadmap]: docs/Roadmap.md ## Implementations diff --git a/docs/Roadmap.md b/docs/Roadmap.md new file mode 100644 index 0000000..efb1e5e --- /dev/null +++ b/docs/Roadmap.md @@ -0,0 +1,111 @@ +# Proxy-Wasm Roadmap + +The Proxy-Wasm community and maintainers envision an evolution path that has the +following tracks: + +* [Spec / ABI](#abi) +* [SDKs / language support](#sdks) +* [Host features](#host) +* [Envoy integration](#envoy) + +Each track is described in more detail below, with owners and ETAs listed for +efforts currently in development. This roadmap should not be construed as a set +of commitments, but rather a set of directions that are subject to change in +response to community interest and investment. + +The overarching goals of this document are to: + +* Publish areas of current investment. +* Encourage external contributors by pointing out feature gaps. +* Align this repository with the vision of WebAssembly: a portable technology + that is cross-language, cross-platform, and cross-provider. + +## Spec / ABI {#abi} + +* (Q1'25: @piotrsikora, @mpwarres) Publish ABI v0.3, containing at least: + * Feature negotiation (#71 and #56) + * Better header/body buffering support (#63) + * Async shared data (#54) + * Repeated header support (#53) +* (Help wanted) WASI convergence. We want to adopt the component model at WASI + 1.0. There is a lot of overlap between Proxy-Wasm and some WASI proposals + (wasi-http, wasi-keyvalue, etc). In the short term, we'd like to define the + Proxy-Wasm ABI in + [WIT](https://github.com/WebAssembly/component-model/blob/main/design/mvp/WIT.md), + to understand: + * How do + [Proxy-Wasm interfaces](https://github.com/proxy-wasm/proxy-wasm-cpp-host/blob/main/include/proxy-wasm/context_interface.h) + map to components? + * What are the API gaps? How should we evolve Proxy-Wasm to become + WASI-compatible? + * Are there any performance gaps? +* (Help wanted) Evaluate uses of foreign functions to identify feature gaps. + * For example, Envoy + [registers foreign functions](https://github.com/search?q=repo%3Aenvoyproxy%2Fenvoy%20RegisterForeignFunction&type=code) + for signature checking, compression, filter state, route cache, and CEL + expressions. + * Are there similar extensions in Nginx? Apache Traffic Server? + * Which of these features should be promoted to ABI interfaces? + +## SDKs / language support {#sdks} + +* (Q1'25: @leonm1) Fork the abandoned Go SDK + support full Golang. +* (Google exploring) Build a Python SDK using a MicroPython port. +* (Help wanted) Stop using Emscripten in the C++ SDK. Instead use Clang / + wasi-sdk (proxy-wasm-cpp-sdk#167). +* (Help wanted) Merge LeakSignal's + [proxy-sdk](https://crates.io/crates/proxy-sdk) crate into the Rust SDK. +* (Help wanted) Build a Lua SDK using a Lua interpreter. + * Seems feasible given projects like https://github.com/vvanders/wasm_lua + * Could replace Envoy's + [Lua filter](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter) + * Could benefit NGINX's Lua-based [OpenResty](https://openresty.org/) + ecosystem +* (Help wanted) Optimize Rust SDK module size. It seems compiler dead-code + elimination is thwarted by the use of Context traits. + +## Host features {#host} + +* (Q1'25: @mpwarres) CppHost maintenance. + * Update v8 and upstream some patches for v8 warming / extension. + * Update the protobuf dependency. + * Set up dependabot. +* (Help wanted) Prototype + [HyperLight](https://github.com/hyperlight-dev/hyperlight) as a KVM-based + sandboxing layer around wasm runtimes. The allure is getting an inexpensive + and transparent second layer of security at a thread boundary, which makes + it more feasible to run fully untrusted workloads with Proxy-Wasm. +* (Help wanted) Performance benchmarks. One of Proxy-Wasm's strengths is its + ability to swap between multiple wasm runtimes. Help users make an informed + decision by benchmarking cold start and execution costs across runtimes. +* (Help wanted) Adopt CPU metering as a first-class feature. Leverage + instruction counting where available. For other engines (e.g. v8), use a + watchdog thread. +* (Help wanted) Support dynamic (per VM) limits for RAM and CPU. +* (Help wanted) Expand the use of SharedArrayBuffer to reduce memcpy into wasm + runtimes. This is especially promising for HTTP body chunks. See relevant + [WASI issue](https://github.com/WebAssembly/WASI/issues/594). Also reduce + [binary memcpy](https://github.com/proxy-wasm/proxy-wasm-cpp-host/blob/21a5b089f136712f74bfa03cde43ae8d82e066b6/src/v8/v8.cc#L272). +* (Help wanted) Implement NullVM for Rust and/or Go. For proxy owners with + trusted extensions, achieve native performance while maintaining + WebAssembly's portability. +* (Help wanted) Finish the implementation of DynVM (proxy-wasm-cpp-host#379). + This allows dynamic loading of trusted (NullVm) wasm modules. + +## Envoy integration {#envoy} + +* (Q1'25: @mpwarres, @botengyao) Get Envoy's inline wasm filter out of alpha + (envoyproxy/envoy#36996). Documentation, security scanning, tests, bug + fixes, etc. +* (TBD: @mpwarres) Implement the v0.3 Proxy-Wasm ABI. +* (Help wanted) Decouple from the thread-local execution model. As wasm + modules become more CPU intensive and leverage multiple async APIs, consider + managing a separate Proxy-Wasm threadpool. Each VM needs a work queue, and + requests need affinity to a single VM. This architecture allows for + independent thread scaling (expensive wasms get more CPU), improved + parallelism (multiple requests' wasm at the same time), and reduced memory + costs (one VM serves multiple Envoy threads). +* (Help wanted) Envoy has a single implementation for the entire Proxy-Wasm + host. Add extension points for different Proxy-Wasm interfaces (telemetry, + network calls, key value, shared queue), so Envoy operators may provide + their own implementations. From 8a6e149356b0f33ceb30326611ed083650d2f2c4 Mon Sep 17 00:00:00 2001 From: Martijn Stevenson Date: Thu, 28 Nov 2024 04:27:16 +0000 Subject: [PATCH 2/4] Formatting fixes Signed-off-by: Martijn Stevenson --- docs/Roadmap.md | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/docs/Roadmap.md b/docs/Roadmap.md index efb1e5e..f6186bd 100644 --- a/docs/Roadmap.md +++ b/docs/Roadmap.md @@ -20,13 +20,15 @@ The overarching goals of this document are to: * Align this repository with the vision of WebAssembly: a portable technology that is cross-language, cross-platform, and cross-provider. -## Spec / ABI {#abi} +## Spec / ABI + + * (Q1'25: @piotrsikora, @mpwarres) Publish ABI v0.3, containing at least: - * Feature negotiation (#71 and #56) - * Better header/body buffering support (#63) - * Async shared data (#54) - * Repeated header support (#53) + * Feature negotiation (proxy-wasm/spec#71 and proxy-wasm/spec#56) + * Better header/body buffering support (proxy-wasm/spec#63) + * Async shared data (proxy-wasm/spec#54) + * Repeated header support (proxy-wasm/spec#53) * (Help wanted) WASI convergence. We want to adopt the component model at WASI 1.0. There is a lot of overlap between Proxy-Wasm and some WASI proposals (wasi-http, wasi-keyvalue, etc). In the short term, we'd like to define the @@ -47,16 +49,19 @@ The overarching goals of this document are to: * Are there similar extensions in Nginx? Apache Traffic Server? * Which of these features should be promoted to ABI interfaces? -## SDKs / language support {#sdks} +## SDKs / language support + + * (Q1'25: @leonm1) Fork the abandoned Go SDK + support full Golang. * (Google exploring) Build a Python SDK using a MicroPython port. * (Help wanted) Stop using Emscripten in the C++ SDK. Instead use Clang / - wasi-sdk (proxy-wasm-cpp-sdk#167). + wasi-sdk (proxy-wasm/proxy-wasm-cpp-sdk#167). * (Help wanted) Merge LeakSignal's [proxy-sdk](https://crates.io/crates/proxy-sdk) crate into the Rust SDK. * (Help wanted) Build a Lua SDK using a Lua interpreter. - * Seems feasible given projects like https://github.com/vvanders/wasm_lua + * Seems quite feasible given projects like + [wasm_lua](https://github.com/vvanders/wasm_lua). * Could replace Envoy's [Lua filter](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter) * Could benefit NGINX's Lua-based [OpenResty](https://openresty.org/) @@ -64,7 +69,9 @@ The overarching goals of this document are to: * (Help wanted) Optimize Rust SDK module size. It seems compiler dead-code elimination is thwarted by the use of Context traits. -## Host features {#host} +## Host features + + * (Q1'25: @mpwarres) CppHost maintenance. * Update v8 and upstream some patches for v8 warming / extension. @@ -89,10 +96,13 @@ The overarching goals of this document are to: * (Help wanted) Implement NullVM for Rust and/or Go. For proxy owners with trusted extensions, achieve native performance while maintaining WebAssembly's portability. -* (Help wanted) Finish the implementation of DynVM (proxy-wasm-cpp-host#379). - This allows dynamic loading of trusted (NullVm) wasm modules. +* (Help wanted) Finish the implementation of DynVM + (proxy-wasm/proxy-wasm-cpp-host#379). This allows dynamic loading of trusted + (NullVm) wasm modules. + +## Envoy integration -## Envoy integration {#envoy} + * (Q1'25: @mpwarres, @botengyao) Get Envoy's inline wasm filter out of alpha (envoyproxy/envoy#36996). Documentation, security scanning, tests, bug From 2e09fbfe0d05fcdb2b5ef968dfe38880a9df098f Mon Sep 17 00:00:00 2001 From: Martijn Stevenson Date: Thu, 28 Nov 2024 04:32:44 +0000 Subject: [PATCH 3/4] Move anchor tags Signed-off-by: Martijn Stevenson --- docs/Roadmap.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/Roadmap.md b/docs/Roadmap.md index f6186bd..7ab7d52 100644 --- a/docs/Roadmap.md +++ b/docs/Roadmap.md @@ -20,10 +20,10 @@ The overarching goals of this document are to: * Align this repository with the vision of WebAssembly: a portable technology that is cross-language, cross-platform, and cross-provider. -## Spec / ABI - +## Spec / ABI + * (Q1'25: @piotrsikora, @mpwarres) Publish ABI v0.3, containing at least: * Feature negotiation (proxy-wasm/spec#71 and proxy-wasm/spec#56) * Better header/body buffering support (proxy-wasm/spec#63) @@ -49,10 +49,10 @@ The overarching goals of this document are to: * Are there similar extensions in Nginx? Apache Traffic Server? * Which of these features should be promoted to ABI interfaces? -## SDKs / language support - +## SDKs / language support + * (Q1'25: @leonm1) Fork the abandoned Go SDK + support full Golang. * (Google exploring) Build a Python SDK using a MicroPython port. * (Help wanted) Stop using Emscripten in the C++ SDK. Instead use Clang / @@ -69,10 +69,10 @@ The overarching goals of this document are to: * (Help wanted) Optimize Rust SDK module size. It seems compiler dead-code elimination is thwarted by the use of Context traits. -## Host features - +## Host features + * (Q1'25: @mpwarres) CppHost maintenance. * Update v8 and upstream some patches for v8 warming / extension. * Update the protobuf dependency. @@ -100,10 +100,10 @@ The overarching goals of this document are to: (proxy-wasm/proxy-wasm-cpp-host#379). This allows dynamic loading of trusted (NullVm) wasm modules. -## Envoy integration - +## Envoy integration + * (Q1'25: @mpwarres, @botengyao) Get Envoy's inline wasm filter out of alpha (envoyproxy/envoy#36996). Documentation, security scanning, tests, bug fixes, etc. @@ -117,5 +117,5 @@ The overarching goals of this document are to: costs (one VM serves multiple Envoy threads). * (Help wanted) Envoy has a single implementation for the entire Proxy-Wasm host. Add extension points for different Proxy-Wasm interfaces (telemetry, - network calls, key value, shared queue), so Envoy operators may provide + network calls, key value, shared queue), so that Envoy operators may provide their own implementations. From 55db3bb76eda2e698a39dacbd72460168f44b6cb Mon Sep 17 00:00:00 2001 From: Martijn Stevenson Date: Thu, 28 Nov 2024 04:43:09 +0000 Subject: [PATCH 4/4] Few nits and links Signed-off-by: Martijn Stevenson --- docs/Roadmap.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/Roadmap.md b/docs/Roadmap.md index 7ab7d52..7416012 100644 --- a/docs/Roadmap.md +++ b/docs/Roadmap.md @@ -11,7 +11,7 @@ following tracks: Each track is described in more detail below, with owners and ETAs listed for efforts currently in development. This roadmap should not be construed as a set of commitments, but rather a set of directions that are subject to change in -response to community interest and investment. +response to community interest and contributions. The overarching goals of this document are to: @@ -31,15 +31,16 @@ The overarching goals of this document are to: * Repeated header support (proxy-wasm/spec#53) * (Help wanted) WASI convergence. We want to adopt the component model at WASI 1.0. There is a lot of overlap between Proxy-Wasm and some WASI proposals - (wasi-http, wasi-keyvalue, etc). In the short term, we'd like to define the - Proxy-Wasm ABI in + ([wasi-http](https://github.com/WebAssembly/wasi-http), + [wasi-keyvalue](https://github.com/WebAssembly/wasi-keyvalue), etc). In the + short term, we'd like to define the Proxy-Wasm ABI in [WIT](https://github.com/WebAssembly/component-model/blob/main/design/mvp/WIT.md), to understand: * How do [Proxy-Wasm interfaces](https://github.com/proxy-wasm/proxy-wasm-cpp-host/blob/main/include/proxy-wasm/context_interface.h) map to components? * What are the API gaps? How should we evolve Proxy-Wasm to become - WASI-compatible? + WASI-compatible? What are good incremental steps? * Are there any performance gaps? * (Help wanted) Evaluate uses of foreign functions to identify feature gaps. * For example, Envoy @@ -66,7 +67,7 @@ The overarching goals of this document are to: [Lua filter](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter) * Could benefit NGINX's Lua-based [OpenResty](https://openresty.org/) ecosystem -* (Help wanted) Optimize Rust SDK module size. It seems compiler dead-code +* (Help wanted) Optimize Rust SDK binary size. It seems compiler dead-code elimination is thwarted by the use of Context traits.