Belajar .NET - Messaging & Integration
Series/Belajar .NET/Episode 17
Episode 17 of 23

Belajar .NET - Messaging & Integration

Episode ini membangun sistem terintegrasi: background dan hosted services, message brokers seperti RabbitMQ, Kafka, dan Azure Service Bus, integrasi gRPC dan REST antar layanan, serta distributed transactions dan eventual consistency dalam arsitektur terdistribusi.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Aplikasi modern jarang berdiri sendiri. Episode 17 membahas messaging dan integration — bagaimana layanan .NET berkomunikasi, memproses pekerjaan di latar belakang, dan tetap konsisten saat dibagi menjadi banyak layanan.

Kalian akan belajar hosted services untuk pekerjaan background, integrasi dengan message broker seperti RabbitMQ, Kafka, dan Azure Service Bus, komunikasi gRPC dan REST, serta cara menangani konsistensi dalam sistem terdistribusi — di mana transaksi database tunggal tidak lagi cukup.

Background Services dan Hosted Services

Membuat Worker Service

Hosted service adalah layanan yang berjalan seumur hidup aplikasi di dalam Generic Host. Template worker menyediakan kerangkanya:

Buat worker service
dotnet new worker -n OrderWorker

dotnet new worker -n OrderWorker membuat project dengan Worker yang mengimplementasikan BackgroundService — method ExecuteAsync dijalankan segera setelah host mulai, dan dihentikan rapi saat host shut down.

Contoh BackgroundService

Kelas worker memproses antrean dalam loop:

BackgroundService sederhana
public class OrderWorker : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
            Console.WriteLine("Cek pesanan baru");
        }
    }
}

ExecuteAsync berjalan terus sampai stoppingToken dibatalkan saat host berhenti. Pola ini dipakai untuk job terjadwal, pembersihan cache, dan integrasi background.

Message Brokers

Konsep Broker Pesan

Message broker menengahi komunikasi antar layanan lewat antrean atau topik. Produsen mengirim pesan tanpa menunggu konsumen; konsumen memproses sesuai kecepatannya. Ini memutus kopling waktu antara layanan.

  • RabbitMQ: broker klasik dengan routing fleksibel, mudah dioperasikan.
  • Kafka: log terdistribusi untuk streaming dan event besar.
  • Azure Service Bus: managed service di Azure dengan fitur enterprise.

Mengirim Pesan dengan MassTransit

Library MassTransit menyatukan integrasi broker dengan abstraksi yang rapi:

Install MassTransit dan RabbitMQ
dotnet add package MassTransit
dotnet add package MassTransit.RabbitMQ

Konfigurasi koneksi:

Konfigurasi MassTransit
builder.Services.AddMassTransit(x =>
{
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost", "/", h =>
        {
            h.Username("guest");
            h.Password("guest");
        });
    });
});

UsingRabbitMq menghubungkan bus ke broker. Setelah terdaftar, layanan bisa mengirim pesan via IPublishEndpoint atau menerima lewat consumer. Mengganti broker (misalnya ke Azure Service Bus) cukup dengan mengubah satu baris konfigurasi — kode bisnis tidak berubah.

Memilih Broker

Panduan:

  • RabbitMQ: routing kompleks, load sedang, mudah di-setup sendiri.
  • Kafka: volume event sangat tinggi, replay log, streaming.
  • Azure Service Bus: integrasi Azure, topik dan sesi, tanpa operasi.

Integrasi gRPC dan REST

gRPC untuk Komunikasi Antar Layanan

gRPC memberi performa tinggi dengan binary protocol untuk komunikasi antar layanan. Definisi kontrak ditulis di file .proto:

Definisi kontrak gRPC
syntax = "proto3";
 
service Katalog {
  rpc GetProduk(ProdukId) returns (Produk);
}
 
message ProdukId { int32 id = 1; }
message Produk { string nama = 1; double harga = 2; }

gRPC mengkompilasi file .proto menjadi client dan server C# yang strongly typed. Untuk komunikasi internal antar layanan yang sensitif terhadap latensi, gRPC mengungguli REST karena serialisasi binary dan HTTP/2.

REST untuk Batas Sistem

Gunakan REST di batas sistem yang terbuka untuk klien eksternal — browser, mobile, dan partner — karena keterbacaan dan dukungan tooling-nya universal. Pola umum: REST di tepi, gRPC di dalam. Keduanya hidup berdampingan di ASP.NET Core tanpa konflik.

Distributed Transactions dan Eventual Consistency

Mengapa Transaksi Tunggal Gagal di Sini

Di microservice, operasi melintasi banyak database — transaksi ACID tunggal tidak berlaku. Solusi pragmatis adalah eventual consistency: sistem mencapai konsistensi setelah jangka waktu tertentu, dengan event sebagai penggeraknya.

Pola outbox
public class OutboxMessage
{
    public Guid Id { get; set; }
    public string Tipe { get; set; }
    public string Payload { get; set; }
    public bool Dikirim { get; set; }
}

Pola transactional outbox menyimpan event dalam tabel yang sama dengan transaksi bisnis, lalu worker mengirimkannya ke broker. Ini menjamin event tidak hilang: jika pengiriman gagal, pesan tetap di outbox dan dicoba lagi.

Saga untuk Kompensasi

Untuk alur panjang antar layanan, gunakan saga: setiap langkah punya pasangan kompensasi. Jika langkah gagal, saga menjalankan kompensasi langkah-langkah sebelumnya — misalnya batalkan pesanan jika pembayaran gagal. Konsistensi tercapai secara eventual, bukan atomik.

Tip

Desain pesan agar idempotent: konsumen harus bisa memproses pesan yang sama lebih dari sekali tanpa efek ganda. Ini menyederhanakan retry dan kompensasi secara drastis.

Ringkasan Praktik Messaging

  • Gunakan BackgroundService untuk pekerjaan terjadwal di latar belakang.
  • MassTransit mengabstraksi RabbitMQ, Kafka, dan Azure Service Bus.
  • Pakai gRPC di dalam sistem, REST di batas eksternal.
  • Transactional outbox mencegah event hilang.
  • Saga menyediakan kompensasi untuk alur lintas layanan.
  • Pastikan pesan idempotent untuk retry yang aman.

Penutup

Inti yang harus dibawa pulang:

  • Hosted services menjalankan pekerjaan background seumur hidup aplikasi.
  • Message broker memutus kopling waktu antar layanan.
  • RabbitMQ, Kafka, dan Azure Service Bus dipilih sesuai volume dan kebutuhan.
  • gRPC memberi performa untuk komunikasi internal; REST untuk eksternal.
  • Eventual consistency menggantikan transaksi lintas layanan.
  • Transactional outbox dan saga menjaga konsistensi dan kompensasi.

Di episode 18 selanjutnya kita akan membahas tooling modern dan build automation — dotnet CLI, MSBuild, dan SDK-style projects, continuous integration dengan GitHub Actions, source generators dan Roslyn analyzers, serta code formatting, linting, dan reproducible builds.

Belajar .NET - Messaging & Integration | Belajar .NET