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.

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s