Membuat Driver Antrian Khusus Untuk Laravel - CRUDPRO

Membuat Driver Antrian Khusus Untuk Laravel

Membuat Driver Antrian Khusus Untuk Laravel

Pernahkah Anda menggunakan layanan antrian yang tidak didukung oleh Laravel? Tidak, Saya juga! Namun, baru-baru ini saya perlu mengubah konfigurasi untuk driver SQS untuk memanfaatkan beberapa pengaturan konfigurasi Amazon. Sayangnya, pengaturan ini tidak diekspos secara asli oleh Laravel, jadi saya memutuskan untuk membuat driver sendiri. Begini hasilnya.

Membuat Driver Antrian Khusus Untuk Laravel

Antrean Khusus (Custom Queue)

Pertama, Anda memerlukan kelas antrian baru. Ini akan bertanggung jawab untuk menempatkan pekerjaan, mengambil pekerjaan dan menghapus pekerjaan dari antrian serta mengumpulkan data seperti ukuran antrian saat ini.

Membuat kelas yang mengimplementasikan antarmuka Illuminate\Contracts\Queue\Queue Laravel. Melihat antarmuka ini, Anda akan melihat bahwa Anda perlu menerapkan 7 metode:

  • size — mengembalikan jumlah pekerjaan saat ini di antrian
  • push — dorong pekerjaan baru ke antrian
  • pushRaw — mendorong muatan mentah ke antrian
  • nanti — dorong pekerjaan baru di antrian untuk diproses nanti
  • pushOn — dorong pekerjaan baru ke antrian tertentu
  • laterOn — dorong pekerjaan baru pada antrian yang diberikan untuk diproses nanti
  • pop — ambil pekerjaan dari antrian

Tentukan metode ini untuk layanan antrian yang Anda berikan.

Konektor Kustom

Sekarang, Anda perlu membuat kelas konektor antrian kita sendiri. Ini akan bertanggung jawab untuk menghubungkan ke layanan antrian pilihan Anda. Tentukan sendiri sebuah kelas dan implementasikan Illuminate\Queue\Connectors\ConnectorInterface Laravel

Sekali lagi, melihat antarmuka ini akan memberi tahu Anda bahwa Anda hanya memerlukan satu metode dalam implementasi Anda, connect(array $config)

Metode ini menerima array opsi konfigurasi yang didefinisikan dalam file konfigurasi config/queue.php. Lebih lanjut tentang itu nanti.

Dari metode ini, Anda perlu mengembalikan implementasi antrian kustom yang Anda tentukan di atas.

Penyedia Layanan Antrian

Sekarang, bagaimana kami membuat Laravel tahu tentang driver antrian baru Anda? Sederhana, tambahkan ke penyedia layanan. Anda dapat menambahkan ini ke penyedia layanan yang ada atau membuat yang baru di baris perintah dengan php artisan make:provider QueueServiceProvider

Dalam metode boot penyedia layanan, tambahkan yang berikut ini:

$manager = $this->app['queue']; 
$manager->addConnector('your-custom-driver-name', function() {
   return new YourCustomConnector;
});

Mari kita uraikan ini:

$manager = $this->app['queue']; mengambil manajer antrian dari wadah aplikasi.

Kemudian kami menggunakan metode addConnector pada instance queue manager untuk mengikat konektor kustom baru Anda.

Berikan metode addConnector dengan nama untuk driver Anda. Dalam kasus saya, ini adalah custom-sqs-worker. Anda akan menggunakan nama ini saat menentukan konfigurasi antrian, jadi pastikan ini jelas bagi Anda dan, yang lebih penting, jelas bagi mereka yang mungkin mempertahankan kode Anda di masa mendatang. Parameter kedua dalam metode addConnector adalah penutupan. Dari penutupan ini, Anda harus mengembalikan instance konektor kustom yang baru Anda tentukan. Bagi saya, ini adalah CustomSqsConnector.

konfigurasi

Sekarang Anda cukup siap untuk pergi, yang tersisa hanyalah menambahkan konfigurasi ke config/queue.php. Buka file ini dan tambahkan konfigurasi yang diperlukan ke array koneksi. Kuncinya harus nama driver Anda (seperti yang disediakan untuk addConnector di penyedia layanan antrian di atas) dan nilainya harus berupa array opsi konfigurasi yang diperlukan oleh driver Anda. Anda mungkin ingat dari artikel sebelumnya bahwa ini diteruskan ke metode koneksi kelas konektor.

Itu dia! Anda sekarang dapat memperbarui driver antrian default Anda untuk memanfaatkan implementasi yang baru Anda buat. Kerja bagus!

Bacaan lebih lanjut

Di luar kotak, Laravel dipersiapkan untuk mengambil hanya satu pekerjaan dari antrian pada satu waktu. Amazon SQS menyediakan opsi untuk mengambil hingga 10 pekerjaan per pengambilan. Ini adalah sesuatu yang ingin saya manfaatkan.

Untuk menunjukkan proses ini, kita perlu mengambil langkah mundur dan melihat beberapa kode default pekerja Laravel.

Saat menjalankan php artisan queue:work, di bawah tenda, laravel akhirnya akan memanggil runNextJob di kelas Illuminate\Queue\Worker.

Seperti biasa dengan Laravel, petunjuknya ada di API di sini. Metode ini akan mengambil pekerjaan berikutnya dari antrian dan menjalankannya.

Di sini kami tertarik dengan kondisi ini:

if ($job) { 
    return $this->process( $connectionName, $job, $options ); 
}

Metode ini hanya mengharapkan satu pekerjaan, tetapi antrian khusus saya akan mengembalikan array hingga 10 pekerjaan. Dengan demikian, implementasi pekerja Laravel asli tidak akan sesuai dengan kebutuhan saya.

Untuk menyiasatinya, saya hanya perlu memperbarui metode runNextJob. Tidak peduli bagaimana pekerjaan antrian dijalankan, Laravel akan selalu menggunakan metode ini untuk menjalankan pekerjaan.

Dengan pemikiran ini, saya membuat kelas baru yang memperluas kelas pekerja asli dan mengganti metode ini. Metode saya terlihat sedikit seperti ini:

if ($jobs) {     //if the job isn't an array, make it so if(!is_array($jobs)) 
    $jobs = [$jobs];
 
    //loop over the jobs 
    foreach($jobs as $job) {
 
        //run the process method on each job 
        $this->process( $connectionName, $job, $options );     }     return true; 
}

Bagus, ini seharusnya berhasil, tetapi bagaimana cara membuat Laravel menggunakannya?

Kembali ke penyedia layanan antrian yang dibuat sebelumnya di artikel dan tambahkan yang berikut ini:

$this->app->singleton('queue.worker', function ($app) { 
    return new SqsCustomWorker( 
        $app['queue'], $app['events'],      
        $app['Illuminate\Contracts\Debug\ExceptionHandler'] 
    ); 
});

Sederhananya, ini akan memperbarui pekerja antrian yang dipakai dalam wadah aplikasi dengan implementasi khusus Anda. Konstruktor pekerja menerima manajer antrian, peristiwa aplikasi terdaftar, dan penangan pengecualian yang dapat kita ambil dari wadah.

Itu saja, Laravel sekarang akan menggunakan pekerja baru Anda.

Saya harap artikel ini bermanfaat dan dapat membantu anda. Jika Anda memiliki pertanyaan atau komentar, tulis saja di kolom komentar ya! Terimakasih.