Kodeloka
  1. Kodeloka
  2. Kelas RabbitMQ
  3. Materi

Modul 14 ยท Modul 14 dari 15

Monitoring, Flow Control, dan Menyetel Performa

Mengetahui metrik mana yang benar-benar memprediksi masalah, dan membaca sinyal yang dikirim broker sebelum ia kewalahan.

Metrik yang Benar-benar Penting

aktifkan pluginbash
rabbitmq-plugins enable rabbitmq_prometheus
# metrik tersedia di http://node:15692/metrics
MetrikArtinyaKapan mengkhawatirkan
rabbitmq_queue_messages_readyMenunggu dikonsumsiNaik terus tanpa turun
rabbitmq_queue_messages_unackedSedang diprosesTinggi dan diam = konsumer menggantung
rabbitmq_queue_consumersJumlah konsumer0 pada queue produksi
rabbitmq_alarms_memory_used_watermarkAlarm memoriBernilai 1 = publish diblokir
rabbitmq_alarms_free_disk_space_watermarkAlarm diskBernilai 1 = publish diblokir
rabbitmq_process_open_fdsFile descriptor terpakai> 80% dari batas
rabbitmq_connectionsJumlah koneksiNaik terus = kebocoran koneksi
rabbitmq_channelsJumlah channelRibuan per koneksi = bug
rabbitmq_queue_messages_published_totalLaju publishBandingkan dengan laju konsumsi
rabbitmq_disk_space_available_bytesSisa diskMendekati disk_free_limit
๐ŸŽฏ Metrik terpenting: laju masuk versus laju keluar
promql
# selisih positif yang bertahan = antrean akan tumbuh tanpa batas
sum by (queue) (rate(rabbitmq_queue_messages_published_total[5m]))
  -
sum by (queue) (rate(rabbitmq_queue_messages_delivered_total[5m]))

Jumlah pesan di queue hanyalah gejala. Selisih laju adalah penyebabnya, dan ia memperingatkan Anda jauh sebelum antrean menjadi besar.

Alert yang Layak Dipasang

alert Prometheusyaml
groups:
  - name: rabbitmq
    rules:
      - alert: QueueTanpaKonsumer
        expr: rabbitmq_queue_consumers{queue!~".*\\.dlq"} == 0
        for: 5m
        labels: { severity: critical }
        annotations:
          summary: 'Queue {{ $labels.queue }} tidak punya konsumer'
          runbook_url: https://wiki.internal/runbook/rmq-tanpa-konsumer

      - alert: AntreanTumbuhTerus
        expr: |
          sum by (queue) (rate(rabbitmq_queue_messages_published_total[10m]))
            -
          sum by (queue) (rate(rabbitmq_queue_messages_delivered_total[10m]))
            > 0
        for: 15m
        labels: { severity: warning }

      - alert: DLQTidakKosong
        expr: rabbitmq_queue_messages{queue=~".*\\.dlq"} > 0
        for: 10m
        labels: { severity: warning }

      - alert: AlarmBrokerAktif
        expr: |
          rabbitmq_alarms_memory_used_watermark == 1
            or
          rabbitmq_alarms_free_disk_space_watermark == 1
        for: 1m
        labels: { severity: critical }
        annotations:
          summary: 'Broker memblokir SELURUH publish'

      - alert: FileDescriptorHampirHabis
        expr: rabbitmq_process_open_fds / rabbitmq_process_max_fds > 0.8
        for: 10m
        labels: { severity: warning }

Flow Control: Rem Otomatis Broker

cara kerjatext
Producer terlalu cepat dibanding kemampuan broker menulis ke disk
  โ†’ broker menerapkan credit-based flow control
  โ†’ koneksi producer masuk state "flow"
  โ†’ publish DIPERLAMBAT, bukan ditolak

Ini BUKAN kerusakan; ini mekanisme perlindungan yang bekerja.
Tetapi ia sinyal bahwa sesuatu perlu diperbaiki.
mendeteksi flow controlbash
rabbitmqctl list_connections name state
# state: running | flow | blocked | blocking

rabbitmqctl list_channels name state messages_unconfirmed
StateArti
runningNormal
flowDiperlambat karena broker kewalahan menulis
blockingAkan diblokir karena alarm baru menyala
blockedDiblokir total oleh alarm memori/disk
โš ๏ธ State flow yang menetap adalah peringatan dini

Bila koneksi producer sering berada di state flow, broker sudah berada di batas kemampuannya. Penyebab yang paling sering:

  • Disk lambat โ€” persistensi adalah operasi paling mahal di RabbitMQ.
  • Terlalu banyak queue di satu node.
  • Pesan besar yang persistent dengan laju tinggi.
  • Konsumer terlalu lambat sehingga pesan menumpuk di disk.

Faktor Performa, Berurutan dari yang Paling Berdampak

FaktorDampakTindakan
PersistenceSangat besarPakai transient untuk data yang boleh hilang
Ukuran pesanBesarKirim referensi, bukan payload besar
Jumlah queueBesarRibuan queue membebani manajemen node
Confirm per pesanBesarPakai batch confirm
PrefetchSedangSesuaikan dengan durasi tugas
Jumlah koneksiSedangPakai ulang, jangan buat per operasi
Kecepatan diskBesar untuk persistentSSD/NVMe, bukan disk jaringan lambat
โ›” Jangan mengirim payload besar lewat broker

Pesan berukuran megabyte menghabiskan memori broker, memperlambat replikasi quorum, dan memicu flow control.

text
โŒ publish berisi PDF 8 MB dalam base64

โœ… simpan berkas di object storage (S3/MinIO),
   publish hanya referensinya:
   { "berkas_url": "s3://faktur/2026/07/F-1042.pdf",
     "ukuran": 8388608, "checksum": "sha256:โ€ฆ" }

Batas praktis yang sehat: jaga pesan di bawah 128 KB. Di atas itu, pertimbangkan pola referensi.

Dashboard yang Perlu Ada

  • Ikhtisar broker โ€” alarm, memori, disk, file descriptor, jumlah koneksi.
  • Per queue โ€” ready, unacked, konsumer, laju masuk dan keluar.
  • Kesehatan konsumer โ€” queue tanpa konsumer, waktu proses, laju redelivery.
  • DLQ โ€” jumlah pesan per DLQ dan trennya.
  • Cluster โ€” status node, partisi, kesehatan replika quorum.

Grafana menyediakan dashboard resmi RabbitMQ (ID 10991 untuk ikhtisar, 11340 untuk Erlang VM) yang bisa menjadi titik awal yang baik sebelum Anda menyesuaikannya.

Alat Diagnosis Cepat

urutan pemeriksaan saat insidenbash
rabbitmq-diagnostics alarms          # 1. apakah publish sedang diblokir?
rabbitmq-diagnostics check_running   # 2. apakah node hidup?
rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers
                                     # 3. queue mana yang bermasalah?
rabbitmqctl list_connections name state
                                     # 4. ada koneksi di state flow/blocked?
rabbitmq-diagnostics memory_breakdown
                                     # 5. memori habis untuk apa?
rabbitmqctl cluster_status           # 6. ada partisi?