Message queues provide a way for applications and systems to communicate asynchronously by passing messages. They allow for decoupling of components and offloading of work. Some common uses of message queues include asynchronous processing, communication between applications/systems, auto-scaling, and handling legacy applications. Popular message queue servers include RabbitMQ, ActiveMQ, and Beanstalkd. Code examples are provided for publishing and receiving messages with each server.