Panduan

Cara Menjalankan Tugas Latar Belakang dalam Aplikasi Web: Queue, Penjadual dan Cron

Untuk menjalankan tugas latar belakang dalam aplikasi web, mula-mula bahagikan kerja kepada dua jenis. Tugas yang dicetuskan (hantar e-mel alu-aluan, proses muat naik) boleh disimpan dalam queue tugas, selalunya jadual dalam pangkalan data anda, dan dikendalikan oleh pekerja dengan percubaan semula. Tugas berjadual (laporan malam, peringatan setiap 15 minit) memerlukan sesuatu yang berjalan mengikut jadual: ciri cron hos, atau penjadual luaran yang memanggil titik akhir yang dilindungi dalam aplikasi anda. Sentiasa pastikan tugas selamat untuk dijalankan dua kali, rekod kegagalan, dan jangan bergantung pada pemasa dalam pelayan yang boleh melelap atau dimulakan semula.

Panduan ini menerangkan pilihan, bila setiap satu sesuai, dan cara menyediakannya dengan pembina aplikasi AI, termasuk pada hos yang diskalakan ke sifar.

Apa yang dikira sebagai tugas latar belakang

Apa sahaja yang perlahan, tidak boleh dipercayai atau tidak diperlukan untuk respons segera pengguna:

  • Menghantar e-mel, pemberitahuan dan resit
  • Menukar saiz imej, transkod video, menjana PDF
  • Memanggil API pihak ketiga yang perlahan, termasuk model AI untuk tugas panjang
  • Mengimport atau menyegerakkan data daripada sistem lain
  • Pembersihan malam, laporan dan peringatan

Melakukannya dalam permintaan menjadikan halaman perlahan dan rapuh: jika pembekal e-mel tidak berfungsi, pendaftaran pengguna gagal. Memindahkannya ke latar belakang bermakna pengguna mendapat respons serta-merta dan tugas itu boleh dicuba semula.

Pilihannya

PilihanCara ia berfungsiKelebihanKekurangan
Fire-and-forget dalam proses yang samaBalas, kemudian teruskan kerja dalam pelayanTiada persediaanHilang jika pelayan berhenti; tiada percubaan semula
Pemasa dalam proses (setInterval, setTimeout)Pemasa dalam pelayan yang berjalanSangat mudahTidak berjalan semasa melelap; berganda dengan beberapa salinan
Queue berasaskan pangkalan dataTugas disimpan sebagai baris; pekerja mengambil dan menjalankannyaGuna pangkalan data sedia ada; tahan lasak; mudah diperiksaAnda membina percubaan semula dan penguncian; perlu sesuatu untuk menjalankan pekerja
Queue khusus (berasaskan Redis atau diurus)Perkhidmatan queue dan pekerjaCiri percubaan semula dan penjadualan yang matangSatu lagi perkhidmatan untuk dijalankan dan dibayar
Perkhidmatan tugas atau aliran kerja dihoskanPihak ketiga memanggil titik akhir anda dengan percubaan semula dan jadualPenjadualan dan percubaan semula dikendalikan untuk andaKebergantungan vendor; satu lagi akaun dan kunci
Penjadual luaran yang memanggil titik akhirPemasa di tempat lain menghantar permintaan HTTP mengikut jadualBerfungsi pada mana-mana hos, termasuk yang diskalakan ke sifarSelang minimum dan kelewatan; lindungi titik akhir
Cron terbina dalam hosPlatform menjalankan arahan mengikut jadualMudah di tempat ia wujudTidak semua hos menawarkannya

Tiada jawapan tunggal yang betul. Aplikasi kecil selalunya hanya memerlukan queue pangkalan data dan penjadual luaran.

Mengapa hos yang diskalakan ke sifar mengubah gambaran

Banyak hos moden meletakkan aplikasi anda dalam keadaan tidur apabila tiada siapa menggunakannya dan membangunkannya pada permintaan seterusnya. Itu menjimatkan wang, tetapi pelayan yang tidur tidak menjalankan kod: pemasa tidak berbunyi dan pekerja tidak meninjau. Pada hos ini, kerja berjadual mesti bermula dengan permintaan masuk, dan sumber permintaan yang paling mudah ialah penjadual luaran. Setiap panggilan membangunkan aplikasi (dan selalunya pangkalan datanya), jadi memanggil setiap minit kosnya lebih daripada setiap 15 minit. Pilih jadual paling perlahan yang memenuhi keperluan.

Corak 1: queue pangkalan data

Untuk tugas yang dicetuskan:

  1. Cipta jadual jobs: jenis, muatan (JSON), status (pending, running, done, failed), percubaan, run_after, last_error, cap masa.
  2. Apabila sesuatu berlaku, masukkan baris tugas dalam transaksi yang sama dengan perubahan yang menyebabkannya, supaya kedua-duanya berjaya atau gagal bersama.
  3. Pekerja mengambil tugas yang sudah tiba, menandakannya running, melakukan kerja dan menandakannya done.
  4. Jika gagal, tambah attempts, tetapkan run_after lebih lewat (contohnya 1, 5, kemudian 30 minit) dan simpan ralat. Selepas had maksimum, tandakan failed dan beritahu seseorang.

Jika lebih daripada satu pekerja mungkin berjalan serentak, tugas mesti diambil dengan selamat. Pada Postgres, SELECT ... FOR UPDATE SKIP LOCKED membolehkan setiap pekerja mengambil baris yang berbeza tanpa bertembung.

Apa yang menjalankan pekerja? Pada pelayan yang sentiasa hidup, gelung dalam proses berasingan. Pada hos yang diskalakan ke sifar, titik akhir berjadual dalam Corak 2 boleh memproses sekumpulan tugas yang sudah tiba pada setiap panggilan.

Corak 2: penjadual luaran yang memanggil aplikasi anda

Untuk tugas berjadual:

  1. Tambah titik akhir seperti POST /api/cron/send-reminders.
  2. Lindunginya: minta token rahsia dalam header, disimpan sebagai rahsia di kedua-dua belah, dan tolak apa sahaja yang lain.
  3. Jadikan ia idempoten: menjalankannya dua kali dalam minit yang sama tidak boleh menghantar dua peringatan. Rekod apa yang telah dihantar.
  4. Pastikan setiap panggilan pendek: proses satu kumpulan (katakan 100 item) dan biarkan panggilan seterusnya mengambil yang lain.
  5. Tunjukkan penjadual ke titik akhir itu.

Pilihan penjadual:

  • Aliran kerja berjadual GitHub Actions. Percuma dalam had penggunaan GitHub. Setakat September 2026, dokumentasi GitHub menyatakan selang terpendek ialah sekali setiap 5 minit, larian mungkin tertangguh pada waktu sibuk (terutamanya pada permulaan setiap jam), jadual menggunakan UTC secara lalai, dan aliran kerja berjadual dalam repositori awam dimatikan selepas 60 hari tanpa aktiviti repositori.
  • Perkhidmatan cron dihoskan. Banyak perkhidmatan wujud yang tugas satu-satunya ialah memanggil URL mengikut jadual. Semak kebolehpercayaan, selang minimum dan amaran sebelum anda bergantung kepadanya.
  • Penjadual penyedia awan anda. Jika anda sudah menggunakan penyedia awan besar, ia akan mempunyai penjadual terurus yang boleh memanggil titik akhir HTTPS.
  • Perkhidmatan tugas atau aliran kerja dihoskan. Ini menggabungkan penjadualan, queue dan percubaan semula, dan memanggil titik akhir anda untuk setiap langkah. Bandingkan harga dan had di laman setiap vendor.

Corak 3: biarkan penyedia melakukannya

Kadangkala tugas latar belakang terbaik ialah tiada langsung:

  • Pembayaran. Stripe mencuba semula pembayaran langganan yang gagal dan menghantar webhook; anda bertindak balas dan bukannya meninjau. Lihat apa itu webhook.
  • E-mel. Penyedia meng-queue dan mencuba semula penghantaran sebaik sahaja anda menyerahkan mesej.
  • Kerja AI berkelompok. OpenAI dan Anthropic menawarkan API kelompok untuk permintaan tidak mendesak yang anda hantar dan kumpulkan kemudian.

Arahan untuk pembina AI anda

Untuk queue:

Tambah queue tugas latar belakang menggunakan jadual jobs dalam pangkalan data kami (jenis, muatan JSON, status, attempts, run_after, last_error). Apabila pengguna mendaftar, masukkan tugas send_welcome_email dalam transaksi yang sama dan bukannya menghantar secara sebaris. Tambah fungsi processJobs(limit) yang mengambil tugas yang sudah tiba dengan SELECT ... FOR UPDATE SKIP LOCKED, menjalankannya, dan mencuba semula kegagalan selepas 1, 5 dan 30 minit, menandakannya failed selepas 4 percubaan.

Untuk pencetus berjadual:

Tambah POST /api/cron/tick yang dilindungi oleh token bearer dari rahsia CRON_SECRET; tolak apa-apa permintaan tanpanya. Setiap panggilan menjalankan processJobs(100) dan menghantar peringatan tempahan yang tiba dalam 24 jam akan datang yang belum dihantar, sambil merekod peringatan yang dihantar supaya tiada apa dihantar dua kali. Pulangkan ringkasan JSON tentang apa yang dijalankan. Kemudian tulis aliran kerja GitHub Actions yang memanggil titik akhir ini setiap 15 minit, membaca URL dan token daripada rahsia repositori.

Kesilapan biasa

  • Bergantung pada setInterval. Ia berhenti secara senyap apabila pelayan melelap atau dimulakan semula, dan berganda apabila dua salinan berjalan.
  • Titik akhir cron yang tidak dilindungi. Sesiapa yang menemuinya boleh mencetuskan tugas anda, atau bil e-mel anda.
  • Tugas yang tidak idempoten. Percubaan semula dan panggilan penjadual berganda akan berlaku. Reka untuk itu.
  • Tiada keterlihatan kegagalan. Tugas yang gagal secara senyap selama seminggu lebih teruk daripada yang gagal dengan kuat. Log ralat dan beri amaran tentang kegagalan berulang.
  • Larian panjang dalam satu permintaan. Permintaan tamat masa. Proses dalam kelompok.
  • Penjadualan terlalu kerap. Setiap panggilan pada hos yang diskalakan ke sifar membangunkan dan mengenakan bayaran kepada aplikasi. Padankan selang dengan keperluan sebenar.
  • Zon masa. “9 pagi” bermaksud perkara berbeza bagi penjadual anda (selalunya UTC) dan pengguna anda. Simpan masa dalam UTC dan tukar mengikut pengguna.
  • Rahsia dalam fail aliran kerja. Simpan token dalam stor rahsia penjadual. Lihat cara menjaga kunci API dengan selamat.

Senarai semak

  • Kerja perlahan dipindahkan keluar daripada permintaan pengguna
  • Tugas disimpan secara tahan lasak, bukan hanya dalam memori
  • Percubaan semula dengan kelewatan yang semakin meningkat dan had maksimum
  • Setiap tugas selamat untuk dijalankan dua kali
  • Titik akhir berjadual dilindungi oleh token rahsia
  • Setiap larian memproses kelompok yang terhad
  • Tugas gagal kelihatan, dengan amaran
  • Selang jadual dipilih dengan mengambil kira kos hosting
  • Masa disimpan dalam UTC

Tugas latar belakang dalam Mythex

Dokumentasi Mythex tidak menerangkan tugas berjadual atau cron, dan aplikasi terbit serta pangkalan datanya melelap apabila tidak aktif dan bangun pada permintaan seterusnya (lihat Had hosting). Jadi jangan bergantung pada pemasa dalam aplikasi anda. Pendekatan yang berfungsi ialah yang dinyatakan di atas: minta ejen jadual jobs dan titik akhir yang dilindungi token, kemudian tunjukkan penjadual luaran ke URL terbit anda. Simpan token sebagai rahsia projek, dan ingat bahawa setiap kali aplikasi dikejutkan ia menggunakan kredit untuk masa aplikasi dan pangkalan data terjaga, jadi pilih selang yang munasabah. Jika aplikasi anda memerlukan backend API untuk ini, resipi backend REST API ialah titik permulaan, dan cara membina REST API meliputi reka bentuk titik akhir. Jika pekerja atau bot yang sentiasa hidup ialah teras produk anda, hos yang dibina untuk proses berterusan mungkin lebih sesuai.

Soalan lazim

Apakah tugas latar belakang?

Tugas latar belakang ialah kerja yang dilakukan aplikasi anda di luar permintaan yang sedang ditunggu pengguna, seperti menghantar e-mel, menukar saiz imej, menjana laporan atau menyegerakkan data. Pengguna mendapat respons pantas, dan tugas itu berjalan berasingan serta boleh dicuba semula jika gagal.

Bagaimana saya menjalankan tugas berjadual jika hos saya tiada cron?

Tambah titik akhir yang dilindungi yang melakukan kerja itu, kemudian minta penjadual luaran memanggilnya mengikut jadual. Pilihannya termasuk aliran kerja GitHub Actions berjadual, perkhidmatan cron dihoskan, atau penjadual penyedia awan anda. Lindungi titik akhir dengan token rahsia.

Bolehkah saya guna setInterval atau setTimeout untuk tugas berjadual?

Hanya untuk tugas kecil yang tidak penting pada pelayan yang sentiasa berjalan. Jika pelayan dimulakan semula, diskalakan ke sifar atau menjalankan beberapa salinan, pemasa hilang atau berjalan lebih daripada sekali. Simpan kerja berjadual dalam pangkalan data atau gunakan penjadual.

Adakah Mythex menyokong cron jobs?

Dokumentasi Mythex tidak menerangkan tugas berjadual atau cron, dan aplikasi terbit melelap apabila tidak aktif. Pendekatan yang boleh dipercayai ialah penjadual luaran yang memanggil titik akhir yang dilindungi dalam aplikasi anda, yang mengejutkan aplikasi dan menjalankan kerja itu.

Mythex · Pricing · Bina apa sahaja dengan AI · Templat laman web dan aplikasi · Mythex dibandingkan · Glosari pembinaan aplikasi AI · Alat percuma untuk membina aplikasi dengan AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)