Menggunakan RabbitMQ dengan MonsterMQ Bagian 1

Artikel ini ditujukan bagi mereka yang belum terbiasa dengan antrian dan RabbitMQ. Mereka yang sudah tahu cara bekerja dengan RabbitMQ dan hanya ingin menjelajahi kemungkinan yang disediakan MonsterMQ, saya sarankan mengunjungi halaman proyek di github.com, di mana deskripsi menjelaskan secara rinci bagaimana Anda dapat menggunakan MonsterMQ tanpa menjelaskan dasar-dasar bekerja dengan RabbitMQ. Sisa dari artikel ini akan membahas dasar-dasar bagaimana RabbitMQ bekerja dengan MonsterMQ.

RabbitMQ adalah broker pesan. Ia menerima, menyimpan, dan meneruskan pesan ke pelanggannya. Klien pengirim dan penerima pesan dapat melayani, misalnya, aplikasi yang ditulis dalam PHP. Komunikasi antara klien dan RabbitMQ terjadi sesuai dengan aturan tertentu yang disebut AMQP (Advanced Message Queuing Protocol). Misalnya, komunikasi antara browser Anda dan server web tempat artikel ini berada juga mengikuti aturan tertentu, mereka disebut HTTP (HyperText Transfer Protocol) - protokol transfer hypertext. HTTP dan AMQP adalah protokol client-server, yaitu, mereka menyiratkan keberadaan klien dan server. RabbitMQ adalah server AMQP, dan MonsterMQ adalah perpustakaan yang memungkinkan Anda untuk dengan cepat menulis klien AMQP dalam PHP, yang akan berkomunikasi dengan server AMQP.

AMQP dan RabbitMQ menggunakan ketentuan berikut:

Memproduksi - artinya mengirim pesan, Produser (pemasok) - orang yang mengirim pesan.

gambar

Mengkonsumsi - berarti menerima pesan. Konsumen - orang yang menerima pesan.

gambar

Antrian adalah antrian. Sebelum mencapai konsumen dan setelah dikirim oleh pemasok, pesan disimpan dalam antrian di dalam RabbitMQ. Antrian adalah buffer yang menyimpan pesan. Banyak penyedia dapat mengirim pesan dalam satu antrian, dan banyak konsumen dapat membaca pesan dari satu antrian.

gambar

Perhatikan bahwa penyedia, konsumen dan broker tidak harus berada di host yang sama, sebaliknya mereka biasanya berada di tempat yang berbeda.

Halo Dunia


Kemudian dalam artikel ini, kita akan menulis dua program dalam PHP menggunakan pustaka MonsterMQ, salah satunya akan mengirim pesan, dan yang lain akan menerima dan mengeluarkannya ke konsol. Dalam gambar di bawah, "P" adalah penyedia, "C" adalah konsumen, kotak merah adalah antrian yang merupakan penyangga pesan (setiap kotak adalah pesan).

gambar
(Gambar diambil dari situs resmi RabbitMQ )

Untuk pekerjaan lebih lanjut, kita perlu menginstal MonsterMQ, untuk melakukan ini, masukkan perintah berikut di konsol:

composer require goootlib/monster-mq:dev-master

(Lebih lanjut tentang menginstal MonsterMQ dapat ditemukan di halaman proyek di github.com)
Perintah ini akan menginstal MonsterMQ di folder saat ini.

Keberangkatan


Kami akan memanggil pengirim kami send.php , dan penerima accept.php . Pengirim akan bergabung dengan server dan mengirim pesan.
Untuk bergabung dengan server, tulis kode berikut di send.php :.

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

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');
} catch(\Exception $e) {
   var_dump($e);
}

Dalam kode ini, kami bergabung dengan RabbitMQ yang berjalan di server lokal pada port standar. Tentukan alamat ip dan port lain jika RabbitMQ berjalan di alamat Anda yang lain. Setelah koneksi, kami juga memanggil metode logIn (), yang memulai sesi dengan login dan kata sandi standar. Jika Anda memiliki akun dengan nama pengguna dan kata sandi yang berbeda yang dikonfigurasi di RabbitMQ, tentukan di sini.

Untuk mengirim pesan, kita harus menyatakan antrian tempat pesan itu pertama kali ditempatkan. Setelah antrian diumumkan, kami dapat mengirim pesan:

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

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

   $producer->queue('test-queue')->declare();
   $producer->publish('my-message', 'test-queue');
} catch(\Exception $e) {
   var_dump($e);
}

Deklarasi antrian idempoten, yaitu tidak akan membuat dan tidak akan mengubah antrian, jika sudah ada. Setelah kami menyelesaikan sesi dan bergabung.

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

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

   $producer->queue('test-queue')->declare();
   $producer->publish('Test message', 'test-queue');

   $producer->disconnect();
} catch(\Exception $e) {
   var_dump($e);
}

Terima pesan


Berbeda dengan pengirim, penerima akan tetap berjalan untuk mendengarkan pesan yang masuk. Dalam kode accept.php , pertama-tama Anda harus melakukan hal yang sama seperti pada send.php :

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

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

   $consumer->queue('test-queue')->declare();
} catch(\Exception $e) {
   var_dump($e);
}

Perhatikan bahwa di accept.php kami juga mendeklarasikan antrian kami, ini dimaksudkan agar penerima menyatakan antrian jika dimulai sebelum pengirim.
Untuk memberi tahu server bahwa kami ingin menerima pesan darinya, serta memulai siklus yang akan menunggu dan memproses pesan masuk, kami akan menulis kode berikut:

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

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

   $consumer->queue('test-queue')->declare();

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

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

Meluncurkan


Sekarang kita dapat menjalankan kedua skrip sebagai penerima:

php receive.php

jadi pengirim:

php send.php

Penerima akan menampilkan pesan yang ia akan terima dari RabbitMQ ke konsol (yang pada gilirannya akan menerimanya dari send.php) dan nomor saluran yang digunakan. Ini akan terus dieksekusi sampai Anda menutup terminal, atau sampai Anda berhenti menjalankannya dengan menekan Ctrl + C. Dengan meluncurkan pengirim di terminal lain, Anda dapat mengamati bagaimana pesan dikirim ke penerima dan ditampilkan di konsol.

Jika Anda ingin melihat yang mana, saat ini, RabbitMQ berisi antrian dan berapa banyak pesan di dalamnya, Anda dapat melakukan ini sebagai pengguna istimewa menggunakan rabbitmqctl
sudo rabbitmqctl list_queues


Di windows jangan gunakan sudo
rabbitmqctl.bat list_queues


Sekarang kita siap untuk melanjutkan ke bagian selanjutnya dari pelajaran kita.

All Articles