Skip to main content

RabbitMQ

Overview

RabbitMQ digunakan sebagai message bus untuk komunikasi antar services.

Configuration

Docker Compose

rabbitmq:
image: rabbitmq:3-management
container_name: rabbitmq
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: rabbitmq123
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rabbitmq-data:/var/lib/rabbitmq
- ./configs/rabbitmq/definitions.json:/etc/rabbitmq/definitions.json:ro
- ./configs/rabbitmq/init.sh:/docker-entrypoint-initdb.d/init.sh:ro
mem_limit: 256m
cpus: "0.25"
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s

definitions.json

{
"exchanges": [
{
"name": "clm.events",
"vhost": "/",
"type": "topic",
"durable": true,
"auto_delete": false
}
],
"queues": [
{
"name": "clm.alerts",
"vhost": "/",
"durable": true,
"auto_delete": false
},
{
"name": "clm.audit",
"vhost": "/",
"durable": true,
"auto_delete": false
},
{
"name": "clm.notifications",
"vhost": "/",
"durable": true,
"auto_delete": false
}
],
"bindings": [
{
"source": "clm.events",
"vhost": "/",
"destination": "clm.alerts",
"destination_type": "queue",
"routing_key": "alert.*"
},
{
"source": "clm.events",
"vhost": "/",
"destination": "clm.audit",
"destination_type": "queue",
"routing_key": "audit.*"
},
{
"source": "clm.events",
"vhost": "/",
"destination": "clm.notifications",
"destination_type": "queue",
"routing_key": "notification.*"
}
]
}

Exchanges & Queues

Exchanges

ExchangeTypeDescription
clm.eventstopicMain event exchange

Queues

QueueRouting KeyDescription
clm.alertsalert.*Alert events
clm.auditaudit.*Audit events
clm.notificationsnotification.*Notification events

Publishing Messages

Go Backend

import "github.com/streadway/amqp"

func PublishAlert(conn *amqp.Connection, alert Alert) error {
ch, err := conn.Channel()
if err != nil {
return err
}
defer ch.Close()

body, _ := json.Marshal(alert)

return ch.Publish(
"clm.events",
"alert.created",
false,
false,
amqp.Publishing{
ContentType: "application/json",
Body: body,
},
)
}

Consumer Service

func ConsumeAlerts(conn *amqp.Connection) error {
ch, err := conn.Channel()
if err != nil {
return err
}
defer ch.Close()

msgs, err := ch.Consume(
"clm.alerts",
"",
true,
false,
false,
false,
nil,
)

for msg := range msgs {
var alert Alert
json.Unmarshal(msg.Body, &alert)
processAlert(alert)
}

return nil
}

Management UI

Access

http://localhost:15672

Credentials

UsernamePassword
adminrabbitmq123

CLI Commands

# List queues
docker exec rabbitmq rabbitmqctl list_queues

# List connections
docker exec rabbitmq rabbitmqctl list_connections

# List channels
docker exec rabbitmq rabbitmqctl list_channels

Monitoring

Health Check

docker exec rabbitmq rabbitmq-diagnostics check_port_connectivity

Metrics

curl -u admin:rabbitmq123 http://localhost:15672/api/overview

Troubleshooting

Check Logs

docker logs rabbitmq --tail 100

Restart Service

docker compose restart rabbitmq

Next Steps