Distributed systems are becoming increasingly common in today's systems landscape, and messaging is often used to coordinate between components in these systems safely. The benefits of using messaging are numerous, including increased reliability, better performance, easy scalability, and simpler decoupling of components, at which point you might think, "Shut up and take my money!". However, as with any architectural choice, the other side of the coin surfaces challenges and pitfalls that we must consider: diagnosing problems, understanding the system's state, handling duplicate messages or idempotency. To address these problems, we will discuss best practices for designing and implementing durable messaging, including techniques for ensuring reliability, consistency, and decoupling. Finally, we must prepare for and mitigate any unknowns that may arise that we can't anticipate. By the end of this session, you will have a comprehensive understanding of the problem space that comes with messaging and will be better equipped to make informed decisions about whether and how to incorporate messaging into your distributed systems.