Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Laravel 5

Menunda Tugas di Laravel Menggunakan Queues

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Meyria (you can also view the original English article)

Pada artikel ini, kita akan mengeksplorasi Queue API di web framework Laravel. Ini memungkinkan Anda untuk menunda tugas sumber daya-intensif selama eksekusi skrip untuk meningkatkan pengalaman pengguna akhir secara keseluruhan. Setelah memperkenalkan terminologi dasar, saya akan menunjukkannya dengan menerapkan contoh dunia nyata.

Waktu buka halaman adalah aspek penting dari situs web yang sukses, dan orang tidak boleh mengabaikan pentingnya hal itu karena hal itu mempengaruhi SEO situs dan keseluruhan pengalaman pengguna akhir juga. Lebih sering daripada tidak, Anda akhirnya perlu men-debug halaman web dengan waktu muat halaman yang panjang. Tentu saja, ada beberapa pendekatan berbeda yang dapat Anda gunakan untuk memperbaiki masalah ini.

Setelah diselidiki, Anda sering menyadari bahwa ada beberapa blok kode yang menyebabkan penundaan eksekusi halaman. Hal berikutnya yang dapat Anda coba adalah mengidentifikasi blok yang dapat ditangguhkan untuk diproses dan tidak berdampak nyata pada hasil akhir halaman saat ini. Itu benar-benar harus meningkatkan kecepatan halaman web secara keseluruhan karena kita telah menghilangkan blok kode yang menyebabkan penundaan.

Hari ini, kita akan mengeksplorasi konsep serupa dalam konteks web framework Laravel. Sebenarnya, Laravel sudah menyediakan API bawaan yang berguna untuk memungkinkan kita menunda pemrosesan tugas - Queue API. Tanpa menyia-nyiakan sebagian besar waktu Anda, saya akan melanjutkan dan mendiskusikan elemen dasar dari Queue API.

Driver, Koneksi, Queue, dan Pekerjaan

Tujuan dasar Queue API adalah menjalankan pekerjaan yang ditambahkan dalam queue. Selanjutnya, queue bisa termasuk dalam koneksi tertentu, dan koneksi itu mungkin termasuk driver queue tertentu yang dikonfigurasi dengan koneksi itu sendiri. Mari kita mencoba memahami apa yang baru saja saya katakan.

Driver Queue

Dengan cara yang sama Anda akan menggunakan driver yang berbeda untuk koneksi database Anda, Anda juga bisa memilih dari berbagai driver queue yang berbeda. Queue API mendukung berbagai adapter seperti database, beanstalkd, sqs, dan redis.

Driver queue hanyalah tempat yang digunakan untuk menyimpan informasi terkait queue. Jadi jika Anda menggunakan driver queue database, misalnya, pekerjaan baru akan ditambahkan di tabel pekerjaan di database. Di sisi lain, jika Anda telah mengonfigurasi redis sebagai driver queue default, pekerjaan akan ditambahkan ke redis server.

Queue API juga menyediakan dua driver queue khusus untuk tujuan pengujian—sinkronisasi dan null. Sinkronisasi driver queue digunakan untuk menjalankan tugas queue seketika, sementara driver queue null digunakan untuk melewatkan pekerjaan sehingga tidak akan dieksekusi sama sekali.

Koneksi

Saat Anda mengkonfigurasi API Antrian untuk pertama kalinya, Anda perlu menentukan koneksi default yang harus digunakan untuk pemrosesan queue default. Paling tidak, koneksi diharapkan bisa memberikan informasi berikut:

  • driver queue yang akan digunakan
  • nilai konfigurasi khusus driver queue
  • nama queue default dimana pekerjaan akan ditambahkan

Queues

Bila Anda menambahkan pekerjaan ke dalam queue, itu akan ditambahkan ke dalam queue default. Sebenarnya, itu pasti bagus dalam kebanyakan kasus, kecuali Anda memiliki pekerjaan yang perlu diberi prioritas lebih tinggi daripada pekerjaan lain. Dalam hal ini, Anda bisa membuat queue yang diberi nama tinggi dan menempatkan pekerjaan dengan prioritas lebih tinggi dalam queue tertentu.

Saat Anda menjalankan queue wotker yang memproses pekerjaan queue, Anda dapat secara opsional melewatkan parameter --queue, yang memungkinkan Anda mencantumkan nama queue sesuai urutan pemrosesannya. Misalnya, jika Anda menentukan --queue=high,default, awalnya akan memproses pekerjaan dalam queue tinggi, dan setelah selesai, ia menjemput pekerjaan di queue default.

Pekerjaan

Pekerjaan di Queue API adalah tugas yang ditangguhkan dari arus eksekusi utama. Misalnya, jika Anda ingin membuat thumbnail saat pengguna mengupload gambar dari front-end, Anda bisa membuat pekerjaan baru yang menangani pemrosesan gambar kecil. Dengan cara ini, Anda bisa menunda tugas pemrosesan gambar kecil dari aliran eksekusi utama.

Itu adalah pengantar dasar terminologi Queue API. Dari bagian selanjutnya dan seterusnya, kita akan membahas cara membuat queue job khusus dan menjalankannya dengan menggunakan Laravel queue worker.

Buat Tugas Queue Pertama Anda

Sekarang, Anda harus merasa yakin dengan pekerjaan antrian. Dari bagian ini dan seterusnya, kita akan menerapkan contoh dunia nyata yang menunjukkan konsep pekerjaan queue di Laravel.

Lebih sering daripada tidak, Anda berakhir dalam situasi di mana Anda perlu membuat versi gambar kecil yang berbeda dari gambar yang diunggah oleh pengguna. Dalam kebanyakan kasus, pengembang mencoba memprosesnya secara real time sehingga berbagai versi gambar dibuat saat pengguna mengupload gambar.

Tampaknya menjadi pendekatan yang masuk akal jika Anda ingin membuat beberapa versi dan tidak memakan banyak waktu di tempat pertama. Di sisi lain, jika Anda berurusan dengan aplikasi yang memerlukan pemrosesan yang berat dan dengan demikian menghabiskan lebih banyak sumber daya, pemrosesan real-time bisa berakhir dengan pengalaman pengguna yang buruk.

Pilihan yang jelas muncul di benak Anda adalah menunda pemrosesan generasi gambar kecil selambat mungkin. Pendekatan paling sederhana yang dapat Anda terapkan dalam skenario spesifik ini adalah menetapkan cron job yang memicu pemrosesan secara berkala, dan Anda seharusnya baik-baik saja.

Pendekatan yang jauh lebih baik, di sisi lain, adalah menunda dan mendorong tugas ke queue, dan membiarkan pekerja queue memprosesnya saat mendapat kesempatan untuk melakukannya. Di lingkungan produksi, pekerja queue adalah script daemon yang selalu berjalan dan memproses tugas dalam queue. Manfaat nyata dari pendekatan ini adalah pengalaman pengguna akhir yang jauh lebih baik, dan Anda tidak perlu menunggu cron dijalankan karena pekerjaan akan diproses sesegera mungkin.

Saya kira itu teori yang cukup untuk memulai implementasi yang sesungguhnya.

Dalam kasus kita, kita akan menggunakan database driver queue, dan mengharuskan kita membuat tabel jobs di database. tabel jobs memegang semua pekerjaan yang perlu diproses dalam menjalankan queue worker berikutnya.

Sebelum kita melanjutkan dan membuat tabel jobs, mari kita ubah defaulr konfigurasi queue dari sync ke database di file config/queue.php.

Sebenarnya, Laravel sudah menyediakan perintah artisan  yang membantu kita membuat tabel jobs. Jalankan perintah berikut di root aplikasi Laravel Anda, dan ini seharusnya membuat migrasi database yang diperlukan membuat tabel jobs.

File migrasi yang dihasilkan di database/migrations/YYYY_MM_DD_HHMMSS_create_jobs_table.php akan terlihat seperti ini:

Selanjutnya, mari jalankan perintah migrate sehingga benar-benar membuat tabel jobs dalam sebuah database.

Itu saja sejauh job migrasi diperhatikan.

Selanjutnya, mari buat model Image yang akan digunakan untuk mengelola gambar yang diunggah oleh pengguna akhir. Model gambar juga memerlukan tabel database yang terkait, jadi kita akan menggunakan opsi --migrate saat membuat model Image.

Perintah di atas harus membuat class model Image dan sebuah database yang terkait juga.

Class model Image akan terlihat seperti ini:

Dan file migrasi database seharusnya dibuat di database/migrations/YYYY_MM_DD_HHMMSS_create_images_table.php. Kami juga ingin menyimpan lokasi asli dari gambar yang diupload oleh pengguna akhir. Mari kita merevisi kode file migrasi database Image agar terlihat seperti berikut.

Seperti yang Anda lihat, kita telah menambahkan kolom $table->string('org_path') untuk menyimpan lokasi gambar asli. Selanjutnya, anda hanya perlu menjalankan perintah migrate untuk benar-benar membuat tabel tersebut dalam database.

Dan itulah sejauh ini sebagai model Image yang bersangkutan.

Selanjutnya, mari kita membuat pekerjaan queue sebenarnya yang bertanggung jawab untuk pengolahan gambar kecil. Untuk pengolahan gambar kecil, kita akan menggunakan library pengolahan gambar yang sangat populer—Intervention Image.

Untuk memasang library Intervention Image, lanjutkan dan jalankan perintah berikut pada root aplikasi anda.

Sekarang, saatnya untuk membuat class Job, dan kita akan menggunakan perintah artisan untuk melakukan itu.

Seharusnya itu membuat template class Job di app/Jobs/ProcessImageThumbnails.php. Mari kita ganti isi dari file yang sama dengan berikut.

Ketika queue worker mulai memproses setiap pekerjaan, Ini mencari metode handle. Jadi metode handle ini adalah yang memegang logika utama dari pekerjaan Anda.

Dalam kasus kita, kita perlu membuat gambar kecil dari gambar yang diupload oleh pengguna. Kode metode handle ini cukup sederhana—kita mengambil gambar dari model ImageModel dan membuat gambar kecil menggunakan library Intervention Image. Tentu saja, kita harus melalui model Image yang sesuai ketika kita mengirimkan tugas kita, dan kita akan melihatnya dalam sekejap.

Untuk menguji pekerjaan yang baru kita buat, kita akan menciptakan form upload sederhana yang memungkinkan pengguna untuk meng-upload gambar. Tentu saja, kita tidak akan segera membuat gambar kecil; kita akan menunda tugas itu sehingga dapat diproses oleh queue worker.

Mari kita buat file controller di app/Http/Controllers/ImageController.php, seperti yang ditunjukkan di bawah ini.

Mari kita membuat file view terkait di resources/views/upload_form.blade.php.

Akhirnya, mari kita tambahkan route untuk aksi index dan upload di dalam file routes/web.php.

Pada controller ImageController, metode index ini digunakan untuk membuat form upload.

Ketika pengguna mengirimkan sebuah form, metode upload dipanggil.

Pada awal metode upload, anda akan melihat file kode upload biasa yang memindahkan file yang diupload ke direktori public/images. Selanjutnya, kita tambahkan sebuah data database menggunakan model App/Image.

Akhirnya, kita gunakan pekerjaan ProcessImageThumbnails untuk menunda tugas pemrosesan gambar kecil. Hal ini penting untuk dicatat bahwa ini adalah metode dispatch yang digunakan untuk menunda tugas. Pada akhirnya, pengguna akan diarahkan ke halaman upload dengan pesan sukses.

Pada titik ini, pekerjaan ditambahkan ke tabel jobs untuk diproses. Mari kita konfirmasi dengan mengeluarkan query berikut.

Anda pasti bertanya-tanya, apa yang diperlukan untuk memproses pekerjaan selanjutnya? Jangan khawatir—itu adalah apa yang akan kita bahas pada bagian berikutnya.

Queue Worker

Pekerjaan queue worker Laravel adalah untuk memproses pekerjaan yang ter-queue untuk diproses. Sebenarnya, ada perintah artisan yang membantu kita untuk memulai proses queue worker.

Segera setelah anda menjalankan perintah, ini memproses pekerjaan yang tertunda. Dalam kasus kita, ini seharusnya memproses pekerjaan ProcessImageThumbnails yang ter-queue ketika pengguna meng-upload gambar sebelumnya.

Anda akan sadar bahwa ketika anda memulai queue worker, itu akan terus berjalan sampai anda menghentikannya secara manual atau menutup terminal. Pada kenyataannya, ini menunggu pekerjaan berikutnya untuk diproses. Segera ada pekerjaan baru dalam queue, ini akan diproses segera jika queue worker berjalan.

Tentu saja, kami tidak dapat tetap berjalan seperti ini, jadi kita perlu menemukan cara agar queue worker menjalankannya secara permanen di latar belakang.

Untuk menolong kita, ada beberapa alat manajemen proses diluar sana yang dapat anda pilih. Untuk beberapa nama, berikut daftarnya:

  • Circus
  • daemontools
  • Monit
  • Supervisor
  • Upstart

Anda harus memilih alat yang membuat anda nyaman dengan mengelola Laravel queue worker. Pada dasarnya, kita ingin memastikan bahwa queue worker harus berjalan tanpa batas waktu sehingga segera memproses pekerjaan queue.

Jadi itu adalah Queue API di penyelesaian Anda. Anda dapat menggunakannya dalam pengembangan hari-ke-hari anda untuk menunda tugas-tugas yang memakan waktu untuk kemajuan pengalaman pengguna akhir.

Kesimpulan

Pada artikel ini, kita membahas Queue API di Laravel, yang sangat membantu jika anda ingin menunda pemrosesan tugas-tugas yang memakan sumber daya.

Kami memulai dengan pengenalan dasar Queue API, yang melibatkan sebuah diskusi tentang koneksi, queue, dan pekerjaan. Di paruh kedua artikel, kita membuat pekerjaan queue khusus yang menunjukkan bagaimana anda dapat menggunakan Queue API di dunia nyata.

Bagi anda baik yang baru saja memulai dengan Laravel atau ingin memperluas pengetahuan anda, situs, atau aplikasi dengan ekstensi, kami memiliki berbagai hal yang anda dapat pelajari di Envato Market.

Jangan ragu untuk menggunakan form umpan balik di bawah ini untuk mengirim pertanyaan dan saran anda.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.