Each message is routed to one queue based on binding, where routing key matches exactly.
Think "unicast"
Routing Key is ignored. A copy of the message is sent to each queue the exchange is bound to.
Think "multicast"
Routing key must be dot-delimited. Binding defines regex-style matching.
Imagine keys like "sad.orange.rabbit" and "lazy.purple.lizard", and a queue that wants all "color" keys, and another queue that only wants "reptile" keys.
The RabbitMQ docs/tutorials are pretty great, full of Javascript/Python/Java/C#/Go/Ruby/Swift/PHP examples, make use of them.