Module 13 · Runnable capstone guide

Capstone A — Reactive Order Platform bằng WebFlux

Implementation guide cho cùng business spec bằng Spring WebFlux/Reactor/R2DBC.


1. Architecture

Controller → OrderService(Mono/Flux)
              ├─ R2DBC
              ├─ Inventory
              └─ WebClient→Payment
                     ↓
                 Event Flux→SSE

2. Create flow

Mono<OrderResponse> create(CreateOrder cmd, String key) {
    return idempotency.find(key)
        .switchIfEmpty(
            userService.requireActive(cmd.userId())
                .then(inventory.reserve(cmd.items()))
                .then(payment.charge(cmd, key))
                .flatMap(p -> orderRepository.save(toEntity(cmd, p, key)))
                .flatMap(order ->
                    eventPublisher.publishCreated(order)
                        .thenReturn(OrderResponse.from(order)))
        )
        .timeout(Duration.ofSeconds(3));
}

3. Idempotency

Lưu key → request fingerprint → outcome/orderId. Cùng key nhưng payload khác trả conflict.

4. SSE

Demo có thể dùng Reactor Sink; production nên cân nhắc durable event source.

5. Tests

  • StepVerifier service flows.
  • WebTestClient HTTP contract.
  • PostgreSQL test container.
  • Mock payment.
  • Timeout/error.
  • Concurrent idempotency.

6. Observability

  • Correlation ID.
  • Create-order timer.
  • Payment timeout counter.
  • DB pool metrics.
  • Tracing context.

7. Checklist

  • ☑ No block() in request path.
  • ☑ R2DBC.
  • ☑ WebClient timeout.
  • ☑ Safe retry only.
  • ☑ Idempotency.
  • ☑ SSE.
  • ☑ Tests.

8. Challenge

Thêm transactional outbox để xử lý failure “DB commit thành công nhưng publish event thất bại”.