RabbitMQ & .NET 6 Series [Part 3 – Topic Exchange]

Artikel ini adalah kelanjutan dari artikel sebelumnya yang membahas tentang penggunaan Direct Exchange dengan RabbitMQ. Pada artikel ini akan dibahas cara penggunaan Topic Exchange, berbeda dengan jenis exchange sebelumnya Direct Exchange yang menggunakan “fix” routing key, pada Topic Exchange, consumer dapat menentukan routing key secara lebih fleksibel, sebagai contoh consumer dapat menggunakan routing pattern seperti (“*”), sebagai contoh katalog.*, maka consumer akan mengambil semua pesan yang mempunyai awalan routing key katalog tanpa memperhatikan karakter setelah awalan tersebut.

Menambahkan Publisher

Pada project RabbitMQProducer yang sudah dibuat pada artikel sebelumnya, tambahkan class dengan nama TopicExchangePublisher.cs, kemudian tambahkan kode berikut ini:

namespace RabbitMQProducer
{
    public class TopicExchangePublisher
    {
        public static void Publish(IModel channel)
        {
            channel.ExchangeDeclare("contoh-topic-exchange",
            ExchangeType.Topic);

            var count = 0;
            while (true)
            {
                var message = new { Name = "Producer", Message = $"Urutan pesan ke: {count}" };
                var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));
                channel.BasicPublish("contoh-topic-exchange", "katalog.details", null, body);
                count++;
                Thread.Sleep(1000);
            }

        }
    }
}

Pada kode diatas yang berbeda dengan kode pada artikel sebelumnya adalah tipe exchange yang digunakan yaitu Topic. Untuk menjalankan class tersebut tambahkan kode pada Program.cs.

using RabbitMQ.Client;
using RabbitMQProducer;

var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
TopicExchangePublisher.Publish(channel);

Menambahkan Consumer

Pada project RabbitMQConsumer, tambahkan class TopicExchangeConsumer.cs.

namespace RabbitMQConsumer
{
    public static class TopicExchangeConsumer
    {
        public static void Consume(IModel channel)
        {
            channel.ExchangeDeclare("contoh-topic-exchange", ExchangeType.Topic);
            channel.QueueDeclare("contoh-topic-queue",
                durable: true,
                exclusive: false,
                autoDelete: false,
                arguments: null);
            channel.QueueBind("contoh-topic-queue", "contoh-topic-exchange", "katalog.*");

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (sender, e) =>
            {
                var body = e.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(message);
            };

            channel.BasicConsume("contoh-topic-queue", true, consumer);
            Console.WriteLine("Aplikasi consumer dijalankan...");
            Console.ReadLine();
        }
    }
}

Dari kode deiatas dapat dilihat bahwa routing key yang digunakan mengandung pattern (“*”), sehingga consumer akan menerima pesan dari Publisher yang mengirimkan pesan dengan alamat routing key berawalan “katalog”. Panggil class tersebut pada Program.cs.

using RabbitMQ.Client;
using RabbitMQConsumer;


var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

TopicExchangeConsumer.Consume(channel);

Kemudian jalankan Consumer app dan Publisher app untuk melihat hasilnya.

Dapat dilihat bahwa contoh-topic-queue sudah terbinding pada contoh-topic-exchange dengan routing key “katalog.*”

Jika kedua aplikasi Publisher dan Consumer dijalankan dapat dilihat pesan yang dikirimkan oleh Publisher dapat diproses oleh Consumer.

Advertisement

RabbitMQ & .NET 6 Series [Part 2 – Direct Exchange]

Pada RabbitMQ kita membutuhkan objek exchange untuk bertukar pesan. Pada RabbitMQ pengiriman pesan melalui exchange dapat berasal dari satu producer (pengirim pesan) ke satu atau banyak consumer (penerima pesan). Exchange pada RabbitMQ bisa menggunakan atribut header, routing key, dan binding untuk mengirimkan pesan. Berikut adalah gambar cara kerja pengiriman pesan pada RabbitMQ.

Dapat dilihat pada gambar diatas, bahwa untuk mengirimkan pesan perlu untuk membuat objek Exchange terlebih dahulu, kemudian baru membinding exchange tersebut ke subscriber yang mau menerima pesannya. Pesan akan diantarkan melalui objek Queue (antrian) sehingga urutan pesan yang masuk adalah FIFO (first in first out), jadi pesan yang lebih awal akan diproses terlebih dahulu.

Pada artikel ini akan dibahas bagaimana cara pengiriman pesan menggunakan Direct Exchange. Direct Exchange menggunakan routing key pada header untuk mengidentifikasi pada queue yang mana pesan harus dikirimkan. Routing key adalah nilai header yang dibuat oleh producer (pengirim pesan), dan consumer akan menggunakan routing key untuk melakukain binding ke queue. Hanya pesan dengan routing key yang tepat saja akan diterima oleh subscriber. Contoh program dibawah ini akan menunjukan bagaimana cara kerja Direct Exchange.

Membuat Project Producer

Buat project .NET console baru dengan nama RabbitMQProducer. Untuk bekerja dengan RabbitMQ, hal pertama yang harus dilakukan adalah menambahkan library RabbitMQ client. Anda dapat menggunakan NuGet Package manager untuk menambahkan library tersebut. Jika sudah berhasil ditambahkan, anda dapat melihatnya pada file ,csproj.

  <ItemGroup>
    <PackageReference Include="RabbitMQ.Client" Version="6.4.0"/>
  </ItemGroup>

Kemudian pada project tersebut tambahkan class dengan nama DirectExchangePublisher.cs.

namespace RabbitMQProducer
{
    public class DirectExchangePublisher
    {
        public static void Publish(IModel channel)
        {
            channel.ExchangeDeclare("contoh-direct-exchange",
            ExchangeType.Direct);
            var count = 0;
            while (true)
            {
                var message = new { Name = "Producer", Message = $"Urutan pesan ke-: {count}" };
                var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));
                channel.BasicPublish("contoh-direct-exchange", "katalog.barang", null, body);
                count++;
                Thread.Sleep(1000);
            }
        }
    }
}

Pada kode diatas dapat dilihat bahwa pertama hal yang harus dilakukan adalah membuat objek exchange (dengan nama contoh-direct-exchange), kemudian ketika pesan akan dikirimkan perlu ditambahkan routing key (katalog.barang) sebagai alamat untuk subscriber yang akan menerima pesan tersebut. Untuk menjalankan class tersebut, tambahkan kode berikut pada file Program.cs.

using RabbitMQ.Client;
using RabbitMQProducer;

var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
DirectExchangePublisher.Publish(channel);

Pada program diatas, kita perlu menambahkan alamat dari RabbitMQ Server yang sudah kita pasang sebelumnya.

Membuat Project Consumer

Langkah selanjutnya adalah membuat project consumer yang akan menerima pesan yang dikirimkan oleh producer. Untuk itu buat project .NET console baru dengan nama RabbitMQConsumer, kemudian sama seperti langkah sebelumnya, tambahkan library RabbitMQ.Client pada project tersebut (dari NuGet package manager).

Pada project buat file dengan nama DirectExchangeConsumer.cs, kemudian tambahkan kode berikut:

namespace RabbitMQConsumer
{
    public class DirectExchageConsumer
    {
        public static void Consume(IModel channel)
        {
            channel.ExchangeDeclare("contoh-direct-exchange", ExchangeType.Direct);
            channel.QueueDeclare("contoh-direct-queue",
                durable: true,
                exclusive: false,
                autoDelete: false,
                arguments: null);
            channel.QueueBind("contoh-direct-queue", "contoh-direct-exchange", "katalog.barang");

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (sender, e) =>
            {
                var body = e.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(message);
            };

            channel.BasicConsume("contoh-direct-queue", true, consumer);
            Console.WriteLine("aplikasi consumer dijalankan...");
            Console.ReadLine();
        }
    }
}

Pada kode diatas dapat dilihat, pada consumer yang pertama harus dilakukan adalah membuat objek exchange, kemudian membuat objek queue, langkah selanjutnya adalah mengikatkan (membinding) exchange dengan queue dan routing key. Pesan akan diterima pada event consumer.Received. Untuk memanggil class DirectExchangeConsumer pada Program.cs tambahkan kode berikut:

using RabbitMQ.Client;
using RabbitMQConsumer;


var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

DirectExchageConsumer.Consume(channel);

Test Menjalankan Aplikasi

Untuk menjalankan aplikasi, dan mensimulasikan pengiriman data antar pesan, jalankan aplikasi RabbitMQConsumer terlebih dahulu dengan perintah dotnet run, setelah dijalankan lihat pada RabbitMQ Management website, seharusnya dapat dilihat bahwa exchange “contoh-direct-exchange” dan queue “contoh-direct-queue” sudah berhasil untuk dibinding.

Kemudian jalankan aplikasi RabbitMQProducer, dan lihat bahwa pesan yang dikirimkan akan berhasil diambil dan ditampilkan oleh aplikasi RabbitMQConsumer secara terurut.

Pada output diatas dapat dilihat bahwa pesan yang dikirimkan dari aplikasi Producer dapat diambil oleh aplikasi Consumer.

Pada artikel selanjutnya akan dibahas bagaimana cara untuk mengirimkan pesan dengan menggunakan Topic Exchange.

RabbitMQ & .NET 6 Series [Part 1 – Instalasi RabbitMQ dengan Docker]

Di era arsitektur microservices seperti sekarang, komunikasi antar services sangatlah penting. Ada dua macam metode yang sering digunakan untuk komunikasi antar services, yaitu synchronous communication dan asynchronous communication. Untuk melakukan komunikasi secara asynchronous kita membutuhkan message broker. Message broker memungkinkan kita untuk membangun aplikasi/layanan terpisah untuk meningkatkan kinerja, dan keandalan dari aplikasi.

Apa itu Message Broker?

Kita bisa menganalogikan message broker seperti kantor pos, tugasnya adalah mengantarkan pesan antara pengirim dan penerima pesan (surat). Ketika pesan diterima oleh message broker dari producer (pengirim pesan), dia akan mengirimkan pesan tersebut ke subscriber (penerima pesan). Pola message broker ini adalah salah satu pola yang paling berguna pada komunikasi antar services pada microservices yang terpisah.

Apa itu RabbitMQ?

RabbitMQ adalah salah satu message broker dengan lisensi open source yang populer dan banyak digunakan saat ini. RabbitMQ sendiri terkenal cukup ringan dan mudah untuk di deploy. RabbitMQ sendiri juga mendukung banyak protokol komunikasi seperti AMQP, STOMP, HTTP, dan Web Socket. RabbitMQ sudah terbukti memiliki high availability dan skalabilitas yang tinggi.

Instalasi RabbitMQ

Cara yang paling mudah untuk memasang RabbitMQ adalah menggunakan docker container. Pada sistem operasi Windows atau MacOS, kita dapat menginstal Docker Desktop terlebih dahulu. Untuk petunjuk instalasi docker desktop dapat dilihat pada tautan berikut ini. Berikut adalah hasil instalasi dari Docker Desktop.

Untuk mengecek apakah docker sudah terinstall pada komputer, tambahkan perintah berikut:

Setelah dipastikan bahwa docker sudah terinstal pada komputer anda, buat file dengan nama docker-compose.yaml, kemudian tambahkan kode berikut:

Anda dapat menggunakan editor apapun untuk membuat file tersebut, pada contoh ini digunakan editor Visual Studio Code. Kemudian masuk pada folder dimana anda sudah membuat file tersebut, kemudian jalankan perintah docker-compose up.

Untuk melihat apakah RabbitMQ sudah terpasang, anda dapat mengakses url https://localhost:15672, maka akan ditampilkan hasil sebagai berikut:

Kemudian masukan username: guest, dan password: guest. Jika berhasil maka akan muncul tampilan RabbitMQ Management untuk memonitor RabbitMQ server dari web browser.

Pada artikel selanjutnya akan dijelaskan penggunaan exchange dan tipe-tipe exchange pada RabbitMQ seperti Direct, Topic, Header, dan Fanout.