I have 3 containers that connect to RabbitMQ: 1 container (Payment service) as the publisher, and 2 containers (Cart and Catalog services) as consumers. They are all in the same network and run using Docker Compose. Weird thing is Payment and Catalog containers have no problems connecting to RabbitMQ container while Cart service connection is always refused. Not sure what's causing this, before containerizing my services all 3 local services had no issue connecting to RabbitMQ container.
Is it possible the issue is because Cart container tried to connect before RabbitMQ in its container finished starting up?
Happened in Cart container only:
amqp.Dial dial tcp 192.168.96.3:5672: connect: connection refused
Docker compose:
cart-service:
build:
context: .
dockerfile: ./build/cart/Dockerfile
networks:
- shopnetwork
ports:
- 50052:50052
env_file:
- .env
depends_on:
- catalog-service
- payment-service
- redis
- rabbitmq
catalog-service:
build:
context: .
dockerfile: ./build/catalog/Dockerfile
networks:
- shopnetwork
ports:
- 50051:50051
env_file:
- .env
depends_on:
- mongo1
- mongo2
- mongo3
- rabbitmq
payment-service:
build:
context: .
dockerfile: ./build/payment/Dockerfile
networks:
- shopnetwork
ports:
- 50053:50053
env_file:
- .env
depends_on:
- mongo1
- mongo2
- mongo3
- rabbitmq
rabbitmq:
image: rabbitmq:3.9.11-management
networks:
- shopnetwork
ports:
- 5672:5672
- 15672:15672
networks:
shopnetwork:
My rabbitmq connection initialization code. Payment, Cart, and Catalog all use the same codes for establishing the connection (failed when dialing on line 9):
// NewRabbitMQ instantiates the RabbitMQ instances using configuration defined in environment variables.
func NewRabbitMQ() (*Rabbitmq, error) {
username := os.Getenv("RABBITMQ_USERNAME")
password := os.Getenv("RABBITMQ_PASSWORD")
hostname := os.Getenv("RABBITMQ_HOST")
port := os.Getenv("RABBITMQ_PORT")
url := fmt.Sprintf("amqp://%s:%s@%s:%s/", username, password, hostname, port)
conn, err := amqp.Dial(url) // <----------------- FAILED HERE
if err != nil {
return nil, fmt.Errorf("amqp.Dial %w", err)
}
ch, err := conn.Channel()
if err != nil {
return nil, fmt.Errorf("conn.Channel %w", err)
}
err = ch.ExchangeDeclare(
"tasks", // name
"topic", // type
true, // durable
false, // auto-deleted
false, // internal
false, // no-wait
nil, // arguments
)
if err != nil {
return nil, fmt.Errorf("ch.ExchangeDeclare %w", err)
}
if err := ch.Qos(
1, // prefetch count
0, // prefetch size
false, // global
); err != nil {
return nil, fmt.Errorf("ch.Qos %w", err)
}
return &Rabbitmq{
Conn: conn,
Channel: ch,
}, nil
}
My .env for RABBITMQ:
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_HOST=rabbitmq
RABBITMQ_PORT=5672
RABBITMQ_MANAGEMENT_PORT=15672