I partially disagree. Retrying is certainly a good tool to have but it could very easily lead to exhaustion of resources without a circuit breaker.
Imagine a system with high volume of transaction where one of the services is off for a few hours.
A typical retry policy with an exponential back-off algorithm (2,4,8 seconds up to 1 minute) would quickly create a large number of sleeping threads or elements in waiting queue.
A circuit breaker would prevent a system collapse by inhibiting the retry but the command is still lost. Also, an in-memory retry mechanism would not survive a system restart.
In my opinion better results are achieved by using an application designed for resilient message delivery. Tools like RabbitMQ or AcitiveMQ offer a large set of configuration options do deal with failed deliveries like dead letter queues, routing, bouncing, etc.
Retries attempts can be configured to span from seconds to days without any detrimental effect on the producers.