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→SSE2. 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”.