Kodeloka
  1. Kodeloka
  2. Kelas RabbitMQ
  3. Materi

Modul 2 · Modul 2 dari 15

Instalasi & Konfigurasi: rabbitmq.conf, Plugin, dan Batas Sistem

Memasang RabbitMQ dengan setelan yang layak produksi, dan memahami batas sistem yang menjatuhkan broker di saat sibuk.

Dua Berkas Konfigurasi

BerkasIsiFormat
rabbitmq.confHampir semua setelankunci = nilai (sysctl)
advanced.configSetelan yang tidak tersedia di atasErlang term
rabbitmq-env.confVariabel lingkungan nodeShell

Sejak RabbitMQ 3.7, format rabbitmq.conf yang sederhana menggantikan sintaks Erlang lama. Bila menemukan contoh berisi tanda kurung siku dan koma di internet, itu format advanced.config yang lama — jangan dicampur.

rabbitmq.confini
## ── Jaringan ──
listeners.tcp.default = 5672
management.tcp.port   = 15672

## ── Batas sumber daya ──
# Broker berhenti menerima publish saat memori melewati ambang ini
vm_memory_high_watermark.relative = 0.6
# Alternatif absolut, lebih dianjurkan di container:
# vm_memory_high_watermark.absolute = 2GB

# Broker berhenti menerima publish saat sisa disk di bawah ini
disk_free_limit.absolute = 5GB

## ── Koneksi ──
heartbeat = 60
# Timeout handshake untuk klien yang lambat
handshake_timeout = 10000
channel_max = 2047

## ── Antrean ──
# Tipe queue default bila klien tidak menyebutkannya
default_queue_type = quorum

## ── Log ──
log.console = true
log.console.level = info
log.file = false

## ── Keamanan ──
loopback_users = none
# guest hanya boleh dari localhost; di produksi hapus sama sekali
⛔ Dua alarm yang menghentikan seluruh publish

RabbitMQ melindungi dirinya dengan dua alarm. Saat salah satunya menyala, semua producer diblokir — bukan diperlambat, tetapi benar-benar berhenti.

text
memory alarm : pemakaian memori > vm_memory_high_watermark
disk alarm   : sisa disk < disk_free_limit

Konsumer tetap berjalan, sehingga antrean menyusut dan alarm akhirnya mati sendiri. Tetapi bagi aplikasi Anda, gejalanya adalah publish menggantung tanpa error — sangat membingungkan bila Anda tidak tahu mekanisme ini ada.

Pantau rabbitmq_alarms_memory_used_watermark dan pasang alert jauh sebelum ambangnya tercapai.

Batas Sistem yang Sering Terlupakan

hitungan file descriptortext
Setiap connection    = 1 file descriptor
Setiap queue         ≈ 1 file descriptor (classic queue dengan indeks)
Ditambah soket internal cluster, koneksi manajemen, dsb.

Default ulimit -n biasanya 1024 → broker mentok di ±800 connection.

Produksi: minimal 65536.
/etc/systemd/system/rabbitmq-server.service.d/limits.confini
[Service]
LimitNOFILE=65536
docker-compose.yml — bagian ulimitsyaml
    ulimits:
      nofile:
        soft: 65536
        hard: 65536

Plugin yang Layak Dinyalakan

PluginFungsiCatatan
rabbitmq_managementUI dan HTTP APIWajib untuk operasi harian
rabbitmq_prometheusMetrik di :15692/metricsWajib untuk monitoring
rabbitmq_shovelMemindahkan pesan antar brokerMigrasi, DR
rabbitmq_federationReplikasi exchange lintas brokerMulti-region
rabbitmq_delayed_message_exchangePenundaan pesan sungguhanPlugin komunitas, unduh manual
rabbitmq_streamTipe queue StreamUntuk kebutuhan seperti Kafka
mengaktifkan pluginbash
rabbitmq-plugins enable rabbitmq_management rabbitmq_prometheus

# di Docker, lebih baik permanen lewat berkas:
# enabled_plugins berisi:
# [rabbitmq_management,rabbitmq_prometheus].
⚠️ Nama node terikat pada hostname

Nama node RabbitMQ berbentuk rabbit@<hostname>, dan direktori datanya mengikuti nama itu. Bila container di-restart dengan hostname acak, broker akan mencari data di direktori baru — seluruh queue tampak hilang padahal berkasnya masih ada.

yaml
services:
  rabbitmq:
    hostname: rabbit-1       # WAJIB, jangan biarkan acak
    volumes:
      - rabbit-data:/var/lib/rabbitmq

Compose Produksi Minimal

docker-compose.ymlyaml
services:
  rabbitmq:
    image: rabbitmq:4.1-management
    hostname: rabbit-1
    restart: unless-stopped
    ports:
      - "5672:5672"
      - "15672:15672"
      - "15692:15692"                 # metrik Prometheus
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS_FILE: /run/secrets/rmq_pass
      RABBITMQ_ERLANG_COOKIE_FILE: /run/secrets/erlang_cookie
    volumes:
      - rabbit-data:/var/lib/rabbitmq
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
      - ./definitions.json:/etc/rabbitmq/definitions.json:ro
    ulimits:
      nofile: { soft: 65536, hard: 65536 }
    deploy:
      resources:
        limits: { memory: 4G }
    secrets: [rmq_pass, erlang_cookie]
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "-q", "status"]
      interval: 30s
      timeout: 15s
      retries: 5
      start_period: 60s

secrets:
  rmq_pass:      { file: ./secrets/rmq_pass.txt }
  erlang_cookie: { file: ./secrets/erlang_cookie.txt }

volumes:
  rabbit-data:
💡 Beri broker memori yang cukup, lalu setel watermark absolut

Di dalam container, vm_memory_high_watermark.relative menghitung dari memori host pada beberapa konfigurasi, bukan dari batas container. Akibatnya broker mengira punya 64 GB padahal dibatasi 4 GB, lalu di-OOM-kill oleh kernel sebelum alarm memorinya sempat menyala.

Di container, selalu pakai bentuk absolut: vm_memory_high_watermark.absolute = 2GB dengan limit container 4GB.