Pendahuluan
Queuety adalah plugin WordPress yang menyediakan antrean job cepat, mesin workflow persisten, dan runtime mesin status persisten. Worker mengambil job langsung dari MySQL dan memprosesnya dalam proses WP-CLI yang berjalan lama. Runtime PHP yang memuat WordPress dan WP-CLI memerlukan mysqli atau pdo_mysql.
Mengapa Queuety?
WordPress tidak memiliki sistem job latar belakang yang sesungguhnya. wp_cron hanya berjalan saat halaman dikunjungi. Runner bawaan Action Scheduler berjalan melalui WP-Cron dan permintaan HTTP loopback, masing-masing memproses batch selama paling lama 30 detik. Pemanggilan API LLM yang memakan waktu 60 detik akan dihentikan oleh batas waktu 30 detik milik PHP. Tidak ada cara untuk menjalankan proses multi-langkah yang tetap bertahan saat terjadi crash dan melanjutkan dari titik terakhir.
Queuety mengatasi ini dengan tiga primitif:
- Job untuk pekerjaan latar belakang yang dijalankan tanpa menunggu hasil
- Workflow untuk proses multi-langkah persisten dengan status yang disimpan
- Mesin status untuk status siklus hidup berbasis event yang berlangsung lama
Contoh singkat
Kirim job menggunakan API modern:
use Queuety\Contracts\Job;
use Queuety\Dispatchable;
readonly class SendEmailJob implements Job {
use Dispatchable;
public function __construct(
public string $to,
public string $subject,
public string $body,
) {}
public function handle(): void {
wp_mail( $this->to, $this->subject, $this->body );
}
}
SendEmailJob::dispatch( 'user@example.com', 'Welcome', 'Hello from Queuety!' );
Atau gunakan pendekatan nama handler klasik:
use Queuety\Queuety;
Queuety::dispatch( 'send_email', [ 'to' => 'user@example.com' ] );
Jalankan workflow persisten:
Queuety::workflow( 'generate_report' )
->then( FetchDataHandler::class )
->then( CallLLMHandler::class )
->then( FormatOutputHandler::class )
->dispatch( [ 'user_id' => 42 ] );
Modelkan sesi jangka panjang dengan mesin status:
use Queuety\Enums\StateMachineStatus;
Queuety::machine( 'agent_session' )
->state( 'awaiting_user' )
->on( 'user_message', 'planning' )
->state( 'planning' )
->action( PlanSessionAction::class )
->on( 'planned', 'completed' )
->state( 'completed', StateMachineStatus::Completed )
->dispatch( [ 'thread_id' => 42 ] );
Mulai worker:
wp queuety work
Jika Anda membangun sistem bergaya agen, mulailah dengan Orkestrasi Agen. Bagian ini menunjukkan bagaimana alur planner/executor, gerbang tinjauan manusia, dan penantian lintas workflow saling terhubung.
Jika sistem Anda berbasis event dan berumur panjang, mulailah dengan Mesin Status bersama workflow.
Jika Anda menginginkan contoh integrasi menyeluruh, lihat Contoh, yang kini mencakup pola berbasis Neuron untuk pergantian penyedia, streaming, pengulangan tinjauan berbasis memori, dan workflow yang saling bergantung.
Jika Anda ingin workflow dimulai dari event domain WordPress seperti save_post, lihat Pemicu Aksi.
Jika Anda ingin menggunakan runtime berbasis DB di luar WordPress, lihat Penggunaan Mandiri.
Pembeda utama
- Eksekusi cepat. Worker menggunakan akses langsung ke antrean MySQL dan menghindari pola cron per permintaan yang memperlambat pekerjaan latar belakang di WordPress.
- Alur kerja tahan lama. Proses multi-langkah dengan status persisten yang bertahan dari batas waktu PHP, crash, dan percobaan ulang. Setiap batas langkah adalah transaksi MySQL yang atomik.
- Mesin status eksplisit. Modelkan sesi chat, persetujuan, dan siklus hidup jangka panjang lainnya dengan status bernama, transisi yang dibatasi, tindakan masuk status yang diantrekan, dan linimasa peristiwa yang tahan lama.
- Dispatch modern API. Kelas job mandiri dengan trait
Dispatchable, properti konstruktor bertipe sebagai payload, serta$tries/$timeout/$backoffyang dideklarasikan pada kelas. Kelasreadonlytidak dapat memberikan nilai default untuk properti ini, jadi deklarasikan pada kelas biasa dengan properti konstruktor promoted readonly. - Pipeline middleware. Middleware bergaya onion untuk pembatasan laju, pembatasan pengecualian, job unik, dan logika khusus. Dideklarasikan per job melalui metode
middleware(). - Langkah streaming. Antarmuka
StreamingStepmenghasilkan potongan yang langsung disimpan ke database. Saat dicoba ulang, potongan yang sebelumnya tersimpan diberikan agar stream dapat dilanjutkan dari bagian terakhir. Ideal untuk respons LLM dan unduhan besar. - Lapisan cache yang dapat dipasang.
CacheFactorymendeteksi APCu secara otomatis atau menggunakan cache dalam memori sebagai cadangan. Backend khusus mengimplementasikanContracts\Cache. Digunakan secara internal untuk pencarian pembatas laju dan status antrean. - Batch dan rantai. Dispatch kelompok job dengan callback
then/catch/finallydan pelacakan progres, atau rangkai job secara berurutan sehingga setiap job bergantung pada penyelesaian job sebelumnya. - Penundaan dan penantian tahan lama.
delay()menambahkan penundaan yang aman saat proses dimulai ulang.wait_for_signal(),wait_for_signals(),wait_for_approval(),wait_for_input(), danwait_for_workflow()memungkinkan alur kerja berhenti sementara menunggu peristiwa eksternal atau alur kerja lain tanpa menjaga PHP tetap hidup. - For-each dinamis.
for_each()memperluas pekerjaan cabang yang ditemukan saat runtime dari status alur kerja dan mendukung mode penyelesaian semua berhasil, berhasil pertama, dan kuorum. - Serah terima alur kerja asinkron.
start_workflows()mengubah item yang ditemukan saat runtime menjadi alur kerja tingkat atas yang independen dan dapat ditunggu kemudian. - Pemicu tindakan WordPress.
on_action()memetakan hook tindakan inti atau plugin ke dispatch alur kerja tahan lama dengan gating dan idempotensi. - Artefak tahan lama. Simpan output alur kerja bernama di luar kantong status utama dan sertakan dalam pemeriksaan status, CLI, ekspor, dan pemutaran ulang.
- Pagar pengaman alur kerja.
version(), hash definisi deterministik, kunci dispatch idempoten, dan anggaran alur kerja memudahkan pemeriksaan proses bergaya agen serta mengurangi risiko duplikasi atau berjalan tanpa kendali secara diam-diam. - Manajemen sumber daya. Grup konkurensi, unit biaya, anggaran alur kerja, dan penerimaan worker membantu menjaga pekerjaan mahal bergaya agen tetap dalam batas yang ditentukan.
- Kompensasi langkah.
compensate_with()dancompensate_on_failure()menyediakan hook rollback untuk langkah yang telah selesai saat alur kerja dibatalkan atau gagal. - Heartbeat. Langkah yang berjalan lama mengirim heartbeat untuk mencegah sistem pemulihan job usang mengambil alih pekerjaan yang masih aktif.
- Pelacakan alur kerja. Setiap transisi langkah dicatat bersama input, output, status sebelum/sesudah, konteks, artefak, potongan, error, dan debugging perjalanan waktu melalui
workflow_state_at(). - Langkah paralel. Jalankan langkah secara bersamaan dan tunggu semuanya selesai sebelum melanjutkan.
- Percabangan bersyarat. Lewati ke langkah bernama berdasarkan status sebelumnya menggunakan
_next_step. - Jalankan Alur Kerja. Mulai alur kerja anak yang mengirimkan hasil kembali ke induknya.
- Antrean prioritas. Empat tingkat (Low, Normal, High, Urgent) melalui enum PHP yang aman terhadap tipe.
- Worker multi-antrean. Memproses beberapa antrean dengan urutan prioritas ketat dalam satu worker.
- Pembatasan laju. Batas eksekusi per handler dengan jendela geser.
- Job berulang. Penjadwalan berbasis interval dan berbasis cron dengan kebijakan tumpang tindih yang dapat dikonfigurasi (Allow, Skip, Buffer).
- Pembatalan alur kerja. Batalkan alur kerja yang berjalan dan picu handler pembersihan yang terdaftar.
- Pemangkasan status. Hapus output langkah lama secara otomatis agar status alur kerja besar tetap mudah dikelola.
- Konkurensi worker.
--workers=Nmembuat beberapa proses dengan mulai ulang otomatis saat terjadi crash. - Observabilitas penuh. Pencatatan database, metrik per handler, dan webhook peristiwa.
- Utilitas pengujian.
QueueFakemencatat job dan batch yang di-dispatch untuk assertion dalam pengujian unit. - Atribut PHP.
#[QueuetyHandler('name')]untuk pendaftaran handler tanpa konfigurasi.
Cara kerjanya
Worker berjalan di dalam proses WP-CLI yang berumur panjang dan mengambil job langsung dari MySQL. Baris antrean, status alur kerja, log, batch, sinyal, dan potongan streaming semuanya tersimpan di MySQL, sehingga mulai ulang worker tidak menghilangkan status orkestrasi.
Alur kerja membagi pekerjaan yang berjalan lama menjadi beberapa langkah. Setiap langkah menyimpan outputnya ke kantong status bersama di database. Jika PHP mati di tengah langkah, worker akan mencoba ulang langkah tersebut dengan semua status sebelumnya tetap utuh. Batas langkah merupakan satu transaksi MySQL: pembaruan status, penyelesaian job, dan pengantrean langkah berikutnya semuanya terjadi secara atomik.
Workflow: generate_report (3 steps)
Step 0: fetch_data -> state: {user_data: {...}}
Step 1: call_llm -> PHP dies -> retry -> state: {user_data: {...}, llm_response: "..."}
Step 2: format_output -> state: {user_data: {...}, llm_response: "...", report_url: "/reports/42.pdf"}
Workflow: completed
Persyaratan
- PHP 8.2 atau yang lebih baru
- WordPress 6.4 atau yang lebih baru
- MySQL 8.0+ atau MariaDB 10.6+, karena worker mengambil job dengan
SELECT ... FOR UPDATE SKIP LOCKED mysqliataupdo_mysqldi runtime PHP yang memuat WordPress dan WP-CLI- WP-CLI untuk menjalankan worker khusus dengan
wp queuety work - Ekstensi
pcntldanposixPHP untuk kumpulan worker (--workers,--min-workers,--max-workers)
Lihat Memulai untuk instalasi.