Installasi RabbitMQ pada CentOS 7

-

RabbitMQ

RabbitMQ merupakan message broker yang ditulis dengan menggunakan bahasa pemrograman Erlang. RabbitMQ ini bisa diibaratkan sebagai sebuah kantor pos sekaligus tukang pos. Dia akan menerima pesan yang dikirimkan oleh sender lalu melakukan forward/push pesan tersebut kepada receiver. Berikut ini adalah langkah-langkah instalasi dan pengetesan queuing pada RabbitMQ.

Langkah – 1 Tambahkan Hostname dan IP Address

Tambahkan IP Address dan hostname di /etc/hosts

$ vi /etc/hosts


Langkah – 2 Install Erlang

Sebelum kita install Erlang, terlebih dahulu kita install epel-release menggunakan perintah di bawah.

$ yum -y install epel-release
$ yum -y update


Selanjutnya install Erlang.

$ yum -y install erlang socat 
$ erl -version


Untuk masuk ke mode erlang gunakan perintah di bawah.

$ erl


Langkah – 3 Install RabbitMQ

Unduh rabbitMQ rpm menggunakan perintah di bawah.

$ wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm


Untuk versi lain nya bisa diunduh menggunakan tautan ini: https://www.rabbitmq.com/download.html

Impor kunci GPG menggunakan perintah di bawah.

$ rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc


Instal paket RPM menggunakan perintah di bawah.

$ rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm


Jalan service rabbitmq.

$ systemctl start rabbitmq-server


Aktifkan auto start service rabbitmq pada saat server dalam kondisi poweroff atau restart.

$ systemctl enable rabbitmq-server


Cek service rabbitmq.

$ systemctl status rabbitmq-server


Install RabbitMQ Management Dashboard (Opsional).

$ rabbitmq-plugins enable rabbitmq_management


Ubah kepemilikan berkas RabbitMQ untuk user RabbitMQ.

$ chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/


Tambahkan user admin untuk login ke dashboard.

$ rabbitmqctl add_user admin StrongPassword
$ rabbitmqctl set_user_tags admin administrator
$ rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"


Kemudian akses RabbitMQ Dashboard dan login menggunakan username dan password yang telah dibuat sebelumnya melalui browser Anda http://Your_Server_IP:15672/

Langkah – 4 Pengetesan

Pada pengetesan kali ini akan menggunakan bahasa pemograman PHP sebagai antriannya, berikut ini adalah langkah-langkahnya.

Instal composer dan PHP menggunakan local CentOS packages.

$ yum install composer php


Instal paket php mbstring dan bcmath sesuai dengan versi php yang Anda gunakan.

$ yum install php-mbstring php-bcmath


Instal php-amqplib menggunakan composer.

$ composer require php-amqplib/php-amqplib


Buat dua file pengetesan dan beri nama publisher.php yang digunakan untuk membuat task dan worker.php yang digunakan untuk melakukan forward / pushing kepada receiver.

$ vi /home/ubuntu/Queuing/publisher.php
<?php
require_once(__DIR__ . '/vendor/autoload.php');
define("RABBITMQ_HOST", "localhost");
define("RABBITMQ_PORT", 5672);
define("RABBITMQ_USERNAME", "guest");
define("RABBITMQ_PASSWORD", "guest");
define("RABBITMQ_QUEUE_NAME", "task_queue");
$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection(
    RABBITMQ_HOST, 
    RABBITMQ_PORT, 
    RABBITMQ_USERNAME, 
    RABBITMQ_PASSWORD
);
$channel = $connection->channel();
$channel->queue_declare(
    $queue = RABBITMQ_QUEUE_NAME,
    $passive = false,
    $durable = true,
    $exclusive = false,
    $auto_delete = false,
    $nowait = false,
    $arguments = null,
    $ticket = null
);
$job_id=0;
while (true)
{
    $jobArray = array(
        'id' => $job_id++,
        'task' => 'sleep',
        'sleep_period' => rand(0, 3)
    );
    $msg = new \PhpAmqpLib\Message\AMQPMessage(
        json_encode($jobArray, JSON_UNESCAPED_SLASHES),
        array('delivery_mode' => 2) # make message persistent
    );
    $channel->basic_publish($msg, '', RABBITMQ_QUEUE_NAME);
    print 'Job created' . PHP_EOL;
    sleep(1);
}
$ vi /home/ubuntu/Queuing/worker.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
define("RABBITMQ_HOST", "localhost");
define("RABBITMQ_PORT", 5672);
define("RABBITMQ_USERNAME", "guest");
define("RABBITMQ_PASSWORD", "guest");
define("RABBITMQ_QUEUE_NAME", "task_queue");
$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection(
    RABBITMQ_HOST, 
    RABBITMQ_PORT, 
    RABBITMQ_USERNAME, 
    RABBITMQ_PASSWORD
);
$channel = $connection->channel();
$channel->queue_declare(
    $queue = RABBITMQ_QUEUE_NAME,
    $passive = false,
    $durable = true,
    $exclusive = false,
    $auto_delete = false,
    $nowait = false,
    $arguments = null,
    $ticket = null
);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
$callback = function($msg){
    echo " [x]
Received ", $msg->body, "\n";
    $job = json_decode($msg->body, $assocForm=true);
    sleep($job['sleep_period']);
    echo " [x]
Done", "\n";
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume(
    $queue = RABBITMQ_QUEUE_NAME,
    $consumer_tag = '',
    $no_local = false,
    $no_ack = false,
    $exclusive = false,
    $nowait = false,
    $callback
);
try
{
    while (count($channel->callbacks)) 
    {
        print "running
non blocking wait." . PHP_EOL;
        $channel->wait($allowed_methods=null, $nonBlocking=true, $timeout=1);
    }
}
catch (Exception $e)
{
    print "There
are no more tasks in the queue." . PHP_EOL;
}
$channel->close();
$connection->close();


Sebelum menjalankan publisher.php, login terlebih dahulu ke dashboard RabbitMQ untuk melihat total Queued Messages seperti gambar di bawah.

Atau menggunakan perintah di bawah ini melalui terminal.

$ rabbitmqctl list_queues


Dari grafik di atas kita bisa melihat bahwa saat ini tidak terdapat antrian di RabbitMQ, selanjutnya kita akan coba buat Job dengan menjalankan publisher.php


Dan kita lihat kembali pada grafik terpantau saat ini ada 30 Job di antrian RabbitMQ.


Selanjutnya kita jalankan worker.php untuk mengurangi antrian di RabbitMQ.


Terlihat pada grafik antrian lambat laun akan berkurang oleh worker.php yang kita jalankan sebelumnya.