Implementasi Message Broker dengan RabbitMq dan Laravel

Implementasi Message Broker dengan RabbitMq dan Laravel

Pertama-tama kita buat baru project laravel dengan mengetikan command

composer create-project --prefer-dist laravel/laravel laravel-rabbitmq

Kemudian masuk ke folder laravel-rabbitmq, dan jalankan

composer require vladimir-yuldashev/laravel-queue-rabbitmq

Setelelah itu buka file app/config/queue.php tambahkan konfigurasi driver rabbitmq ke dalam file tersebut,

'connections' => [
    // ...

    'rabbitmq' => [
    
       'driver' => 'rabbitmq',
       'queue' => env('RABBITMQ_QUEUE', 'default'),
       'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class,
   
       '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', '/'),
           ],
       ],
   
       '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),
           ],
       ],
   
       /*
        * Set to "horizon" if you wish to use Laravel Horizon.
        */
       'worker' => env('RABBITMQ_WORKER', 'default'),
        
    ],

    // ...    
],

Langkah Selanjutnya adalah menginstall RabbitMq, Anda bisa mengunjungi halaman berikut https://www.rabbitmq.com/download.html untuk Installasinya. Kali ini kita gunakan docker untuk install rabbitmq di lokal, maka tingga jalankan command berikut:

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

Setelelah itu Buat Template Email SendMailTemplate.php di app/Mail/SendMailTemplate.php dengan code berikut:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SendMailTemplate extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * The content instance.
     *
     * @var content
     */
    protected $content;


    public function __construct($content)
    {
        $this->content = $content;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('templateEmail')
            ->with([
                'content' => $this->content
            ]);
    }
}

Setelah itu, buat viewnya pada folder resources/views dengan nama templateEmail.blade.php Isikan sebagai berikut:

{{ $content }}

Lalu buat MailController.php pada folder app/Http/Controllers dengan nama MailController.php

<?php

namespace App\Http\Controllers;

use App\Mail\SendMailTemplate;
use Illuminate\Support\Facades\Mail;

class MailController extends Controller
{
    public function sendEmail()
    {
        $email = request("email");
        Mail::to($email)->send(new SendMailTemplate("Halo"));
    }

    public function sendEmailQueue()
    {
        $email = request("email");
        Mail::to($email)->queue(new SendMailTemplate("Halo"));
    }
}

Tambahkan pada file routes/web.php. Routing atas adalah mengirim email secara syncronous tanpa menggunakan message broker, sedangkan yang bawah menggunakan message broker dengan queue driver yang kita set dengan rabbitmq.

Route::post('/mail', 'MailController@sendEmail');
Route::post('/mail-queue', 'MailController@sendEmailQueue');

Kemudian setting file .env pada bagian MAIL config, sesuaikan dengan mail server yang anda punya, saat ini kita gunakan smtp gmail , maka konfigurasinya sebagai berikut

MAIL_DRIVER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
MAIL_USERNAME=GMAIL KAMU
MAIL_PASSWORD=PASSWORD GMAIL KAMU
MAIL_ENCRYPTION=ssl

Setelah itu jalankan “php artisan serve“. dan jalankan pula “php artisan queue:work”

Kemudian kita buka postman untuk mengetest kedua route tersebut.

Nampak perbedaan yang sangat signifikan antara post pertama dengan post kedua, karena post kedua menggunakan queue karena proses pengiriman email secara paralel. Sehingga ketika kita melakukan request belum tentu setelah mendapatkan response email berhasil terkirim.

Kalian bisa melihat hasil kodenya di https://github.com/agung3wi/laravel-rabbitmq

Demikian Merupakn artikel mengenai Implementasi Message Broker dengan RabbitMq dan Laravel.

Baca Artikel Kami Lainnya : Skill Set yang kalian harus pelajari jika ingin menjadi fullstack enginer zaman now

Message Broker: Apa dan Mengapa penting?

Secara bahasa Message Queue atau Message Broker dapat diartikan sebagai pesan terputus. Tujuannya, memecah proses pengiriman pesan dari aplikasi kita. Terdapat beberapa platform pendukung fitur ini yakni RabbitMQ, Apache Kafka, dan ActiveMQ (JMS). Dengan fitur ini, pengiriman pesan ke user tidak lagi menjadi synchronous. Artinya pengiriman pesan tidak perlu menunggu proses sebelumnya selesai.

Pentingnya Message Broker

Message broker akan mengubah skema business logic menjadi ‘asynchronous process’. Sebenarnya jika kita ingin menjalankan proses bussines logic dalam aplikasi secara synchronous tidaklah akan menjadi masalah, aplikasi akan tetap berjalan selama coding kita tidak error.

Contoh Kasus

Pada artikel ini, kita akan menggunakan contoh kasus pada suatu marketplace. Gambar berikut ini menunjukkan business logic dari suatu marketplace

Proses Order terdiri Authorization, Transaction (Insert Table Order, OrderItem, etc), kemudian send email & send notification. Setiap process berjalan secara berurutan, artinya proses harus menunggu proses sebelumnya selesai. Sayangnya, send email kerap kali memakan waktu yang lama sebab send email menggunakan protokol seperti SMTP/ POP3 dan perlu memanggil service yang lain.

Untuk mengurangi response time, kita dapat memecah proses ketiga dan keempat menjadi satu proses sendiri. Dengan hal ini, waktu pemanggilan service send email dan transaction dapat terjadi dalam waktu yang sama. Artinya, setelah transaction selesai, program hanya perlu mengirim message queue ke message broker. Kemudian Subscriber akan menangkap pesan tersebut dan melanjutkan ke proses selanjutnya. Dengan hal ini, waktu response time dapat meningkat.

Message broker bukan sebatas untuk send email saja. Masih banyak implementasi lain dari fitur ini. Dengan fitur ini, repsonse time akan menjadi lebih bagus. Namun, tetaplah berhati-hati dalam memecah business logic ya. Memecah pada proses yang salah, akan menyebabkan data dalam database kita tidak reliable.

Setelah mengenal fitur ini, semoga fitur ini juga dapat bertengger di aplikasimu ya. Cara menggunakan message broker dengan RabbitMQ akan diupload di artikel berikutnya ya!


Referensi : https://www.tibco.com/reference-center/what-is-a-message-broker