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​