Event-driven microservices communicate asynchronously using events published to an event backbone like Apache Kafka. This approach offers benefits like loose coupling, responsiveness, and independent scalability. Various patterns can be used to manage complexity, including having each service store its own data, using Kafka log compaction to replicate data across services, orchestrating multi-step processes through sagas, and separating read and write concerns with CQRS. Event storming helps identify the events, actors, and data in an application to structure it in an event-driven way.