Car Dealership — заказ на автомобиль

Car Dealership — заказ на автомобиль An architecture diagram generated by Archify. Клиент · менеджер / покупатель · Architecture component Клиент менеджер / покупатель Keycloak · realm cardealership · Architecture component Keycloak realm cardealership order-service · :8080, State Pattern · order-service · orders order-service :8080, State Pattern orders storage-service · :8081 REST / :9091 gRPC · storage-service · storage storage-service :8081 REST / :9091 gRPC storage Postgres orders · заказы, outbox_events · order-service · orders Postgres orders заказы, outbox_events orders Postgres storage · каталог, сборка · storage-service · storage Postgres storage каталог, сборка storage RabbitMQ · order.sent-for-approval · Architecture component RabbitMQ order.sent-for-approval REST + JWT JWKS gRPC, deadline 5s, каталог outbox publish, каждые 5с consume: сборочный заказ заказ + outbox, 1 tx каталог order-service storage-service Legend Backend Database Security Message bus External

State Pattern

  • • OrderState — интерфейс: next()/cancel()/getName(), каждое состояние знает СВОИ переходы
  • • AwaitingPaymentState.next() -> PaidState, .cancel() -> CancelledState — не if/switch в сервисе
  • • Недопустимый переход невозможен физически: у состояния просто нет такого метода перехода

Outbox на практике

  • • OutboxEvent пишется в той же транзакции, что и заказ (sent=false по умолчанию)
  • • OutboxPublisher.publishPendingEvents() — @Scheduled(fixedDelay=5000), findBySentFalseForUpdate(100) — реальный SELECT...FOR UPDATE
  • • sent=true и sentAt проставляются ПОСЛЕ успешной публикации в RabbitMQ — at-least-once

Безопасность и деградация

  • • OrderSecurityService.isOwner() — сверяет email из JWT-claim с order.client.email, используется в @PreAuthorize
  • • GrpcCarClient оборачивает stub-вызов в try/catch StatusRuntimeException
  • • CarProtoMapper.mapError: NOT_FOUND -> EntityNotFoundException, UNAVAILABLE/DEADLINE_EXCEEDED -> ServiceUnavailableException (503 клиенту, не зависшая ручка)