Menu Navigasi

Tutorial Pemrograman & Komputer Part 36: Pengantar ke Teknik Backpressure dalam Sistem Message Queue

AI Generated
29 Desember 2025
75 views
Tutorial Pemrograman & Komputer Part 36: Pengantar ke Teknik Backpressure dalam Sistem Message Queue

Pendahuluan

Selamat datang di Part 36 dari seri tutorial Pemrograman & Komputer! Di part sebelumnya, kita telah memahami konsep dasar Message Queues. Kali ini, kita akan menyelami teknik penting yang disebut Backpressure. Backpressure sangat penting untuk membangun sistem yang tangguh dan stabil, terutama saat berurusan dengan aliran data yang tidak seimbang antara produsen dan konsumen pesan.

Prasyarat: Memahami konsep dasar Message Queues (Part 35).

Konsep Dasar Backpressure

Bayangkan sebuah pabrik dengan dua bagian: satu yang menghasilkan produk (produsen) dan satu yang memproses produk tersebut (konsumen). Jika produsen menghasilkan produk terlalu cepat dan konsumen tidak dapat memprosesnya secepat itu, tumpukan produk akan terjadi. Ini adalah analogi dari masalah yang dihadapi dalam sistem Message Queue.

Backpressure adalah mekanisme untuk mencegah produsen mengirimkan data lebih cepat daripada yang dapat diproses oleh konsumen. Intinya, konsumen memberi tahu produsen untuk memperlambat laju pengiriman. Ini seperti memberitahu pabrik untuk mengurangi produksi jika gudang sudah penuh. Dengan menerapkan backpressure, kita mencegah sistem dari overload dan memastikan keandalan.

Hands-on Coding (Node.js dengan RabbitMQ)

Mari kita lihat bagaimana backpressure dapat diimplementasikan menggunakan Node.js dan RabbitMQ. Kita akan membuat produsen yang mengirimkan pesan dan konsumen yang memprosesnya. Kita akan menerapkan backpressure untuk mencegah konsumen kewalahan.

Contoh Produsen


const amqp = require('amqplib/callback_api');

const queue = 'tasks';

// Jumlah pesan yang akan dikirim
const messageCount = 100;


amqp.connect('amqp://localhost', function(error0, connection) {
  if (error0) {
    throw error0;
  }

  connection.createChannel(function(error1, channel) {
    if (error1) {
      throw error1;
    }

    channel.assertQueue(queue, { durable: false });

    for (let i = 0; i < messageCount; i++) {
      const message = `Task ${i + 1}`;
      channel.sendToQueue(queue, Buffer.from(message));
      console.log(`Sent ${message}`);
    }

    setTimeout(function() {
      connection.close();
      process.exit(0)
    }, 500);
  });
});

Kode di atas menghasilkan 100 pesan dan mengirimkannya ke antrian 'tasks'.

Contoh Konsumen dengan Backpressure (Prefetch)


const amqp = require('amqplib/callback_api');

const queue = 'tasks';


amqp.connect('amqp://localhost', function(error0, connection) {
  if (error0) {
    throw error0;
  }
  connection.createChannel(function(error1, channel) {
    if (error1) {
      throw error1;
    }

    channel.assertQueue(queue, { durable: false });
    // Set prefetch count. Hanya mengambil satu pesan pada satu waktu.
    channel.prefetch(1);

    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", queue);

    channel.consume(queue, function(msg) {
      const secs = msg.content.toString().split('.').length - 1;

      console.log(" [x] Received %s", msg.content.toString());
      setTimeout(function() {
        console.log(" [x] Done");
        // Kirim acknowledgement ke RabbitMQ
        channel.ack(msg);
      }, secs * 1000);
    }, { noAck: false }); // Pastikan noAck di set false untuk acknowledgment
  });
});

Perhatikan baris channel.prefetch(1);. Ini adalah kunci untuk menerapkan backpressure. Dengan mengatur `prefetch` ke 1, kita memberi tahu RabbitMQ bahwa konsumen ini hanya akan mengambil satu pesan pada satu waktu. RabbitMQ tidak akan mengirimkan pesan baru sampai konsumen mengakui (acknowledges) bahwa pesan sebelumnya telah diproses. Ini menciptakan efek backpressure, mencegah produsen membanjiri konsumen.

Common Pitfalls

  • Lupa Mengatur noAck: false: Jika `noAck` diatur ke `true`, konsumen tidak akan mengakui pesan, dan backpressure tidak akan berfungsi.
  • Nilai prefetch Terlalu Tinggi: Mengatur `prefetch` ke nilai yang terlalu tinggi akan mengurangi efektivitas backpressure.
  • Tidak Menangani Error: Pastikan kode Anda menangani error dengan baik. Jika konsumen mengalami error saat memproses pesan dan tidak mengirim acknowledgement, pesan akan terjebak dalam antrian.

Challenge

Modifikasi contoh di atas untuk mengimplementasikan backpressure berdasarkan metrik yang berbeda, seperti penggunaan CPU atau memori konsumen. Anda dapat menggunakan library seperti os di Node.js untuk memantau sumber daya sistem.

Sumber Referensi

Bagikan: