Message: a small envelope with name, payload, and headers.MessagePublisher: interface for publishing.MessageHandler: interface for consuming.InMemoryMessageBus: local example implementation for tests and demos.
Real projects can add adapters for RabbitMQ, SQS, Azure Service Bus, Kafka, or
Celery without changing services. Services should depend on MessagePublisher.
Use past-tense event names for facts:
user.registeredinvoice.createdpayment.failed