How to migrate a legacy monolith to event-driven architecture without stopping the business
Migrating a legacy monolith to event-driven architecture (EDA) is a common challenge for enterprises. The goal is to achieve better scalability, resilience, and maintainability while keeping the business running. This article outlines a phased approach that minimizes downtime and risk.
01. Assess the current system
Before planning the migration, you must understand the existing monolith. Key areas to evaluate:
- Codebase analysis: Identify tightly coupled modules and critical dependencies.
- Performance metrics: Document current latency, throughput, and failure rates.
- Business criticality: Map out which features are revenue-generating vs. operational.
Use tools like AWS X-Ray or Datadog to generate dependency graphs. The output should show which services are most interdependent—these will be your first candidates for extraction.
02. Define success metrics
Establish measurable goals for the migration:
- Reduced 99th percentile latency by X%
- Increased deployment frequency by Y times
- Decreased mean time to recovery (MTTR) by Z hours
Track these metrics continuously using tools like Prometheus or CloudWatch. Set up alerts for regression in any metric.
03. Choose your event bus
The event bus is the backbone of your EDA. Options include:
- AWS EventBridge: Managed service with schema registry and replay capabilities.
- Azure Event Grid: Tight integration with Microsoft ecosystem.
- Kafka: Open-source with strong community support but higher operational overhead.
For most enterprises, AWS EventBridge offers the best balance of cost and ease of use. It supports both custom events and integration with SaaS applications.

04. Design the migration strategy
Adopt a "strangler fig" pattern where new services are built alongside the monolith:
- Identify a bounded context to extract (e.g., order processing)
- Build a new microservice that implements the same functionality
- Route a percentage of traffic to the new service
- Gradually increase traffic until the monolith can be removed
This approach requires careful versioning of events to maintain backward compatibility.

05. Implement event versioning
Event schemas should follow semantic versioning:
- v1.0: Initial schema
- v1.1: Backward-compatible additions
- v2.0: Breaking changes requiring consumer updates
Use AWS EventBridge Schema Registry to enforce schema validation. This prevents consumers from breaking when event formats change.

06. Handle data consistency
Event-driven systems face the CAP theorem challenge. Choose your approach:
- Eventual consistency: Accept that data will be temporarily inconsistent.
- Saga pattern: Implement compensating transactions for failures.
- Transactional outbox: Use database transactions to ensure events are published atomically.
The transactional outbox pattern is most reliable but requires database support (PostgreSQL, Oracle).
07. Monitor and observe
Implement comprehensive observability:
- Distributed tracing with AWS X-Ray
- Event-level metrics in CloudWatch
- Dead letter queues for failed events
Set up alerts for:
- High error rates in event processing
- Growing dead letter queue sizes
- Schema validation failures
08. Calculate cost impact
Estimate costs for a medium-sized monolith (100,000 requests/day):
| Component | Current Cost | EDA Cost | Delta |
|---|---|---|---|
| Compute | $5,000/month | $7,500/month | +50% |
| Event Processing | $0 | $2,000/month | +100% |
| Total | $5,000 | $9,500 | +90% |
Note: These figures assume AWS services. Costs may vary significantly based on region and usage patterns.
09. Plan for failure modes
Prepare for common failure scenarios:
- Event storm: Implement rate limiting and backpressure mechanisms.
- Schema drift: Use schema evolution tools and consumer-driven contracts.
- Consumer lag: Monitor consumer group offsets and scale consumers horizontally.
Build automated recovery procedures for each failure mode.
10. Execute the migration
Follow this phased rollout:
- Extract one bounded context (Phase 1)
- Gradually increase traffic to new service (Phase 2)
- Repeat for remaining contexts (Phase 3)
- Decommission monolith when all traffic is routed (Phase 4)
Each phase should include a rollback plan in case of unexpected issues.
11. Validate the new architecture
After migration, verify:
- All business functionality is preserved
- Performance meets or exceeds pre-migration levels
- Observability provides actionable insights
Run chaos engineering experiments to test resilience under failure conditions.
12. Optimize the event-driven system
After stabilization, consider:
- Implement event sourcing for audit trails
- Add CQRS patterns for read-heavy workloads
- Optimize event processing with AWS Lambda or Kinesis
These optimizations should be done incrementally to avoid disrupting the business.
Conclusion
Migrating to event-driven architecture requires careful planning and execution. The key to success is:
- Starting small with high-impact services
- Maintaining backward compatibility
- Building comprehensive observability
- Iterating based on real-world performance
This approach minimizes business disruption while achieving the long-term benefits of EDA.
Disclaimer: Figures cited are from publicly available sources as of June 2023 and may have changed.
Next step: Begin by extracting the least critical bounded context to validate your approach before committing to a full migration.