Topik wawancara representatif

Wawancara umum: Bagaimana Anda menjelaskan WebAssembly Component Model dan WASI?

UmumSulit
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Sebuah tim ingin plugin Rust, Go, dan bahasa lainnya berjalan dalam satu layanan sambil membatasi akses file dan jaringan. Jelaskan bagaimana WebAssembly Component Model, WASI, dan WIT bekerja bersama, dan kapan Anda tidak akan menggunakannya.

Prompt dan cakupan

Sebuah platform SaaS harus memuat plugin aturan pihak ketiga. Plugin dapat ditulis dalam berbagai bahasa, dan host ingin menggunakannya kembali dalam satu proses atau runtime ringan sambil hanya memberikan antarmuka jam, logging, dan penyimpanan objek yang eksplisit. Jelaskan hubungan antara modul inti WebAssembly, Component Model, WIT, dan WASI, lalu usulkan kontrol pembuatan versi, performa, keamanan, dan operasional.

Ini menguji runtime lintas bahasa dan batasan keamanan, bukan sekadar frasa "kecepatan mendekati native". Spesifikasi WebAssembly 3.0 mendefinisikan Wasm inti sebagai set instruksi virtual yang tervalidasi dan di-sandbox. Component Model menambahkan antarmuka bertipe, komposisi, dan konvensi pemanggilan; WIT mendeskripsikan antarmuka; dan WASI menyediakan kapabilitas sistem dalam bentuk WIT. Jawaban yang baik memisahkan antara "modul dieksekusi" dan "plugin dapat menggunakan kapabilitas host dengan aman".

Apa yang sedang diuji oleh pewawancara

Jawaban yang kuat dimulai dengan rangkaian kapabilitas terkecil, mendefinisikan antarmuka plugin, dan kemudian memutuskan apakah Component memang layak digunakan daripada memberikan proses host untuk setiap plugin. Ini membedakan memori linier bersama dalam modul inti dari batasan Component bertipe, menjelaskan bagaimana world mendeklarasikan impor dan ekspor, dan menunjukkan bagaimana host menolak impor yang tidak dideklarasikan.

Ini juga mencakup kenyataan: sandbox bukanlah keamanan bisnis jika host mengekspos API pengekspor data; melintasi batasan dapat menyalin nilai berukuran besar; dan versi Component Model serta WASI memerlukan matriks runtime yang terkunci. Materi persiapan wawancara umumnya memperlakukan portabilitas, isolasi, desain antarmuka, dan pemulihan sebagai sinyal rekayasa (engineering signals) daripada sekadar trivia tentang satu alat.

Pertanyaan untuk diklarifikasi terlebih dahulu

Kepercayaan plugin dan target isolasi

Tanyakan apakah plugin merupakan first-party, milik mitra, atau sepenuhnya tidak tepercaya. Jika penyerang dapat keluar dari proses host, satu sandbox Wasm saja tidak cukup; gunakan isolasi proses atau layanan khusus. Konfirmasikan apakah jaringan, file, keacakan (randomness), dan jam diperlukan karena masing-masing memperluas batas kapabilitas.

Model pemanggilan dan ukuran data

Klarifikasi apakah panggilan berupa aturan sinkron singkat, pekerjaan berdurasi panjang, atau stream. Nilai terstruktur berukuran kecil cocok untuk batasan antarmuka; file berukuran besar harus menggunakan handle yang terkontrol atau objek yang dikelola host untuk menghindari penyalinan berulang. Target latensi dan konkurensi menentukan pooling, warm-up, dan backpressure.

Kontrak versi dan kegagalan

Tanyakan siapa yang melakukan upgrade terlebih dahulu, apakah antarmuka lama harus tetap berdampingan, apakah panggilan yang gagal dapat dicoba lagi, dan apakah efek samping bersifat idempoten. Jika plugin menulis ke sistem eksternal, tentukan hasil yang tidak diketahui setelah batas waktu (timeout), kunci idempotensi, dan catatan audit.

Kerangka jawaban 30 detik

"Saya akan memperlakukan plugin sebagai Component yang berinteraksi hanya melalui antarmuka yang dideklarasikan. Saya akan mendefinisikan world WIT minimal, seperti mengekspor evaluate sambil mengimpor logging dan pembacaan objek terbatas; host menginstansiasinya dari daftar izin (allow-list) dan tidak menyediakan hal lain. WASI adalah kelompok antarmuka sistem yang terstandarisasi, bukan izin otomatis ke file atau jaringan. Wasm inti menyediakan eksekusi yang tervalidasi, sementara Component Model menyediakan komposisi lintas bahasa yang bertipe. Saya akan membuat versi antarmuka, membatasi sumber daya, dan menguji hak istimewa, kompatibilitas, performa, dan pemulihan. Jika plugin sepenuhnya tidak tepercaya atau membutuhkan status bersama yang ekstensif, saya akan memilih layanan terpisah."

Solusi langkah demi langkah

Langkah 1: Mulai dengan kapabilitas dan kepercayaan

Tulis kebutuhan setiap plugin sebagai daftar kapabilitas: logging, waktu saat ini, pembacaan konfigurasi, pembacaan objek, atau pengiriman antrean. Kapabilitas adalah impor nyata, bukan komentar. World komputasi murni tidak boleh memiliki antarmuka file atau jaringan. Untuk plugin yang tidak tepercaya, perlakukan Wasm sebagai satu lapisan dan tambahkan batas proses, rilis bertanda tangan, dan peninjauan dependensi.

Langkah 2: Bedakan modul inti dari Component

Modul inti mendefinisikan fungsi tingkat rendah, tabel, memori linier, serta impor dan ekspor, yang bekerja dengan baik di dalam satu runtime atau binding bahasa. Meneruskan string dan daftar antar modul sering kali membutuhkan tata letak memori bersama dan ABI buatan manual, yang menciptakan kopling bahasa. Component mengemas satu atau beberapa modul inti dalam wadah yang mendeskripsikan dirinya sendiri, menggunakan tipe antarmuka untuk string, record, varian, dan result, serta menerapkan Canonical ABI untuk adaptasi batasan.

text
world rules {
  import logger: interface { log: func(level: string, message: string) }
  import objects: interface { read: func(key: string) -> result<list<u8>, not-found> }
  export evaluate: func(input: list<u8>) -> result<list<u8>, rule-error>
}

Deklarasi mirip WIT ini mengekspresikan batasan, bukan bahasa implementasi. Host memvalidasi bahwa deklarasi komponen cocok dengan world yang diizinkan dan menolak impor tambahan; plugin melihat antarmuka alih-alih pointer host atau deskriptor file.

Langkah 3: Jelaskan WIT worlds dan WASI

WIT mendefinisikan antarmuka dan arah impor/ekspor; world adalah kontrak tertutup yang berisi antarmuka-antarmuka tersebut. Host dapat menghubungkan ekspor satu komponen ke impor komponen lain tanpa memori bersama. WASI menggunakan gaya deskripsi antarmuka yang sama untuk file, jaringan, jam, dan kapabilitas sistem lainnya, tetapi runtime tetap mengonfigurasi pemetaan direktori, kebijakan jaringan, dan batas sumber daya. Menerapkan WASI tidak lantas membuka setiap kapabilitas.

Langkah 4: Rancang kontrol siklus hidup dan sumber daya

Tetapkan batas memori per instans, waktu panggilan, fuel atau eksekusi, konkurensi, dan byte output. Panggilan singkat dapat menggunakan pool dan menghapus status di antara permintaan; plugin stateful harus menyimpan status dalam objek host eksplisit. Saat pembatalan, hentikan panggilan baru, tunggu atau hentikan instans, dan catat apakah efek samping eksternal mungkin telah terjadi. Kesalahan yang dikembalikan tidak membuktikan bahwa penulisan eksternal telah di-rollback.

Langkah 5: Tangani versi dan interoperabilitas bahasa

Menambahkan kolom antarmuka opsional biasanya lebih aman daripada mengubah semantik yang ada; penghapusan atau perubahan makna memerlukan world baru atau jendela migrasi. Kunci paket WIT, runtime, adaptor, dan manifes kapabilitas dalam rilis, serta catat hash komponen dan versi dependensi. Lakukan shadow-run pada pembaruan, bandingkan hasil, latensi, dan penggunaan sumber daya, lalu lakukan canary berdasarkan penyewa (tenant) atau versi plugin. Pertahankan plugin lama pada world lama daripada memaksakan semantik baru ke dalamnya.

Langkah 6: Buktikan batasan dan nilai dengan pengujian

Pengujian keamanan mencakup impor yang tidak dideklarasikan, traversal jalur, pelarian jaringan, kehabisan sumber daya, hasil berbahaya yang berukuran sangat besar, dan tanda tangan komponen yang tidak valid. Pengujian kompatibilitas menghasilkan nilai WIT yang sama dalam beberapa bahasa dan mencakup kolom opsional, varian kesalahan, dan peningkatan host/komponen independen. Pengujian performa memisahkan adaptasi batasan, cold start, hitungan pool, dan komputasi bisnis. Jika penyalinan data mendominasi, pustaka native atau layanan terpisah mungkin merupakan desain yang lebih baik.

Contoh jawaban berkualitas tinggi

Pertama-tama saya akan mengonfirmasi kepercayaan dan kapabilitas plugin. Untuk plugin mitra yang terkontrol, saya akan mendefinisikan world WIT minimal: plugin mengekspor evaluasi aturan dan mengimpor logging terstruktur serta pembacaan objek terbatas. Host hanya menghubungkan impor tersebut dan menerapkan batas memori, waktu, konkurensi, dan output. World komputasi murni tidak memiliki kapabilitas file atau jaringan.

Wasm inti menyediakan eksekusi tingkat rendah yang tervalidasi, tetapi nilai gabungan lintas bahasa dapat bergantung pada ABI memori bersama. Component Model membungkus modul dengan antarmuka bertipe dan Canonical ABI; WIT mendeskripsikan arah, sementara WASI adalah kelompok kapabilitas sistem standar opsional. Saya tetap mengonfigurasi izin direktori, jaringan, dan jam. Rilis mengunci paket WIT, adaptor, runtime, dan hash komponen. World lama tetap tersedia sementara versi baru diuji secara shadow dan canary.

Terakhir, saya akan menguji hak istimewa, kehabisan sumber daya, perilaku percobaan ulang, dan efek samping eksternal, mengukur cold start, adaptasi batasan, hitungan pool, dan waktu bisnis. Jika plugin sepenuhnya tidak tepercaya, memerlukan jaringan yang kompleks, atau berbagi status mutable yang besar, saya akan menggunakan layanan terpisah dengan isolasi proses yang lebih kuat daripada memperlakukan sandbox Wasm sebagai solusi keamanan yang lengkap.

Kesalahan umum

  • Memperlakukan WebAssembly sebagai proses dengan syscall langsung → modul inti tidak memiliki API lingkungan; kapabilitas diperoleh melalui impor host → Buat daftar setiap impor dan konfigurasikan hak istimewa terendah (least privilege).
  • Memperlakukan Component hanya sebagai modul inti yang lebih cepat → nilai utamanya adalah antarmuka bertipe, komposisi, dan ABI lintas bahasa, yang dapat menambah biaya adaptasi → Uji tolok ukur (benchmark) cold start, adaptasi, dan pekerjaan bisnis secara terpisah.
  • Memberikan WASI penuh ke setiap plugin → kapabilitas file, jaringan, dan jam memperbesar jalur kebocoran data dan penyalahgunaan sumber daya → Berikan kapabilitas per world dan tenant, dengan default tolak (deny).
  • Hanya memvalidasi nilai kembalian → penulisan eksternal mungkin telah terjadi sebelum timeout, sehingga mencoba lagi dapat menduplikasi efek samping → Definisikan idempotensi, audit, dan status hasil yang tidak diketahui.
  • Memaksakan antarmuka host baru ke dalam plugin lama → tipe yang sama tidak menjamin semantik yang sama → Dukung world berversi dan migrasi eksplisit.

Pertanyaan lanjutan dan tanggapan

Pertanyaan lanjutan 1: Mengapa tidak menjalankan plugin dalam kontainer?

Kontainer cocok untuk plugin yang membutuhkan sistem file independen, stack jaringan, atau batasan kegagalan proses, tetapi biaya startup dan sumber daya biasanya lebih tinggi. Component cocok untuk panggilan singkat, kapabilitas eksplisit, dan instans yang padat. Jika plugin memerlukan hak istimewa kernel, driver khusus, atau isolasi yang lebih kuat, gunakan kontainer atau layanan. Pilih berdasarkan model ancaman, target startup, anggaran sumber daya, dan kematangan operasi.

Pertanyaan lanjutan 2: Sebuah komponen mengalami batas waktu (timeout) setelah penulisan eksternal. Bisakah Anda mencoba lagi?

Batas waktu tidak dapat membuktikan bahwa penulisan tidak terjadi. Teruskan ID permintaan dan kunci idempotensi ke sistem eksternal, catat UNKNOWN, dan konfirmasikan melalui kueri atau alur kerja kompensasi. Coba lagi hanya setelah mengonfirmasi tidak ada eksekusi atau ketika kontrak eksternal menjamin idempotensi; Component Model tidak menyediakan transaksi lintas sistem.

Pertanyaan lanjutan 3: Bagaimana Anda menghentikan plugin dari menyelundupkan (exfiltrate) data melalui log?

Logging juga merupakan sebuah kapabilitas. Batasi ukuran kolom, struktur, dan laju (rate); klasifikasikan kolom sensitif dan isolasi penyewa. Plugin berisiko tinggi dapat menggunakan proxy redaksi data atau tidak menerima impor logging sama sekali. Audit runtime mencatat versi, kapabilitas, dan jumlah panggilan, bukan konten log sebagai bukti keamanan.

Pertanyaan lanjutan 4: Bagaimana jika versi WASI Preview berubah?

Cantumkan paket antarmuka WASI dan versi runtime dalam manifes rilis komponen, dan jadikan matriks kompatibilitas sebagai gerbang deployment. Jalankan runtime baru terhadap world lama dengan uji regresi dan perbandingan hasil; pertahankan runtime atau adaptor lama ketika semantiknya berbeda. "Menerapkan WASI" bukanlah janji kompatibilitas lintas versi.

Sumber publik

Pertanyaan terkait