Dua Berkas Konfigurasi
| Berkas | Isi | Format |
|---|---|---|
rabbitmq.conf | Hampir semua setelan | kunci = nilai (sysctl) |
advanced.config | Setelan yang tidak tersedia di atas | Erlang term |
rabbitmq-env.conf | Variabel lingkungan node | Shell |
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.
## ── 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 sekaliRabbitMQ melindungi dirinya dengan dua alarm. Saat salah satunya menyala, semua producer diblokir — bukan diperlambat, tetapi benar-benar berhenti.
memory alarm : pemakaian memori > vm_memory_high_watermark
disk alarm : sisa disk < disk_free_limitKonsumer 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
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.[Service]
LimitNOFILE=65536 ulimits:
nofile:
soft: 65536
hard: 65536Plugin yang Layak Dinyalakan
| Plugin | Fungsi | Catatan |
|---|---|---|
rabbitmq_management | UI dan HTTP API | Wajib untuk operasi harian |
rabbitmq_prometheus | Metrik di :15692/metrics | Wajib untuk monitoring |
rabbitmq_shovel | Memindahkan pesan antar broker | Migrasi, DR |
rabbitmq_federation | Replikasi exchange lintas broker | Multi-region |
rabbitmq_delayed_message_exchange | Penundaan pesan sungguhan | Plugin komunitas, unduh manual |
rabbitmq_stream | Tipe queue Stream | Untuk kebutuhan seperti Kafka |
rabbitmq-plugins enable rabbitmq_management rabbitmq_prometheus
# di Docker, lebih baik permanen lewat berkas:
# enabled_plugins berisi:
# [rabbitmq_management,rabbitmq_prometheus].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.
services:
rabbitmq:
hostname: rabbit-1 # WAJIB, jangan biarkan acak
volumes:
- rabbit-data:/var/lib/rabbitmqCompose Produksi Minimal
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: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.