Deno Queues
(deno.com)- Deno Queues adalah antrean terdistribusi serverless yang dibangun di atas Deno KV, memungkinkan pekerjaan yang memakan waktu dialihkan secara asinkron atau dijadwalkan untuk dijalankan di masa mendatang
- Developer cukup memasukkan pesan dengan
.enqueue()dan memprosesnya dengan.listenQueue(), tanpa perlu menyiapkan atau memelihara infrastruktur antrean terpisah - Secara lokal menggunakan SQLite, sedangkan di Deno Deploy menggunakan FoundationDB; Deploy menjalankan V8 isolate secara on-demand saat pesan diproses
- Mekanisme pengirimannya adalah at-least-once delivery, sehingga dalam kondisi kegagalan atau retry, pesan yang sama bisa diproses beberapa kali
- Tidak ada biaya antrean terpisah, tetapi enqueue dihitung sebagai penulisan KV, sementara penerimaan pesan dihitung sebagai penulisan KV dan request Deno Deploy, sehingga pemrosesan duplikat dan struktur biaya perlu dipertimbangkan bersama
Tugas yang Ditangani Deno Queues
- Deno Queues adalah fitur antrean berbasis Deno KV yang memungkinkan sebagian pemrosesan aplikasi dialihkan menjadi pekerjaan asinkron atau menjadwalkan pekerjaan untuk dijalankan nanti
- Deno bertujuan mengurangi konfigurasi berulang dan penataan infrastruktur dalam pengembangan software cloud, serta menyediakan komponen dasar agar developer dapat merancang, memperbaiki, dan merilis lebih cepat
- Deno KV adalah opsi persistensi berbasis FoundationDB, dan saat ini berstatus open beta
- Queues menyediakan messaging yang dapat diskalakan dan pengelolaan pemrosesan background di atas Deno KV
API Dasar dan Cara Eksekusi
- API inti Deno Queues terdiri dari dua hal
.enqueue(): memasukkan pesan baru ke antrean agar dikirim segera atau pada waktu mendatang.listenQueue(): digunakan sebagai handler yang menerima dan memproses pesan baru dari antrean
- Alur dasarnya adalah membuka KV dengan
Deno.openKv(), mengirim pesan Slack dilistenQueue, lalu menetapkan{ delay: 60000 }padaenqueueagar diproses 60 detik kemudian - Penyimpanan berbeda tergantung lingkungan eksekusi
- Saat dijalankan secara lokal, menggunakan SQLite
- Saat dijalankan di Deno Deploy, menggunakan FoundationDB
- Di Deno Deploy, saat pesan siap diproses, V8 isolate dijalankan secara on-demand dan pesan didispatch
- Kode aplikasi cukup menerima pesan baru melalui handler
listenQueue, sementara pengelolaan eksekusi lainnya ditangani oleh Deno Deploy
Jaminan Pengiriman dan Retry
- Deno Queues menjamin at-least-once delivery
- Sebagian besar pesan yang di-enqueue hanya memanggil handler
listenQueuesatu kali, tetapi dalam beberapa kondisi kegagalan, handler yang sama dapat dipanggil beberapa kali demi menjamin pengiriman - Karena itu, aplikasi harus menangani pemrosesan pesan duplikat dengan aman
- Jika handler
listenQueuemelempar exception, runtime akan otomatis mencoba ulang pemanggilan tersebut - Retry berlanjut hingga berhasil atau mencapai jumlah maksimum retry; nilai maksimum default saat ini adalah 5 kali
- Pesan yang mencapai jumlah maksimum retry akan dihapus
Digunakan Bersama KV atomic transaction
- Deno Queues dapat digabungkan dengan KV atomic transactions
- Jika pesan di-enqueue sebagai bagian dari transaksi KV, pesan hanya masuk ke antrean ketika seluruh transaksi berhasil
- Contoh alurnya adalah memeriksa dan memperbarui saldo Bob dan Liz, lalu meng-enqueue pesan notifikasi untuk keduanya
- Memeriksa status dengan
check(bob, liz) - Mengurangi saldo Bob dan menambah saldo Liz
- Menambahkan pesan notifikasi masing-masing untuk Liz dan Bob dengan
enqueue - Seluruh perubahan dan enqueue baru diterapkan jika
commit()berhasil
- Memeriksa status dengan
- Status Deno KV juga dapat diperbarui di dalam handler
listenQueue - Untuk memastikan update per pesan hanya dilakukan satu kali, alur pencegahan pemrosesan duplikat dapat dibuat dengan menyimpan dan menghapus nonce
- Saat enqueue, simpan nonce bersama pesan
- Saat pemrosesan, jika nonce tidak ada, langsung return
- Saat pemrosesan berhasil, hapus nonce dan perbarui counter serta status saldo bersama-sama
Use Case yang Cocok untuk Antrean
- Antrean berguna untuk memperluas aplikasi karena memungkinkan server mengalihkan pemrosesan asinkron dan menjadwalkan pekerjaan mendatang
-
Notifikasi Email Terjadwal
- Ketika pekerjaan yang dimulai pengguna memakan waktu lama atau tidak perlu menunggu respons selesai, pekerjaan dapat dialihkan ke antrean agar responsivitas server atau aplikasi tetap terjaga
- Dalam contoh, pesan
welcome_emaillangsung di-enqueue, sedangkan pesansurvey_emaildijalankan tertunda dengan{ delay: 259200000 }
-
Pemrosesan Webhook yang Andal
- Dengan memasukkan request webhook ke antrean alih-alih langsung memprosesnya, respons dapat dipisahkan dari pemrosesan sebenarnya
- Menggunakan Oak bersama Queues, ketika menerima request POST ke
/webhook, body request dimasukkan ke antrean dan HTTP 200 dikembalikan - Pemrosesan webhook sebenarnya dilakukan secara asinkron di
listenQueuemelaluiprocessWebHook
-
Bot Slack·Discord
- Queues juga dapat digunakan untuk membangun bot Discord atau Slack
- Contoh aplikasi Slack reminder adalah kasus pembuatan aplikasi reminder Slack sederhana dengan Deno Queues
- Contoh bot Discord membuat giveaway dengan Deno Queues dan memungkinkan pengguna ikut serta dengan sekali klik
- Contoh penggunaan antrean lainnya dapat dilihat di docs.deno.com
Model Biaya
- Deno Queues tidak memiliki item biaya khusus yang terpisah
- Biaya dihitung berdasarkan operasi Deno KV dan request Deno Deploy
- Message enqueue: setiap operasi enqueue setara dengan 1 operasi penulisan KV
- Penerimaan pesan: setiap pesan yang diterima menimbulkan 1 penulisan KV dan 1 biaya request
- Strukturnya hanya menagih operasi yang digunakan
Dokumentasi dan Roadmap
- Dokumentasi terkait dan referensi API
- Untuk membuat web app dan server yang dapat diskalakan, konfigurasi yang mengalihkan pekerjaan background ke antrean diperlukan, tetapi pendekatan lama memiliki banyak tahap penyiapan
- Deno Queues tertanam di runtime dan berjalan di atas infrastruktur Deno Deploy, sehingga antrean terdistribusi serverless dapat digunakan hanya dengan beberapa baris kode
- Deno Queues diposisikan sebagai komponen untuk membuat pengembangan web lebih sederhana dan produktif bersama Deno KV, web standards APIs, npm, dan all-in-one modern tooling
- Feedback dan permintaan fitur dapat dikirim melalui Discord atau deploy_feedback issues
1 komentar
Opini Hacker News
Baru saja membongkar bagian dalam versi SQLite lokal dan merapikan catatan: https://til.simonwillison.net/deno/deno-kv#user-content-deno...
Bagian yang mungkin paling menarik adalah skema yang digunakan untuk fitur ini:
CREATE TABLE queue ( ts integer not null, id text not null, data blob not null, backoff_schedule text not null, keys_if_undelivered blob not null, primary key (ts, id) );CREATE TABLE queue_running( deadline integer not null, id text not null, data blob not null, backoff_schedule text not null, keys_if_undelivered blob not null, primary key (deadline, id) );CREATE INDEX kv_expiration_ms_idx on kv (expiration_ms);Bukankah indeks memang dirancang untuk kegunaan seperti itu?
Ini cukup baru, tapi juga agak mengkhawatirkan. Tentu saja mereka perlu mengomersialkannya, tetapi tidak harus sepenuhnya tertutup; untuk lapisan perluasan, mereka mungkin bisa memakai lisensi lain seperti BSL atau PolyForm
Menurut saya, arah yang diincar Deno di sini cukup berorientasi masa depan
Tahun ini saya baru pertama kali memakai Go, dan sebagian bahasanya sangat mirip dengan C. Selain hal-hal yang berbeda dari C, misalnya karena garbage collection kita bisa mengembalikan nilai dari fungsi yang tampak seperti pointer yang dialokasikan di stack, fitur bawaan seperti
map[string]stringjuga terasa masuk secara alami. Jika membuat bahasa baru setelah 2023, rasanya hampir tidak masuk akal kalau tidak ada sintaks bawaan untuk menangani tipe mapJadi, menurut saya logis jika ekosistem yang berpusat pada web server memiliki library untuk kemampuan primitif yang sering kita pakai, bahkan mungkin suatu hari sampai menjadi sintaks bahasa. Saya tidak ingat proyek terakhir di web server terdistribusi yang tidak memiliki key-value store untuk cache, mekanisme locking, bahkan antrean sementara. Sistem terdistribusi tanpa key-value store samar-samar mirip dengan bahasa pemrograman tanpa tipe map, dan ini benar-benar teknologi seperti pisau Swiss Army
Masalah potensialnya adalah Deno menempuh jalan ini sendirian. Sulit memastikan apakah fitur-fitur baru yang ditambahkan Deno saat ini juga akan tersedia di platform pesaing, dan meskipun API-nya dibuka sebagai open source, karena berada di namespace
Deno, saya tidak tahu apakah semuanya akan langsung berjalan saat ingin mengganti FoundationDB dengan Redis di AWSKarena itu, saya merasa ingin menghindari Deno. Sintaks dan fitur yang dieksposnya memang sangat menarik, tetapi saya khawatir setelah terikat, saya harus membedah kode besar-besaran agar bisa dideploy ke berbagai infrastruktur cloud. Banyak pelanggan meminta hal ini. Misalnya, jika suatu hari ingin menjual ke Oracle atau Salesforce dan mereka meminta agar bisa dijalankan on-premise, beban untuk menyesuaikan key-value store yang bisa mereka pakai dengan fungsi paket
Denoakan jatuh ke sayaIni pedang bermata dua. Deno bisa saja berhasil mendorong visi ini ke audiens yang lebih luas, tetapi untuk sementara saya rasa akan melihatnya dengan hati-hati
Saya sempat mencoba
kv-connect-kit, implementasi protokol ini dalam TypeScript murni, dan ia menyediakan API klien KV di runtime JavaScript apa pun. Termasuk Cloudflare Workers yang sama sekali tidak memiliki namespace DenoGitHub: https://github.com/skymethod/kv-connect-kit / npm: https://www.npmjs.com/package/kv-connect-kit / deno/x: https://deno.land/x/kv_connect_kit / demo: https://keyspace.deno.dev/
Protokolnya tampaknya bekerja seperti yang dijelaskan, dan menulis backend lain juga terlihat cukup sederhana
Industri teknologi sudah cukup banyak maju untuk keluar dari stack yang terkunci pada vendor, tetapi ini justru mengingatkan pada masa-masa itu
Saya tidak tahu apa perbedaan praktis antara
Deno.KVyang disertakan sebagai bagian dari runtime dan menambahkanimport KVdi bagian atas file. Yang terakhir bisa diimpor dari mana pun yang kita inginkan, baik di Deno maupun tempat lainLalu, seberapa besar kemungkinan tim Deno menyediakan binding untuk bahasa selain bahasa mereka sendiri? Kalau Google mulai memasukkan primitive khusus Google Cloud secara native ke Go, apakah itu akan disebut berorientasi masa depan?
Pada saat yang sama, hosting mandirinya sendiri juga harus setara atau lebih baik daripada para pemimpin industri. Jalan lain adalah meninggalkan hosting mandiri, lalu menyediakan solusi multicloud dengan margin tipis di atas adapter mitra hosting. Dengan begitu, Deno tidak perlu bersaing langsung sebagai penyedia hosting
Menurut saya ini bukan berorientasi masa depan, melainkan lebih dekat ke monetisasi Deno sebagai SaaS. Ini adalah hal yang dilakukan semua orang di dunia JavaScript belakangan ini dengan produk “cloud”: menempelkan framework lalu menjual ulang AWS. Karena itulah ada label harganya
Jika KV Deno bergantung pada FoundationDB, kecil kemungkinan mereka akan aktif membuat adapter untuk database lain. Mengganti teknologi database selalu merupakan pekerjaan besar, karena masing-masing punya kegunaan dan karakteristik performa yang berbeda
GC allowing one to return what look like stack allocated pointers from functionslebih karena escape analysis dan SSA, bukan karena garbage collectionArgumen bahwa “untuk memanfaatkan infrastruktur cloud publik, pengembang harus mengutak-atik kode boilerplate dan konfigurasi yang rumit sehingga banyak menyita waktu dan energi” sulit saya terima
Pada akhirnya kita sedang membangun infrastruktur yang harus stabil. Menghabiskan 30 menit untuk mengonfigurasi antrean SQS, teknologi yang sudah teruji, tidak terlihat lebih buruk daripada sepenuhnya memercayai antrean mainan yang dibuat Deno “di atas SQLite / FoundationDB”. Apakah biaya konfigurasi 30 menit dan “developer experience” yang lebih baik benar-benar sepadan dengan risiko itu? Lagi pula, seberapa sering kita mengatur antrean?
Sebagai programmer hobi, saya tidak terlalu sering memakai penyedia besar seperti AWS atau Google, karena kelihatannya cukup rumit. Kalau sudah terbiasa mungkin tidak seburuk itu
Saya juga ingin setiap proyek menjadi repositori independen di GitHub. Idealnya, siapa pun bisa dengan mudah menjalankan web app sebagai web app independen mereka sendiri di domain terpisah. Karena saya tidak ingin bertanggung jawab atas data orang lain
Ini agak mirip dengan use case Sandstorm. Instruksi instalasi seperti “coba secara lokal, lalu buat akun Deno Deploy jika ingin benar-benar memakainya” terdengar cukup masuk akal
Jika seseorang menyediakan library setara untuk cloud, pasti akan ada yang mengadopsinya. Dalam kasus Deno, mereka tampaknya mencari masalah umum yang dialami pengembang di ekosistemnya, lalu mencoba menyelesaikannya dengan membundel solusi yang cukup baik
Dengan memakai workflow engine yang mengabstraksikan antrean, kita bisa “tinggal menulis kode” tanpa mengelola task, schedule, state, dan retry
https://www.inngest.com/blog/how-durable-workflow-engines-wo...
Namun, saya penulis workflow engine, jadi saya bias
Dari pengalaman lama menangani “semantik pengiriman setidaknya sekali” dan “kode pengguna”, pengguna tidak benar-benar memahami pengiriman setidaknya sekali
Begitu pesan dikirim ulang, keluhan pengguna dan insiden akan membanjir
Menurut saya, entah kita melakukan hal yang nyaris mustahil dan menciptakan semantik pengiriman tepat sekali, atau kita harus selalu mengirim ulang 0,1% dari semua pesan agar pengguna tidak bisa bergantung pada asumsi bahwa pesan hanya dikirim sekali
Saat ini saya memakai Deno Deploy, dan untuk proyek yang saya buat sendiri, performanya sangat baik dan benar-benar sederhana
Dari sudut pandang seseorang yang pernah mengembangkan di AWS dalam tim besar, saya senang melihat arus yang menjauh dari kompleksitas agar bisa dengan mudah menjalankan sesuatu tanpa memikirkan konfigurasi. DNS juga sangat sederhana, dan sertifikat SSL otomatisnya benar-benar bagus. Saya sama sekali tidak punya keluhan terhadap arah produk ini, dan saya menantikan roadmap-nya
Kalau saya tidak melewatkan sesuatu, tampaknya hanya ada satu antrean untuk setiap instance
Deno.openKv()Pada versi lokal, mungkin kita bisa membuat beberapa antrean dengan memanggil
Deno.openKv("db-2.db")memakai path file SQLite yang berbeda setiap kali, tetapi untuk kebutuhan yang cukup umum, overhead-nya terlihat besarMungkin ini memang gaya arsitektur Deno. Saat membuat aplikasi kompleks dengan Deno, apakah yang diharapkan adalah struktur ala microservice, dengan beberapa skrip bekerja bersama dan masing-masing punya KV store serta antreannya sendiri?
Salah satu core developer mengonfirmasi di Discord: https://discord.com/channels/684898665143206084/115671428253...
Kutipannya: “Benar. Saat ini kami hanya mendukung satu antrean. Namun, Anda bisa melakukan multiplexing beberapa tipe pesan pada satu antrean.”
Bagaimana harganya?
Saya kira Deno semacam pengganti Node.js, apakah ada yang saya lewatkan? Bisakah ini dipakai secara lokal atau self-hosting tanpa biaya?
Karena “Queues are built on Deno KV”, penjelasannya adalah di lokal memakai SQLite, sedangkan di Deno Deploy memakai FoundationDB untuk ketersediaan dan throughput maksimum
Saya menulis sedikit lebih banyak tentang pola ini di sini: https://til.simonwillison.net/deno/deno-kv
Jika para pengembang kebetulan melihat ini, dari kegunaan KV yang saat ini sudah bagus, sisi kontrol akses sepertinya akan menimbulkan rasa sakit nantinya
Saya penasaran apakah solusinya hanya “implementasikan sendiri di user space dan jangan membuat bug”, atau apakah ada sesuatu yang direncanakan
Dukungan Jupyter baru-baru ini dan fitur antrean ini membuat saya antusias. Benar-benar keren
Namun, sepertinya saya tidak akan menulis server dengan Deno lalu menjalankannya di production di server saya sendiri. Saya tidak suka serverless
Model bisnis Deno dan Bun dibangun di sekitar serverless, yaitu Deno Deploy. Dan Deno Deploy adalah runtime lain lagi
Hal itu terlihat jelas pada KV dan antrean. Di lokal atau self-hosting, Anda mendapatkan versi yang sekadar hampir berjalan di atas teknologi lain
Dengan kata lain, Anda akan men-self-host versi Deno yang berbeda dari yang dipakai sebagian besar pelanggan Deno
Berapa banyak orang yang memakai Deno untuk menjalankan server di hardware mereka sendiri? Kalau jumlahnya kecil, saya lebih baik memakai Node
Deno benar-benar menarik. Model bisnis yang layak direalisasikan, usability yang baik, dan tidak ada pekerjaan remeh-temeh konfigurasi yang tidak perlu adalah hal-hal yang bagus
Deno sendiri pada dasarnya adalah Node.js ditambah kompilasi TypeScript otomatis. Biasanya itu hanya berarti perlu satu file konfigurasi tambahan. Saat proyek ini muncul, mereka sangat menonjolkan bahwa ini membebaskan kita dari ekosistem NPM yang berantakan, tetapi pada akhirnya mereka harus berbalik dan menambahkan dukungan NPM, sehingga pembeda itu pun hilang
Deno Deploy sama seperti layanan sejenis Lambda yang sudah ada puluhan. Penyimpanan KV dan sekarang queue setara dengan Redis, LevelDB, RocksDB, Dynamo, SQS, atau banyak opsi serupa lainnya. Saya masih belum melihat satu pun fitur yang benar-benar membedakan Deno dari yang lain
Jika Anda lebih suka satu perusahaan menangani semuanya—runtime bahasa, hosting komputasi, dan penyimpanan data—ini mungkin menarik. Namun secara pribadi saya ingin menghindarinya, apalagi jika perusahaan itu belum punya rekam jejak di bidang tersebut