Menggunakan RabbitMQ dengan MonsterMQ Bagian 3

Di artikel kami sebelumnya, kami membuat antrian tugas. Diasumsikan bahwa satu tugas dalam bentuk pesan dikirim ke satu penerima. Dalam artikel ini kami akan melakukan sesuatu yang lain, kami akan mengirim satu pesan ke beberapa penerima sekaligus. Kami akan membuat sistem pencatatan yang terdiri dari dua program: yang pertama akan mengirim pesan, dan yang kedua akan menerima dan menampilkannya. Dalam sistem kami, semua penerima yang berjalan akan menerima pesan yang dikirim oleh pengirim.

Pertukaran (penukar)


Pada artikel sebelumnya, kami mengirim dan menerima pesan dari antrian, sekarang saatnya untuk memperkenalkan model penerusan pesan lengkap di RabbitMQ.

Mari kita cepat membahas apa yang kita bahas dalam artikel sebelumnya:

  • Produser - aplikasi yang mengirim pesan
  • Antrian - penyangga yang menyimpan pesan
  • Konsumen - aplikasi yang menerima dan memproses pesan

Gagasan utama RabbitMQ (atau lebih tepatnya AMQP) adalah bahwa pengirim (Produser) tidak pernah mengirim pesan langsung ke antrian. Selain itu, ia bahkan tidak tahu apakah ada dalam antrian. Sebagai gantinya, pengirim mengirim pesan ke penukar (Exchange). Penukar adalah hal yang sangat sederhana, ia melakukan dua hal: menerima pesan dari pengirim dan mengarahkan mereka ke antrian. Penukar terdiri dari berbagai jenis: beberapa mengirim pesan ke antrian tertentu (jenis langsung), yang lain mengirim pesan yang sama ke beberapa antrian sekaligus (jenis fanout), yang lain mengarahkan pesan ke antrian berdasarkan aturan pengalihan khusus yang ditentukan (jenis topik).

gambar
(gambar diambil dari situs resmi RabbitMQ )

Mari kita lihat penukar tipe fanout. Untuk membuatnya, tulis kode berikut:

$producer->newFanoutExchange('logs');

Penukar Fanout berfungsi sesuai dengan skema yang sangat sederhana, ia hanya mengirim pesan yang diterima ke semua antrian yang terlampir.

Untuk mendaftar semua penukar yang ada di server, hubungi rabbitmqctl

sudo rabbitmqctl list_exchanges

Daftar ini akan berisi amq. * Penukar dan penukar standar tanpa nama (baris kosong). Jangan memperhatikan mereka, kita belum membutuhkannya.

Pada artikel terakhir, kami tidak tahu apa-apa tentang penukar, tetapi tetap bisa mengirim pesan. Ini terjadi karena jika di MonsterMQ Anda tidak secara eksplisit menentukan penukar sebagai argumen ketiga ke metode Producer :: publish () , perpustakaan akan menggunakan penukar nama tanpa nama standar RabbitMQ, yang mengirimkan pesan dalam antrian yang namanya diteruskan sebagai argumen kedua ke metode Producer :: publish () .

Sekarang kita dapat mengirim pesan ke exchanger baru kita dengan menyebutkan namanya sebagai argumen ketiga ke metode Producer :: publish () :

$producer->publish($message, '', 'logs');

Sekarang mari kita buat dua pekerja dengan dua antrian yang akan ada selama pekerja yang mengumumkannya aktif. Anda dapat melakukan ini sebagai berikut:

//Worker 1
$producer->queue('queue-1')->setExclusive()->declare();

//Worker 2
$producer->queue('queue-2')->setExclusive()->declare();

Sekarang ketika pekerja yang telah mengumumkan antrian mengakhiri sesi dan memutuskan hubungan, itu akan dihapus secara otomatis. Jika kedua pekerja menyelesaikan pekerjaan mereka, kedua antrian akan dihapus.

Kami menghubungkan antrian dengan penukar


Kami telah membuat pertukaran dan antrian. Sekarang kita hanya perlu memberi tahu penukar untuk mengirim pesan yang diterima ke antrian kami. Kita perlu mengikat exchanger dan antrian. Untuk melakukan ini, tulis kode berikut:

//Worker 1
$producer->queue('queue-1')->bind('logs');

//Worker 2
$producer->queue('queue-2')->bind('logs');

Mulai sekarang, penukar log kami terhubung ke antrian kami dan akan meneruskan pesan yang diterima kepada mereka.

Anda dapat mendaftar semua tautan yang ada dengan perintah berikut di linux

rabbitmqctl list_bindings

Menyatukan kode


Skrip pengirim kami tidak banyak berubah dibandingkan dengan pelajaran sebelumnya. Perbedaan utama adalah bahwa sekarang mengirim pesan ke exchanger yang diumumkan sebelumnya, dan tidak ke yang standar (dapat diakses dari kotak). Ini adalah kode send.php

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->newFanoutExchange('logs');

   $message = implode(' ', array_slice($argv, 1));
   $message = empty($message) ? 'Hello world!' : $message;

   $producer->publish($message, '', 'logs');

   echo "\n Sent {$message} \n";
} catch(\Exception $e) {
   var_dump($e);
}

Perlu disebutkan bahwa dengan mengirim pesan ke exchanger yang tidak terkait dengan antrian apa pun, pesan tersebut akan hilang. Tapi sekarang ini cocok untuk kami, karena kami belum meluncurkan penerima kami.

Ini adalah kode untuk pekerja pertama -1.php kami

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $producer->queue('queue-1')->setExclusive()->declare();
   $producer->queue('queue-1')->bind('logs');

   $consumer->consume('queue-1');

   $consumer->wait(function ($message, $channelNumber) use ($consumer){
      echo "\n $message \n";
   });
} catch(\Exception $e) {
   var_dump($e);
}

Berikut adalah kode untuk pekerja kedua -pekerja 2.php

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $producer->queue('queue-2')->setExclusive()->declare();
   $producer->queue('queue-2')->bind('logs');

   $consumer->consume('queue-2');

   $consumer->wait(function ($message, $channelNumber) use ($consumer){
      echo "\n $message \n";
   });
} catch(\Exception $e) {
   var_dump($e);
}

Jika Anda ingin menyimpan pesan yang dikirim ke pekerja pertama dalam file log, panggil saja perintah berikut di konsol:

php worker-1.php > logs_from_rabbit.log

Untuk memulai pekerja dan menampilkan pesan di jendela terminal, panggil perintah berikut, masing-masing di jendela sendiri:

php worker-1.php

php worker-2.php

Dan untuk mengirim pesan, panggil perintah berikut:

php send.php

Dalam pelajaran selanjutnya, kita akan melihat bagaimana mendapatkan hanya sebagian dari pesan yang dikirim.

All Articles