A single Rust-based Host HTTP Runtime (HHRF) runs lightweight "fetch-like" Fezz function modules using a load-run-unload execution model, providing a serverless-style platform.
cargo build --release -p example_todosapi -p hhrf# org/func/version formatında dizin oluştur
mkdir -p ./functions/acme/todos/0.0.1
cp target/release/libexample_todosapi.dylib ./functions/acme/todos/0.0.1/fezz.soİsterseniz .env dosyası da ekleyebilirsiniz:
echo "EXAMPLE_VAR=demo" > ./functions/acme/todos/0.0.1/.envexport HHRF_ROOT=.
cargo run -p hhrf --releasecurl http://127.0.0.1:3000/rpc/acme/todos/0.0.1/hellocat <<'EOF' > ./functions/acme/todos/0.0.1/fezz.js
export default {
async fetch(request, env, ctx) {
return new Response(`ok: ${request.method} ${request.path}`);
},
};
EOFcurl "http://127.0.0.1:3000/js-embed/acme/todos/0.0.1/hello?x=1"HHRF, kullanacağı runner binary'sini FEZZ_RUNNER ortam değişkeni ile ayarlamana izin verir:
- Varsayılan:
FEZZ_RUNNERtanımlı değilsefezz-runnerkullanılır. - Prod ortamda Linux üzerinde,
FEZZ_RUNNER'ı bir jailer ile wrap edebilirsin (ör.nsjail,firejail,bwrap).
Örnek (konsept):
export FEZZ_RUNNER=/usr/local/bin/nsjail-fezz-runnernsjail-fezz-runner script/bin'i içinde:
- Low-priv user'a geç,
- Gerekirse chroot / namespace / seccomp ayarlarını yap,
- Sonra gerçek
fezz-runner'ı bu sandbox içinde çalıştır.
#[fezz_function] macro'su, user fonksiyonunu std::panic::catch_unwind ile saran bir fezz_handle_v2 FFI entrypoint'i üretir. Böylece user kodundaki panikler FFI boundary'yi geçmez, HTTP 500 dönen structured error response'a çevrilir.
fezz_handle_v2 exported C fonksiyonu senkron çalışır. Fonksiyon içinde HTTP/Redis gibi işler için bloklayan client'lar kullanılır. HHRF tarafında çağrı artık ayrı bir process olduğu için host async runtime'ı bloklanmaz; ek olarak process-level izolasyon kazanılır.
Artık her çağrı ayrı bir process içinde olsa bile (özellikle fezz-runner modeliyle), fonksiyon kütüphanesi birden çok kez reuse edilebilir. Ağır client'lar için yine std::sync::OnceLock gibi mekanizmaları kullanabilirsin, ancak unutmaman gereken nokta:
- Process crash ederse (panic, segfault), sonraki çağrı yeni bir process ile sıfırdan başlar.
- Bu nedenle state'i sadece performans için kullan, doğruluk için değil.
- Blocking client kullan: FFI interface senkron olduğu için HTTP/DB için bloklayan client'lar en sade yol.
- Panik yerine hata döndür: Panik etmek yerine
FezzWireResponseile düzgün hata mesajları dön. - Stateless tasarla: İş mantığını her request bağımsız olacak şekilde yaz; global mutable state'e güvenme.
- Timeout'ları düşün: Dış servis çağrılarına makul timeout'lar koy; child process askıda kalmasın.