CompletableFuture Composition
Design a small subsystem that relies on CompletableFuture Composition. Outline components, data flow, failure modes, and metrics.
Answers use simple, clear English.
Quick interview answer
Use CompletableFuture Composition as the core idea. Example shape: Aggregate microservice responses: CompletableFuture.allOf(userF, ordersF).thenApply(...)..
Detailed answer
Use CompletableFuture Composition as the core idea. Example shape: Aggregate microservice responses: CompletableFuture.allOf(userF, ordersF).thenApply(...).. Watch for: Default ForkJoinPool.commonPool() shared — inject Executor for isolation.. Measure success via latency/error/saturation. Core: supplyAsync runs async task; thenApply transforms; thenCompose flattens nested futures; allOf waits for batch. Exceptionally/handle for error paths. Real-time example: Aggregate microservice responses: CompletableFuture.allOf(userF, ordersF).thenApply(...). Pros: Composable async without raw callbacks; integrates with thread pools. Cons: Default ForkJoinPool.commonPool() shared — inject Executor for isolation. Common mistakes: Blocking get() on async chain in request thread; lost exceptions without handle. Best practices: Specify executor for IO; use orTimeout/join with timeout in Java 9+. Audience level: Tech Lead.
Full explanation
supplyAsync runs async task; thenApply transforms; thenCompose flattens nested futures; allOf waits for batch. Exceptionally/handle for error paths.
Real example & use case
Aggregate microservice responses: CompletableFuture.allOf(userF, ordersF).thenApply(...).
Pros & cons
Pros: Composable async without raw callbacks; integrates with thread pools. Cons: Default ForkJoinPool.commonPool() shared — inject Executor for isolation.
Common mistakes
Blocking get() on async chain in request thread; lost exceptions without handle.
Best practices
Specify executor for IO; use orTimeout/join with timeout in Java 9+.
Follow-up questions
Open one as its own read / solve / listen card