deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Cloudflare blog

Cloudflare, wasm-bindgen'in Emscripten hedefi üzerinden yerel Rust ve Tokio uygulamalarını Workers'a getiriyor

Cloudflare'ın wasm-bindgen için deneysel Emscripten hedefi, Tokio tabanlı sunucular dahil — örneğin bir Durable Object içinde çalışan bir Minecraft sunucusu — yerel Rust uygulamalarının Workers üzerinde çalışmasını sağlıyor.

Cloudflare, wasm-bindgen'in Emscripten hedefi üzerinden yerel Rust ve Tokio uygulamalarını Workers'a getiriyor

Cloudflare ne duyurdu

Cloudflare, şirketin V8 tabanlı Workers Runtime üzerinde Rust WebAssembly uygulamalarını güçlendiren açık kaynak araç zinciri wasm-bindgen'e, wasm32-unknown-emscripten Rust derleyici hedefi için birinci sınıf desteğin ilk deneysel önizlemesini yayımladı. Cloudflare bloguna göre bu değişiklik, yerel Rust kodunun — Tokio async runtime üzerine inşa edilmiş uygulamalar dahil — doğrudan Workers'ta, ayrıca web'de ve Node.js'te çalıştırılmasını mümkün kılıyor.

Özellik henüz pre-release aşamasında. Cloudflare, Emscripten Rust Workers oluşturmayı, bir Worker içinde Tokio runtime'ı çalıştırmayı ve Emscripten ile Tokio kullanarak TCP socket'leri kullanmayı kapsayan örnek uygulamalarla birlikte deneysel yamalar yayımladı.

İki araç zinciri nasıl iş birliği yapmayı öğrendi

Başlangıçta Mozilla tarafından oluşturulan ve bugün Google mühendisleri tarafından maintain edilen bir WebAssembly derleyici araç zinciri olan Emscripten; timer'lar, dosya sistemi işlemleri ve socket'ler gibi özellikleri sanallaştırarak yerel kod ile web platformu arasında köprü kuruyor. Cloudflare, wasm-bindgen'e bir Emscripten hedefi ekleme çabasının bir yılı aşkın süre önce Google'la başladığını, wasm-bindgen'i maintain eden Cloudflare mühendislerinin ise bu çalışmayı daha sonra incelediğini ve genişlettiğini söylüyor.

Engel mimariseldi: Hem Emscripten hem de wasm-bindgen, JavaScript'i yükleme ve nihai JS ve Wasm çıktısını üretme sorumluluğunun kendilerinde olduğunu varsalıyordu; ekipler bu yüzden bir araç zinciri seçip diğerinden vazgeçmek zorundaydı. Google'ın Portable Toolchains ekibinden Mitch Foley, başka bir Google ekibi Emscripten tarafından derlenen C++ kodlarından JavaScript'leriyle etkileşim kurmak için wasm-bindgen kullanmak istediğinde bu sınıra takıldı. Foley ve meslektaşı Yifan Yang bir iş bölümü önerdi: Emscripten build'i yönetmeye, Wasm modülünü yüklemeye ve eşlik eden JavaScript'i üretmeye devam ederken, wasm-bindgen de bağlamalarının daha küçük, taşınabilir bir biçimini üretip doğrudan Emscripten'in kütüphane sistemine takılıyor. Google'ın Portable Toolchains ve Wasm Tools ekipleriyle Cloudflare mühendislerinden gelen geri bildirimlerle gerekli değişiklikler her iki projeye de land edildi ve yeni bir -sWASM_BINDGEN yapılandırması aracılığıyla ortaya çıktı. Bu iki yönlü çalışıyor: Emscripten ile build edilmiş C++, statik wasm-bindgen Rust kodunu link edebiliyor ve Rust projeleri, iki bağlama katmanını da kullanılabilir tutarak Emscripten hedefi için derlenebiliyor.

Workers üzerinde kütüphane uyumluluğu

Workers Web Platform API'lerini ve Node.js uyumluluğunu desteklediği için Cloudflare, Emscripten'i Node.js derleme bayraklarını kullanarak uyguluyor ve yerel platform özelliklerini mevcut Node.js API'lerinin üzerinde sanallaştırıyor. Şirket, bunun sonucunda Rust Workers için çok daha iyi kütüphane uyumluluğu bildiriyor. Emscripten zaten Rust'ın target_family = unix gereksinimini karşıladığından, düşük seviyeli sistem kütüphaneleri dahil birçok crate değiştirilmeden çalıştı. libc, socket2 ve Mio gibi Emscripten'den habersiz kütüphaneler yamalar gerektirdi, ancak Cloudflare bunları çoğunlukla açık target_os = "emscripten" gate'lerinin küçük eklemeleri olarak tanımlıyor ve Rust maintain ederlerinin bu yamaları review etmeye açık olduğunu söylüyor.

Tokio'yu bir JS event loop'a uydurmak

Tokio daha derin bir müdahale gerektirdi. Workers tek thread'lidir ve bir JS event loop içinde barındırılır; oysa Tokio'nun tasarımı, blocking işlemlerin bir thread'i park edebildiğini varsayar — blocking bir socket okuması veya bir epoll bekleme, paylaşılan event loop'u kilitlerdi. Cloudflare iki düzeltmeyi destekledi: WebAssembly JavaScript Promise Integration (JSPI) ve Tokio'nun bir event-loop host ile entegre olabilmesini sağlayan değişiklikler. Cloudflare, upstream review sürecinde olan tam Tokio destek yamalarını katkı olarak sundu ve wasm32-unknown-emscripten için ilk hedef desteği patch'i Tokio'ya çoktan land edildi.

JSPI, blocking bir Wasm çağrısının WebAssembly stack'ini askıya alıp kontrolü JS event loop'a geri vermesine izin verdiği — ki bu bir park gibi davranır — için Tokio'nun modeline uygun. Ayrıca öncekiler askıya alınmışken yeni Wasm stack'leri başlayabiliyor. Sorun şurada: Rust, stack'inin altında değiştirildiğinden habersiz; Tokio runtime context'ini bir thread local'da takip ediyor ve bir JSPI stack değişimi bir thread değişimi olmadığından, yeni giren bir çağrı hâlâ park edildiğine inanan bir context görüyor ve bunun sonucunda panic ediyor. Bu yüzden tam yeniden giriş yapılabilir (reentrant) JSPI, thread-local context'in her JSPI girişinde değişimini ve durumun askıya alınmış stack'ler arasında bölünmesini gerektiriyor.

Kanıt olarak bir Minecraft sunucusu

Bu yeteneği göstermek için Cloudflare, Rust tabanlı bir Minecraft sunucusu olan Pumpkin'ı TCP ingress ile birlikte bir Durable Object içinde, Tokio aracılığıyla gerçek TCP socket'leri kullanarak çalıştırdı.

Neden önemli

Serverless runtime'lar tipik olarak Rust geliştiricilerini wasm32-unknown-unknown hedefine ve crate ekosisteminin dar bir dilimine itiyordu. Emscripten'i birinci sınıf bir wasm-bindgen hedefi haline getirerek Cloudflare, Workers üzerinde çalışabilecek yerel Rust kütüphaneleri setini — ve Tam Tokio tabanlı networking uygulamalarını — önemli ölçüde genişletiyor. Google-Cloudflare iş birliği Workers'ın ötesinde de önemli: artık tek bir build, wasm-bindgen ve Emscripten bağlamalarını web, Node.js ve edge platformlarında karıştırabiliyor ve Tokio yamaları upstream'e merge edilirse, herhangi bir event-loop host, Rust async kodu çalıştırma yolu kazanıyor.

  • #rust
  • #webassembly
  • #cloudflare-workers
  • #serverless
  • #tokio

İlgili yazılar