I have several services on different machines and a message-passing system suits my problem.
Reliability – sent messages always delivered, even if one end goes down – is the key concern, although it should also be fast and reasonably bandwidth-efficient.
So which message queue should I use?
RabbitMQ is a solution that covers all your requirements. It also has bindings for many languages (Java, C, Python, …).
RabbitMQ servers are also available for both *nix and Windows environments.