Study DVA-C02 App Patterns, APIs, and Messaging: key concepts, common traps, and exam decision cues.
This lesson covers the first developer judgment DVA-C02 tests repeatedly: can you classify the interaction pattern before you choose a service? Many stems are not really about Lambda versus ECS versus Step Functions. They are asking whether the workflow should be synchronous or asynchronous, tightly or loosely coupled, event-driven or directly orchestrated, resilient or fragile.
Loose coupling: Design where components communicate through well-defined interfaces or events without depending on each other’s internal behavior.
Fanout: Pattern where one event is delivered to multiple downstream consumers for independent processing.
AWS wants you to recognize when code should:
| If the problem is mainly about… | Strong lane |
|---|---|
| immediate request and response with validation or transformation | API layer |
| bursts, retry isolation, or slow downstream consumers | SQS-style buffering |
| multiple independent consumers reacting to the same event | SNS or EventBridge fanout |
| stateful multi-step workflow with branching and retries | Step Functions orchestration |
| reacting to business events across services | event-driven design with EventBridge |
This distinction is still one of the easiest places to lose points:
| Pattern | Better first question |
|---|---|
| Synchronous | does the caller need the result right now? |
| Asynchronous | can the caller get an acknowledgment now and let the work finish later? |
If the user experience only needs a quick acknowledgment and downstream work can continue independently, DVA-C02 usually wants the asynchronous answer.
This matters because the exam mixes it into scale and resilience questions:
If the question wants high concurrency or easier horizontal scale, stateless compute with externalized state is usually the stronger answer.
DVA-C02 also expects basic developer judgment about application-facing interfaces:
Simple Python example:
1import boto3
2from botocore.config import Config
3
4config = Config(
5 retries={"max_attempts": 5, "mode": "standard"},
6 connect_timeout=2,
7 read_timeout=5,
8)
9
10sqs = boto3.client("sqs", config=config)
11
12def publish_order(queue_url: str, payload: str) -> None:
13 sqs.send_message(QueueUrl=queue_url, MessageBody=payload)
The exam point is not Python syntax itself. It is that resilient application code uses the AWS SDK with sane retry behavior and keeps credentials outside the source code.
Domain 1 now explicitly includes streaming and event-driven skills. Keep the distinctions simple:
If the question describes business events crossing service boundaries, EventBridge often fits better than a custom direct-call chain.
AWS often hides the real requirement inside a third-party dependency. If the external service can fail, rate-limit, or time out, strong answers usually add:
The exam rarely rewards “just call the endpoint again immediately” logic.
Small Python sketch:
1import time
2import requests
3
4def fetch_profile(url: str, token: str) -> dict:
5 headers = {"Authorization": f"Bearer {token}"}
6 delay = 0.2
7 for attempt in range(4):
8 response = requests.get(url, headers=headers, timeout=3)
9 if response.status_code < 500:
10 response.raise_for_status()
11 return response.json()
12 time.sleep(delay)
13 delay *= 2
14 raise RuntimeError("profile service unavailable after retries")
Again, the code is just a vehicle for the lesson: retry transient failures, bound the wait, and do not treat every failure as fatal on the first attempt.
An API request triggers order processing, inventory updates, email notifications, and analytics capture. The customer should receive a fast acknowledgment even if downstream systems are briefly slow. What is the strongest first pattern?
Correct answer: B. The stem is really about decoupling, fast acknowledgment, and tolerance of downstream slowness. That points to an event-driven fanout pattern rather than one synchronous end-to-end request path.
DVA-C02 often uses one to distract from the other.