
Hanya versi terbaru yang akan mendapatkan fitur baru. Perbaikan bug akan diberikan menggunakan skema berikut:
| Versi Paket | Versi Laravel | Perbaikan Bug Hingga | |
|---|---|---|---|
| 13 | 9 | 8 Agustus 2023 | Dokumentasi |
Anda dapat menginstal paket ini melalui composer menggunakan perintah ini:
composer require vladimir-yuldashev/laravel-queue-rabbitmq
Paket akan otomatis mendaftar sendiri.
Tambahkan koneksi ke config/queue.php :
Ini adalah konfigurasi minimal agar koneksi/driver RabbitMQ berfungsi.
' connections ' => [
// ...
' rabbitmq ' => [
' driver ' => ' rabbitmq ' ,
' hosts ' => [
[
' host ' => env ( ' RABBITMQ_HOST ' , ' 127.0.0.1 ' ),
' port ' => env ( ' RABBITMQ_PORT ' , 5672 ),
' user ' => env ( ' RABBITMQ_USER ' , ' guest ' ),
' password ' => env ( ' RABBITMQ_PASSWORD ' , ' guest ' ),
' vhost ' => env ( ' RABBITMQ_VHOST ' , ' / ' ),
],
// ...
],
// ...
],
// ...
],Secara opsional tambahkan opsi antrian ke konfigurasi koneksi. Setiap antrian yang dibuat untuk koneksi ini, mendapatkan propertinya.
Bila Anda ingin memprioritaskan pesan ketika pesan tersebut tertunda, hal ini dimungkinkan dengan menambahkan opsi tambahan.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' prioritize_delayed ' => false ,
' queue_max_priority ' => 10 ,
],
],
],
// ...
],Bila Anda ingin memublikasikan pesan terhadap pertukaran dengan kunci perutean, hal ini dimungkinkan dengan menambahkan opsi tambahan.
amq.direct untuk kunci peruteanqueue .%s di kunci perutean, nama_antrian akan diganti.Catatan: saat menggunakan pertukaran dengan kunci perutean, Anda mungkin membuat sendiri antrean dengan pengikatan.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' exchange ' => ' application-x ' ,
' exchange_type ' => ' topic ' ,
' exchange_routing_key ' => '' ,
],
],
],
// ...
],Di Laravel, pekerjaan yang gagal disimpan ke dalam database. Tapi mungkin Anda ingin menginstruksikan beberapa proses lain untuk juga melakukan sesuatu dengan pesan tersebut. Saat Anda ingin menginstruksikan RabbitMQ untuk merutekan ulang pesan yang gagal ke bursa atau antrean tertentu, hal ini dapat dilakukan dengan menambahkan opsi tambahan.
amq.direct untuk kunci peruteanqueue diganti dengan '.failed' .%s di kunci perutean, nama_antrian akan diganti.Catatan: Saat menggunakan pertukaran failed_job dengan kunci perutean, Anda mungkin perlu membuat sendiri pertukaran/antrian dengan pengikatan.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' reroute_failed ' => true ,
' failed_exchange ' => ' failed-exchange ' ,
' failed_routing_key ' => ' application-x.%s ' ,
],
],
],
// ...
], Dimulai dengan versi 8.0, paket ini langsung mendukung Laravel Horizon. Pertama, instal Horizon lalu atur RABBITMQ_WORKER ke horizon .
Horizon bergantung pada peristiwa yang dikirim oleh pekerja. Peristiwa ini memberi tahu Horizon apa yang telah dilakukan dengan pesan/pekerjaan tersebut.
Library ini mendukung Horizon, tetapi dalam konfigurasinya Anda harus memberi tahu Laravel untuk menggunakan QueueApi yang kompatibel dengan horizon.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to "horizon" if you wish to use Laravel Horizon. */
' worker ' => env ( ' RABBITMQ_WORKER ' , ' default ' ),
],
// ...
], Terkadang Anda harus bekerja dengan pesan yang diterbitkan oleh aplikasi lain.
Pesan-pesan itu mungkin tidak akan mengikuti skema payload pekerjaan Laravel. Masalah dengan pesan-pesan ini adalah, pekerja Laravel tidak akan dapat menentukan pekerjaan atau kelas sebenarnya yang akan dieksekusi.
Anda dapat memperluas RabbitMQJob::class build-in dan dalam konfigurasi koneksi antrian, Anda dapat menentukan kelas Anda sendiri. Saat Anda menentukan kunci job di konfigurasi, dengan nama kelas Anda sendiri, setiap pesan yang diambil dari broker akan dibungkus oleh kelas Anda sendiri.
Contoh konfigurasinya:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' job ' => App Queue Jobs RabbitMQJob::class,
],
],
],
// ...
],Contoh kelas pekerjaan Anda sendiri:
<?php
namespace App Queue Jobs ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
/**
* Fire the job.
*
* @return void
*/
public function fire ()
{
$ payload = $ this -> payload ();
$ class = WhatheverClassNameToExecute::class;
$ method = ' handle ' ;
( $ this -> instance = $ this -> resolve ( $ class ))->{ $ method }( $ this , $ payload );
$ this -> delete ();
}
}Atau mungkin Anda ingin menambahkan properti tambahan ke payload:
<?php
namespace App Queue Jobs ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
/**
* Get the decoded body of the job.
*
* @return array
*/
public function payload ()
{
return [
' job ' => ' WhatheverFullyQualifiedClassNameToExecute@handle ' ,
' data ' => json_decode ( $ this -> getRawBody (), true )
];
}
} Jika Anda ingin menangani pesan mentah, bukan dalam format JSON atau tanpa kunci 'pekerjaan' di JSON, Anda harus menambahkan stub untuk metode getName :
<?php
namespace App Queue Jobs ;
use Illuminate Support Facades Log ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
public function fire ()
{
$ anyMessage = $ this -> getRawBody ();
Log:: info ( $ anyMessage );
$ this -> delete ();
}
public function getName ()
{
return '' ;
}
} Anda dapat memperluas PhpAmqpLibConnectionAMQPStreamConnection::class atau PhpAmqpLibConnectionAMQPSLLConnection::class dan dalam konfigurasi koneksi, Anda dapat menentukan kelas Anda sendiri. Saat Anda menentukan kunci connection di konfigurasi, dengan nama kelas Anda sendiri, setiap koneksi akan menggunakan kelas Anda sendiri.
Contoh konfigurasinya:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' connection ' = > App Queue Connection MyRabbitMQConnection::class,
],
// ...
], Jika Anda ingin menggunakan RabbitMQQueue::class Anda sendiri, hal ini dapat dilakukan dengan memperluas VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue . dan beri tahu laravel untuk menggunakan kelas Anda dengan menyetel RABBITMQ_WORKER ke AppQueueRabbitMQQueue::class .
Catatan: Kelas pekerja harus memperluas
VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to a class if you wish to use your own. */
' worker ' => App Queue RabbitMQQueue::class,
],
// ...
], <?php
namespace App Queue ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue RabbitMQQueue as BaseRabbitMQQueue ;
class RabbitMQQueue extends BaseRabbitMQQueue
{
// ...
}Misalnya: Implementasi penyambungan kembali.
Jika ingin menyambung kembali ke RabbitMQ, jika sambungan sudah mati. Anda dapat mengganti metode penerbitan dan createChannel.
Catatan: ini bukan praktik terbaik, ini adalah sebuah contoh.
<?php
namespace App Queue ;
use PhpAmqpLib Exception AMQPChannelClosedException ;
use PhpAmqpLib Exception AMQPConnectionClosedException ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue RabbitMQQueue as BaseRabbitMQQueue ;
class RabbitMQQueue extends BaseRabbitMQQueue
{
protected function publishBasic ( $ msg , $ exchange = '' , $ destination = '' , $ mandatory = false , $ immediate = false , $ ticket = null ): void
{
try {
parent :: publishBasic ( $ msg , $ exchange , $ destination , $ mandatory , $ immediate , $ ticket );
} catch ( AMQPConnectionClosedException | AMQPChannelClosedException ) {
$ this -> reconnect ();
parent :: publishBasic ( $ msg , $ exchange , $ destination , $ mandatory , $ immediate , $ ticket );
}
}
protected function publishBatch ( $ jobs , $ data = '' , $ queue = null ): void
{
try {
parent :: publishBatch ( $ jobs , $ data , $ queue );
} catch ( AMQPConnectionClosedException | AMQPChannelClosedException ) {
$ this -> reconnect ();
parent :: publishBatch ( $ jobs , $ data , $ queue );
}
}
protected function createChannel (): AMQPChannel
{
try {
return parent :: createChannel ();
} catch ( AMQPConnectionClosedException ) {
$ this -> reconnect ();
return parent :: createChannel ();
}
}
}Koneksi memang menggunakan antrian default dengan nilai 'default', ketika tidak ada antrian yang disediakan oleh laravel. Dimungkinkan untuk mengubah antrian default dengan menambahkan parameter tambahan di konfigurasi koneksi.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' queue ' => env ( ' RABBITMQ_QUEUE ' , ' default ' ),
],
// ...
], Secara default, koneksi Anda akan dibuat dengan pengaturan detak jantung 0 . Anda dapat mengubah pengaturan detak jantung dengan mengubah konfigurasi.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
// ...
' heartbeat ' => 10 ,
],
],
// ...
],Jika Anda memerlukan koneksi aman ke server RabbitMQ, Anda perlu menambahkan opsi konfigurasi tambahan ini.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' secure ' = > true ,
' options ' => [
// ...
' ssl_options ' => [
' cafile ' => env ( ' RABBITMQ_SSL_CAFILE ' , null ),
' local_cert ' => env ( ' RABBITMQ_SSL_LOCALCERT ' , null ),
' local_key ' => env ( ' RABBITMQ_SSL_LOCALKEY ' , null ),
' verify_peer ' => env ( ' RABBITMQ_SSL_VERIFY_PEER ' , true ),
' passphrase ' => env ( ' RABBITMQ_SSL_PASSPHRASE ' , null ),
],
],
],
// ...
],Untuk menginstruksikan pekerja Laravel untuk mengirimkan acara setelah semua komitmen basis data selesai.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' after_commit ' => true ,
],
// ...
],Secara default, koneksi Anda akan dibuat sebagai koneksi malas. Jika karena alasan tertentu Anda tidak ingin koneksi menjadi lambat Anda dapat mematikannya dengan mengatur konfigurasi berikut.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' lazy ' = > false ,
],
// ...
], Secara default, protokol jaringan yang digunakan untuk koneksi adalah tcp. Jika karena alasan tertentu Anda ingin menggunakan protokol jaringan lain, Anda dapat menambahkan nilai tambahan di opsi konfigurasi Anda. Protokol yang tersedia: tcp , ssl , tls
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' network_protocol ' => ' tcp ' ,
],
// ...
],Dimulai dengan 13.3.0, paket ini langsung mendukung Laravel Octane. Pertama install Octane dan jangan lupa hangatkan koneksi 'rabbitmq' di konfigurasi oktan.
Lihat: #460 (komentar)
Setelah Anda menyelesaikan konfigurasi, Anda dapat menggunakan Laravel Queue API. Jika Anda menggunakan driver antrian lain, Anda tidak perlu mengubah apa pun. Jika Anda tidak tahu cara menggunakan Queue API, silakan merujuk ke dokumentasi resmi Laravel: http://laravel.com/docs/queues
Untuk penggunaan Lumen, penyedia layanan harus didaftarkan secara manual sebagai berikut di bootstrap/app.php :
$ app -> register ( VladimirYuldashev LaravelQueueRabbitMQ LaravelQueueRabbitMQServiceProvider::class);Ada dua cara mengonsumsi pesan.
queue:work command yang merupakan perintah bawaan Laravel. Perintah ini menggunakan basic_get . Gunakan ini jika Anda ingin menggunakan banyak antrian.
rabbitmq:consume perintah yang disediakan oleh paket ini. Perintah ini menggunakan basic_consume dan lebih berperforma daripada basic_get sebanyak ~2x, namun tidak mendukung banyak antrean.
Siapkan RabbitMQ menggunakan docker-compose :
docker compose up -dUntuk menjalankan test suite Anda dapat menggunakan perintah berikut:
# To run both style and unit tests.
composer test
# To run only style tests.
composer test:style
# To run only unit tests.
composer test:unitJika Anda menerima kesalahan apa pun dari pengujian gaya, Anda dapat memperbaiki sebagian besar, jika tidak semua masalah secara otomatis, dengan perintah berikut:
composer fix:styleAnda dapat berkontribusi pada paket ini dengan menemukan bug dan membuka masalah. Silakan tambahkan versi paket mana yang Anda buat permintaan atau masalah tariknya. (misalnya [5.2] Kesalahan fatal pada pekerjaan tertunda)