5 exercises — practise the language of architecture trade-off discussions: arguing for EDA, justifying eventual consistency, evaluating schema evolution strategy, assessing migration candidates, and diagnosing cascading failures.
0 / 25 completed
1 / 25
In a system design review, a colleague asks: "Why should we consider moving from a REST-based integration to an event-driven architecture? What's the core architectural argument?"
Which answer presents the strongest EDA argument?
Decoupling is the foundational EDA argument — always lead with this in architecture discussions.
REST integration — coupling dimensions:
① Temporal coupling: the downstream service must be available when you call it. If it's down, your request fails.
② Behavioural coupling: you must know the downstream API's endpoint, schema, and authentication.
③ Scaling coupling: high load on your service → immediate high load on the downstream service.
EDA — decoupling benefits:
① Temporal decoupling: publisher and consumer can be offline at different times. Events are stored and processed when the consumer is ready.
② Behavioural decoupling: the publisher doesn't know who consumes its events. New consumers can be added without touching the publisher.
③ Scale decoupling: consumers scale independently; a traffic spike on the producer side doesn't directly flood consumers.
When to bring up REST instead:
• When you need an immediate response to a query (EDA is async; REST is sync)
• When the operation is a request for data, not a notification of a state change
• When simplicity is more important than scalability
Key phrases for architecture discussions:
• "This reduces temporal coupling between the services"
• "The publisher doesn't need to know about its consumers"
• "We get natural backpressure handling through the queue"
2 / 25
Your team is presenting an EDA migration proposal. A stakeholder challenges: "You're introducing eventual consistency — our current REST system is strongly consistent. How do you justify this trade-off?"
The strongest response to the consistency challenge is to be specific about which operations need which guarantee.
Strong consistency requirements (keep synchronous):
• "Is this item still in stock before I charge the customer?" — must be consistent at the moment of decision
• "Does this user have permission to access this resource?" — authorisation checks must be current
• "Is this username already taken?" — uniqueness constraints require immediate consistency
Eventual consistency acceptable (can be event-driven):
• Updating the user's profile in a recommendation engine after a preference change
• Sending a confirmation email after an order is placed
• Generating an analytics report after a transaction is committed
• Syncing data to a secondary datastore or search index
How to frame this in a design review: "We've identified three workflows that require immediate consistency — we'll keep these as synchronous REST calls. The remaining fourteen integration points tolerate eventual consistency within a 500ms window, so those become events. This gives us the scalability benefits of EDA where it matters while preserving correctness guarantees where the business requires them."
Key vocabulary:
• Eventual consistency — all nodes will converge to the same state, given no new updates, within some bounded time
• Strong consistency — all reads reflect the most recent write, immediately
• Hybrid architecture — synchronous paths for consistency-critical operations; events for the rest
• Consistency boundary — the scope within which a particular consistency guarantee is maintained
3 / 25
During an architecture review of a proposed event-driven system, you are asked to explain the risk of event schema evolution. What points should you cover?
Event schema evolution is one of the hardest long-term operational challenges in EDA — it deserves careful upfront planning.
Why it's harder than REST API versioning:
• REST has a clear requester — you can version the URL and migrate one client at a time
• Events have many consumers — some may be unknown to the publisher at publish time
• Old events may be replayed years later by new consumers — they must understand old event schemas
Schema evolution strategies:
① Schema Registry (Apache Confluent Schema Registry)
• Centrally stores all event schemas with version numbers
• Enforces compatibility rules at publish time: BACKWARD, FORWARD, or FULL compatibility
• BACKWARD: new schema can read old events (safe for consumers to upgrade)
• FORWARD: old schema can read new events (safe for consumers to upgrade last)
② Postel's Law: "be conservative in what you produce, liberal in what you accept"
• Consumers should ignore unknown fields (tolerant reader pattern)
• Producers should only add optional fields, never remove required fields
③ Versioned event types: OrderPlacedV1, OrderPlacedV2
• Explicit versioning in the event name
• Consumers subscribe to specific versions
Key vocabulary:
• Schema registry — centralised store of event schemas with version control
• Backward compatibility — newer schema can read events written with an older schema
• Forward compatibility — older schema can read events written with a newer schema
• Tolerant reader — a consumer that gracefully handles fields it doesn't recognise
4 / 25
Your organisation currently uses a monolithic REST API where services call each other directly. A tech lead proposes: "We should migrate the highest-traffic integration point first — the notification service, which receives 200 REST calls per second from 12 different services."
How do you evaluate this migration approach, and what vocabulary should you use?
Evaluating migration candidates requires assessing the interaction pattern, not just the volume.
Why notifications are a classic first EDA migration:
• Fire-and-forget pattern: the caller doesn't need an immediate response — "send email" is a command, not a query
• High fan-in: 12 callers → 1 notification service = perfect publish/subscribe fit
• Fault tolerance: if a notification is slightly delayed by 200ms, users won't notice
What to assess before approving the migration:
① Blast radius: if the message broker is unavailable, notifications fail — is this acceptable? How do we degrade gracefully?
② Dead-letter strategy: what happens to a notification event that fails processing 5 times? (DLQ + alerting + manual replay)
③ Ordering requirements: do notifications need to arrive in the order they were sent? (Partition key strategy if yes)
④ Gradual migration: migrate one caller at a time using the strangler fig pattern, not a big-bang all-or-nothing deployment
Key vocabulary for this discussion:
• Fire-and-forget — a call pattern where the caller doesn't wait for a response
• Fan-in — many producers sending to one consumer (opposite of fan-out)
• Strangler fig pattern — incrementally replacing a legacy system by routing traffic to the new system piece by piece
• Blast radius — the scope of impact if a component fails
• Big-bang migration — replacing everything at once (high risk alternative to strangler fig)
5 / 25
A post-incident review is discussing why a 30-minute outage in the UserPreferenceService caused a cascading failure that brought down the OrderService, despite only being a REST-call dependency for preference lookups during checkout.
Using EDA vocabulary, how would you describe the architectural failure and the proposed mitigation?
This is a classic cascading failure pattern from synchronous service coupling — understanding it deeply is a senior engineering competency.
How the cascade happened:
① UserPreferenceService goes down (DB connection exhaustion during deploy)
② OrderService makes synchronous REST calls to it during checkout — each call hangs waiting for timeout (30 seconds)
③ Thread pool in OrderService fills up — threads waiting for UserPreferenceService responses
④ New checkout requests queue up and eventually timeout
⑤ OrderService appears down from the load balancer's perspective → circuit breaker opens
⑥ Entire checkout flow is offline
EDA mitigation — the local cache + event subscription pattern:
• OrderService subscribes to UserPreferenceUpdated events
• Preferences are cached locally in OrderService's own datastore
• At checkout, preference lookup hits the local cache (no network call)
• If preferences haven't been updated for hours, the order uses slightly stale data — acceptable trade-off
• UserPreferenceService outage no longer affects OrderService at all
Option C (circuit breaker) is a valid short-term mitigation but doesn't remove the dependency — it just fails fast. The EDA approach actually eliminates the runtime dependency.
Key vocabulary:
• Cascade failure — a failure propagating through a chain of synchronous dependencies
• Thread pool exhaustion — all threads blocked waiting for a downstream service
• Local cache + event subscription — EDA pattern for eliminating synchronous lookup dependencies
• Circuit breaker — a pattern that fails fast when a dependency is unhealthy (mitigation, not elimination)
6 / 25
During a code review of a new microservice designed to handle user profile updates via an event-driven architecture, your senior engineer comments: 'This service needs to reliably capture all changes to the user's address. We should use a *command* pattern here to ensure that each update is handled as a discrete unit.' What does this comment primarily highlight regarding the design of the service?
The senior engineer's comment focuses on the core principle of event-driven architectures: *loose coupling*. Using a command pattern here means the service treats each address change as an independent 'command,' rather than directly reacting to a single, potentially complex event stream. This avoids cascading effects if one update fails and ensures that individual changes are handled consistently – a crucial aspect of building reliable systems with EDA. The incorrect options misrepresent the role of a command pattern or suggest alternatives not aligned with this architectural focus.
7 / 25
You're drafting a Slack message to explain the benefits of adopting an event-driven architecture for a new data pipeline. A junior developer asks: 'But isn't it more complicated than just polling the database every few seconds?' Which response best addresses this concern and accurately reflects the advantages of EDA?
The incorrect options either oversimplify the concept or present misleading arguments. Polling isn't inherently more complex than EDA, and 'simpler' doesn't align with the core benefits of asynchronous processing. The correct answer accurately describes the key aspects: message queues, asynchronous processing, and better scalability – all hallmarks of an event-driven system that address the junior developer's concern about complexity while highlighting the advantages over a polling strategy.
8 / 25
You're participating in a Slack channel discussing the design of a new microservice responsible for processing inbound customer support tickets. A developer named Alex asks: 'So, we're saying that when a ticket is created, it automatically triggers a workflow? But isn't that just a regular API call – like a POST request to our ticket service?' What's the key difference between this approach and a truly event-driven system in this scenario?
Alex is conflating synchronous API calls with the asynchronous nature of an event-driven system. While a POST request *can* trigger actions, in EDA, that request becomes an 'event' – a message published to a broker. This allows services to react to the event without directly waiting for a response, leading to improved performance and fault tolerance. The core difference lies in decoupling; Alex's scenario implies a direct dependency, whereas an event-driven system promotes loose coupling.
9 / 25
During a technical discussion about redesigning the payment processing system, a team member states: 'We should use an event bus to decouple our services and improve scalability. However, if one service fails, it will block the entire payment flow.' Which statement best addresses this concern regarding potential failure scenarios within an EDA implementation?
Considerations for resilience and fault tolerance are crucial when designing event-driven systems.
The correct answer highlights the importance of redundancy and fault tolerance in EDA. While an event bus decouples services, it doesn't inherently handle failures. A robust EDA design requires mechanisms like dead-letter queues, retry policies, and circuit breakers to ensure that a single service failure doesn't cascade through the entire payment flow; options A, C, and D all present misconceptions about how EDA handles failures – it's not simply a matter of 'automatic failing' or relying on a single point of control.
10 / 25
You're reviewing a proposed design for a real-time inventory management system. A developer has suggested using an event-driven architecture with asynchronous messaging between services. During the review, another engineer raises concerns about ensuring data consistency across these loosely coupled services. Which of the following best describes the core architectural approach needed to address this concern and align with the benefits of EDA?
'We need to focus on building a robust system that can handle unpredictable workloads and failures while maintaining data integrity.'
The correct answer highlights the importance of idempotency and eventual consistency, which are fundamental to managing asynchronous event processing. Event schemas should be designed to handle duplicate events (idempotency) and accept that updates may not be immediately reflected across all services (eventual consistency). This approach acknowledges the inherent trade-offs in distributed systems and provides a path for robust data management within an EDA.
11 / 25
During a code review of a new microservice designed to handle user profile updates via an event-driven architecture, your senior engineer comments: 'This service needs to reliably capture all changes to the user's address. We should use a *command* pattern here to ensure that each update is handled as a discrete unit.' What does this comment primarily highlight regarding the design of the service?
The senior engineer's comment focuses on the core principle of event-driven architectures: *loose coupling*. Using a command pattern here means the service treats each address change as an independent 'command,' rather than directly reacting to a single, potentially complex event stream. This avoids cascading effects if one update fails and ensures that individual changes are handled consistently – a crucial aspect of building reliable systems with EDA. The incorrect options misrepresent the role of a command pattern or suggest alternatives not aligned with this architectural focus.
12 / 25
You're drafting a Slack message to explain the benefits of adopting an event-driven architecture for a new data pipeline. A junior developer asks: 'But isn't it more complicated than just polling the database every few seconds?' Which response best addresses this concern and accurately reflects the advantages of EDA?
The incorrect options either oversimplify the concept or present misleading arguments. Polling isn't inherently more complex than EDA, and 'simpler' doesn't align with the core benefits of asynchronous processing. The correct answer accurately describes the key aspects: message queues, asynchronous processing, and better scalability – all hallmarks of an event-driven system that address the junior developer's concern about complexity while highlighting the advantages over a polling strategy.
13 / 25
You're participating in a Slack channel discussing the design of a new microservice responsible for processing inbound customer support tickets. A developer named Alex asks: 'So, we're saying that when a ticket is created, it automatically triggers a workflow? But isn't that just a regular API call – like a POST request to our ticket service?' What's the key difference between this approach and a truly event-driven system in this scenario?
Alex is conflating synchronous API calls with the asynchronous nature of an event-driven system. While a POST request *can* trigger actions, in EDA, that request becomes an 'event' – a message published to a broker. This allows services to react to the event without directly waiting for a response, leading to improved performance and fault tolerance. The core difference lies in decoupling; Alex's scenario implies a direct dependency, whereas an event-driven system promotes loose coupling.
14 / 25
During a technical discussion about redesigning the payment processing system, a team member states: 'We should use an event bus to decouple our services and improve scalability. However, if one service fails, it will block the entire payment flow.' Which statement best addresses this concern regarding potential failure scenarios within an EDA implementation?
Considerations for resilience and fault tolerance are crucial when designing event-driven systems.
The correct answer highlights the importance of redundancy and fault tolerance in EDA. While an event bus decouples services, it doesn't inherently handle failures. A robust EDA design requires mechanisms like dead-letter queues, retry policies, and circuit breakers to ensure that a single service failure doesn't cascade through the entire payment flow; options A, C, and D all present misconceptions about how EDA handles failures – it's not simply a matter of 'automatic failing' or relying on a single point of control.
15 / 25
You're reviewing a proposed design for a real-time inventory management system. A developer has suggested using an event-driven architecture with asynchronous messaging between services. During the review, another engineer raises concerns about ensuring data consistency across these loosely coupled services. Which of the following best describes the core architectural approach needed to address this concern and align with the benefits of EDA?
'We need to focus on building a robust system that can handle unpredictable workloads and failures while maintaining data integrity.'
The correct answer highlights the importance of idempotency and eventual consistency, which are fundamental to managing asynchronous event processing. Event schemas should be designed to handle duplicate events (idempotency) and accept that updates may not be immediately reflected across all services (eventual consistency). This approach acknowledges the inherent trade-offs in distributed systems and provides a path for robust data management within an EDA.
16 / 25
During a code review of a new microservice designed to handle user profile updates via an event-driven architecture, your senior engineer comments: 'This service needs to reliably capture all changes to the user's address. We should use a *command* pattern here to ensure that each update is handled as a discrete unit.' What does this comment primarily highlight regarding the design of the service?
The senior engineer's comment focuses on the core principle of event-driven architectures: *loose coupling*. Using a command pattern here means the service treats each address change as an independent 'command,' rather than directly reacting to a single, potentially complex event stream. This avoids cascading effects if one update fails and ensures that individual changes are handled consistently – a crucial aspect of building reliable systems with EDA. The incorrect options misrepresent the role of a command pattern or suggest alternatives not aligned with this architectural focus.
17 / 25
You're drafting a Slack message to explain the benefits of adopting an event-driven architecture for a new data pipeline. A junior developer asks: 'But isn't it more complicated than just polling the database every few seconds?' Which response best addresses this concern and accurately reflects the advantages of EDA?
The incorrect options either oversimplify the concept or present misleading arguments. Polling isn't inherently more complex than EDA, and 'simpler' doesn't align with the core benefits of asynchronous processing. The correct answer accurately describes the key aspects: message queues, asynchronous processing, and better scalability – all hallmarks of an event-driven system that address the junior developer's concern about complexity while highlighting the advantages over a polling strategy.
18 / 25
You're participating in a Slack channel discussing the design of a new microservice responsible for processing inbound customer support tickets. A developer named Alex asks: 'So, we're saying that when a ticket is created, it automatically triggers a workflow? But isn't that just a regular API call – like a POST request to our ticket service?' What's the key difference between this approach and a truly event-driven system in this scenario?
Alex is conflating synchronous API calls with the asynchronous nature of an event-driven system. While a POST request *can* trigger actions, in EDA, that request becomes an 'event' – a message published to a broker. This allows services to react to the event without directly waiting for a response, leading to improved performance and fault tolerance. The core difference lies in decoupling; Alex's scenario implies a direct dependency, whereas an event-driven system promotes loose coupling.
19 / 25
During a technical discussion about redesigning the payment processing system, a team member states: 'We should use an event bus to decouple our services and improve scalability. However, if one service fails, it will block the entire payment flow.' Which statement best addresses this concern regarding potential failure scenarios within an EDA implementation?
Considerations for resilience and fault tolerance are crucial when designing event-driven systems.
The correct answer highlights the importance of redundancy and fault tolerance in EDA. While an event bus decouples services, it doesn't inherently handle failures. A robust EDA design requires mechanisms like dead-letter queues, retry policies, and circuit breakers to ensure that a single service failure doesn't cascade through the entire payment flow; options A, C, and D all present misconceptions about how EDA handles failures – it's not simply a matter of 'automatic failing' or relying on a single point of control.
20 / 25
You're reviewing a proposed design for a real-time inventory management system. A developer has suggested using an event-driven architecture with asynchronous messaging between services. During the review, another engineer raises concerns about ensuring data consistency across these loosely coupled services. Which of the following best describes the core architectural approach needed to address this concern and align with the benefits of EDA?
'We need to focus on building a robust system that can handle unpredictable workloads and failures while maintaining data integrity.'
The correct answer highlights the importance of idempotency and eventual consistency, which are fundamental to managing asynchronous event processing. Event schemas should be designed to handle duplicate events (idempotency) and accept that updates may not be immediately reflected across all services (eventual consistency). This approach acknowledges the inherent trade-offs in distributed systems and provides a path for robust data management within an EDA.
21 / 25
During a code review of a new microservice designed to handle user profile updates via an event-driven architecture, your senior engineer comments: 'This service needs to reliably capture all changes to the user's address. We should use a *command* pattern here to ensure that each update is handled as a discrete unit.' What does this comment primarily highlight regarding the design of the service?
The senior engineer's comment focuses on the core principle of event-driven architectures: *loose coupling*. Using a command pattern here means the service treats each address change as an independent 'command,' rather than directly reacting to a single, potentially complex event stream. This avoids cascading effects if one update fails and ensures that individual changes are handled consistently – a crucial aspect of building reliable systems with EDA. The incorrect options misrepresent the role of a command pattern or suggest alternatives not aligned with this architectural focus.
22 / 25
You're drafting a Slack message to explain the benefits of adopting an event-driven architecture for a new data pipeline. A junior developer asks: 'But isn't it more complicated than just polling the database every few seconds?' Which response best addresses this concern and accurately reflects the advantages of EDA?
The incorrect options either oversimplify the concept or present misleading arguments. Polling isn't inherently more complex than EDA, and 'simpler' doesn't align with the core benefits of asynchronous processing. The correct answer accurately describes the key aspects: message queues, asynchronous processing, and better scalability – all hallmarks of an event-driven system that address the junior developer's concern about complexity while highlighting the advantages over a polling strategy.
23 / 25
You're participating in a Slack channel discussing the design of a new microservice responsible for processing inbound customer support tickets. A developer named Alex asks: 'So, we're saying that when a ticket is created, it automatically triggers a workflow? But isn't that just a regular API call – like a POST request to our ticket service?' What's the key difference between this approach and a truly event-driven system in this scenario?
Alex is conflating synchronous API calls with the asynchronous nature of an event-driven system. While a POST request *can* trigger actions, in EDA, that request becomes an 'event' – a message published to a broker. This allows services to react to the event without directly waiting for a response, leading to improved performance and fault tolerance. The core difference lies in decoupling; Alex's scenario implies a direct dependency, whereas an event-driven system promotes loose coupling.
24 / 25
During a technical discussion about redesigning the payment processing system, a team member states: 'We should use an event bus to decouple our services and improve scalability. However, if one service fails, it will block the entire payment flow.' Which statement best addresses this concern regarding potential failure scenarios within an EDA implementation?
Considerations for resilience and fault tolerance are crucial when designing event-driven systems.
The correct answer highlights the importance of redundancy and fault tolerance in EDA. While an event bus decouples services, it doesn't inherently handle failures. A robust EDA design requires mechanisms like dead-letter queues, retry policies, and circuit breakers to ensure that a single service failure doesn't cascade through the entire payment flow; options A, C, and D all present misconceptions about how EDA handles failures – it's not simply a matter of 'automatic failing' or relying on a single point of control.
25 / 25
You're reviewing a proposed design for a real-time inventory management system. A developer has suggested using an event-driven architecture with asynchronous messaging between services. During the review, another engineer raises concerns about ensuring data consistency across these loosely coupled services. Which of the following best describes the core architectural approach needed to address this concern and align with the benefits of EDA?
'We need to focus on building a robust system that can handle unpredictable workloads and failures while maintaining data integrity.'
The correct answer highlights the importance of idempotency and eventual consistency, which are fundamental to managing asynchronous event processing. Event schemas should be designed to handle duplicate events (idempotency) and accept that updates may not be immediately reflected across all services (eventual consistency). This approach acknowledges the inherent trade-offs in distributed systems and provides a path for robust data management within an EDA.
What does the "EDA Architecture Discussion — Event-Driven Language Exercises" exercise cover?
Practice the vocabulary for discussing Event-Driven Architecture trade-offs: REST vs EDA decoupling arguments, eventual consistency, schema evolution, migration strategies, and cascade failure analysis. 5 exercises.
Is this exercise free to use?
Yes. Every exercise on CoderSlingo, including this one, is free to use with no account, sign-up, or paywall.
How many questions are in "EDA Architecture Discussion — Event-Driven Language Exercises"?
This exercise has 25 questions. Each one gives instant feedback with an explanation, so you can see exactly why an answer is right or wrong.
Do I need to create an account to save my progress?
No account is required. The progress bar and score are tracked in your browser for the current session -- the exercise is designed to be a quick, repeatable drill rather than something you resume later.
What happens if I get an answer wrong?
You'll see the correct answer highlighted immediately, along with a short explanation of why it's correct. Wrong answers aren't penalized beyond your score, and you can keep going through every question.
How is this exercise different from reading an article?
Articles explain vocabulary and concepts through prose, while exercises like this one are interactive drills -- multiple-choice questions -- that test and reinforce your recall of specific terms and phrasing.
Can I retry this exercise?
Yes -- use the "Try again" button on the results screen to reset your score and go through all the questions again from the start.
Where can I find more Event-Driven Architecture Language exercises?
Browse the full Event-Driven Architecture Language hub for related drills, or check the site-wide exercises index for other IT English topics.
Is this exercise suitable for beginners?
This exercise assumes basic familiarity with IT terminology. If a term feels unfamiliar, check the site Glossary for a plain-English definition before attempting the questions.
How often is new content like this published?
New exercises are added regularly across all categories, alongside new vocabulary sets and articles. Check back on the exercises hub to see what's new.