Bird
Raised Fist0
Microservicessystem_design~10 mins

Ambassador pattern in Microservices - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define an ambassador service that proxies requests to the main service.

Microservices
class AmbassadorService {
    constructor(targetService) {
        this.targetService = targetService;
    }

    handleRequest(request) {
        return this.targetService.[1](request);
    }
}
Drag options to blanks, or click blank then click option'
AproxyRequest
BsendRequest
CprocessRequest
DhandleRequest
Attempts:
3 left
💡 Hint
Common Mistakes
Using a method name that does not exist on the target service.
Confusing the ambassador's own method with the target service's method.
2fill in blank
medium

Complete the code to add logging in the ambassador before forwarding the request.

Microservices
class AmbassadorService {
    handleRequest(request) {
        console.log('Forwarding request:', [1]);
        return this.targetService.handleRequest(request);
    }
}
Drag options to blanks, or click blank then click option'
Athis
Brequest
CtargetService
Drequest.data
Attempts:
3 left
💡 Hint
Common Mistakes
Logging this instead of the request.
Logging a property that may not exist like request.data.
3fill in blank
hard

Fix the error in the ambassador's retry logic to handle failed requests.

Microservices
async handleRequest(request) {
    let attempts = 0;
    while (attempts < [1]) {
        try {
            return await this.targetService.handleRequest(request);
        } catch (error) {
            attempts++;
        }
    }
    throw new Error('Max retries reached');
}
Drag options to blanks, or click blank then click option'
AmaxRetries
B'3'
C3
DretryCount
Attempts:
3 left
💡 Hint
Common Mistakes
Using a string instead of a number for the retry limit.
Using variables that are not defined in the scope.
4fill in blank
hard

Fill both blanks to implement a timeout mechanism in the ambassador pattern.

Microservices
async handleRequest(request) {
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.[1](), [2]);
    try {
        return await this.targetService.handleRequest({ ...request, signal: controller.signal });
    } finally {
        clearTimeout(timeoutId);
    }
}
Drag options to blanks, or click blank then click option'
Aabort
Bcancel
C5000
D10000
Attempts:
3 left
💡 Hint
Common Mistakes
Using a non-existent method like cancel().
Setting an unreasonably long timeout like 10000 without explanation.
5fill in blank
hard

Fill all three blanks to create a caching layer in the ambassador to reduce load on the main service.

Microservices
class AmbassadorService {
    constructor(targetService) {
        this.targetService = targetService;
        this.cache = new Map();
    }

    async handleRequest(request) {
        const key = JSON.stringify([1]);
        if (this.cache.has(key)) {
            return this.cache.get(key);
        }
        const response = await this.targetService.handleRequest([2]);
        this.cache.set(key, [3]);
        return response;
    }
}
Drag options to blanks, or click blank then click option'
Arequest
Cresponse
Drequest.data
Attempts:
3 left
💡 Hint
Common Mistakes
Using inconsistent variables for the cache key and request forwarding.
Caching the request instead of the response.

Practice

(1/5)
1. What is the main purpose of the Ambassador pattern in microservices architecture?
easy
A. To directly expose services to the internet without any proxy
B. To replace the main service with a new version
C. To store data in a centralized database
D. To add a helper component that manages communication between services

Solution

  1. Step 1: Understand the role of the Ambassador pattern

    The Ambassador pattern introduces a helper component that acts as a proxy or sidecar to handle communication tasks for a service.
  2. Step 2: Compare options with the pattern's purpose

    Replacing services, storing data centrally, or exposing services directly do not describe the Ambassador pattern's role.
  3. Final Answer:

    To add a helper component that manages communication between services -> Option D
  4. Quick Check:

    Ambassador pattern = helper component for communication [OK]
Hint: Ambassador adds a helper proxy for communication [OK]
Common Mistakes:
  • Confusing Ambassador with database or service replacement
  • Thinking it exposes services directly without proxy
  • Assuming it stores data centrally
2. Which of the following is the correct way to describe the Ambassador pattern's deployment style?
easy
A. A sidecar proxy deployed alongside the main service
B. A centralized database for service communication
C. A standalone service that replaces the main service
D. A load balancer that distributes traffic among services

Solution

  1. Step 1: Identify deployment style of Ambassador pattern

    The Ambassador pattern is typically deployed as a sidecar proxy next to the main service to handle communication.
  2. Step 2: Eliminate incorrect deployment types

    It is not a standalone replacement, centralized database, or load balancer.
  3. Final Answer:

    A sidecar proxy deployed alongside the main service -> Option A
  4. Quick Check:

    Ambassador deployment = sidecar proxy [OK]
Hint: Ambassador runs as a sidecar proxy next to service [OK]
Common Mistakes:
  • Thinking Ambassador replaces the main service
  • Confusing it with load balancer or database
  • Assuming it is a standalone service
3. Consider this simplified pseudo-code for an Ambassador proxy handling requests:
class AmbassadorProxy {
  sendRequest(request) {
    if (this.isServiceAvailable()) {
      return this.forward(request);
    } else {
      return this.retry(request);
    }
  }
}
What will happen if the main service is temporarily down?
medium
A. The proxy forwards the request without checking availability
B. The proxy retries sending the request until the service is available
C. The proxy immediately returns an error without retrying
D. The proxy stores the request permanently without forwarding

Solution

  1. Step 1: Analyze the sendRequest method logic

    The method checks if the service is available. If yes, it forwards the request; otherwise, it retries.
  2. Step 2: Determine behavior when service is down

    If the service is down, isServiceAvailable() returns false, so retry(request) is called to resend the request.
  3. Final Answer:

    The proxy retries sending the request until the service is available -> Option B
  4. Quick Check:

    Service down triggers retry in Ambassador proxy [OK]
Hint: Ambassador retries requests if service unavailable [OK]
Common Mistakes:
  • Assuming proxy forwards without checking
  • Thinking proxy returns error immediately
  • Believing proxy stores requests permanently
4. A developer wrote this Ambassador proxy code snippet:
class Ambassador {
  send(request) {
    if (this.checkService()) {
      this.forward(request);
    } else {
      this.retry(request);
    }
  }
}
But requests are never retried even when the service is down. What is the likely bug?
medium
A. The send method does not return the result of retry or forward
B. The method forward does not return the response
C. The checkService method always returns true
D. The retry method is not implemented

Solution

  1. Step 1: Review send method behavior

    The send method calls forward or retry but does not return their results, so caller never sees retries.
  2. Step 2: Understand impact on retry behavior

    Without returning retry's result, retries may happen but caller ignores them, appearing as if no retry occurs.
  3. Final Answer:

    The send method does not return the result of retry or forward -> Option A
  4. Quick Check:

    Missing return in send causes retry to be ignored [OK]
Hint: Always return retry/forward results in proxy methods [OK]
Common Mistakes:
  • Assuming checkService always true without checking
  • Thinking retry method is missing
  • Ignoring return values in send method
5. You want to improve observability and security for a microservice without changing its code. How does the Ambassador pattern help achieve this?
hard
A. By replacing the microservice with a new secure version
B. By modifying the service code to include security and logging libraries
C. By adding a sidecar proxy that handles logging, retries, and TLS encryption transparently
D. By deploying a centralized monitoring service that polls the microservice directly

Solution

  1. Step 1: Identify how Ambassador pattern enhances observability and security

    The Ambassador pattern uses a sidecar proxy to add features like logging, retries, and TLS without changing the main service code.
  2. Step 2: Compare with other options

    Modifying service code, polling directly, or replacing service do not align with Ambassador pattern benefits.
  3. Final Answer:

    By adding a sidecar proxy that handles logging, retries, and TLS encryption transparently -> Option C
  4. Quick Check:

    Ambassador adds security and observability via sidecar proxy [OK]
Hint: Ambassador adds features without changing service code [OK]
Common Mistakes:
  • Thinking service code must be changed
  • Confusing Ambassador with centralized monitoring
  • Assuming service replacement is needed