ホームページ >Java >&#&チュートリアル >インターネットクレジット購入システムの設計
私が直面した技術面接の 1 つで、ユーザーがサードパーティ プロバイダーからインターネット クレジットを購入できる電子商取引システムを設計するように求められました。
私は自信を持って、利用可能なパッケージを表示し、ユーザーにパッケージを選択させ、外部ゲートウェイ経由で支払いを処理し、プロバイダーと対話してクレジットを提供するという単純な解決策を提案しました。しかし、ユーザーが支払いを完了した後にプロバイダーの在庫がなくなるなどの障害シナリオについて尋ねられたとき、私の設計にはそのような問題を効果的に処理するための回復力が欠けていることに気づきました。
数週間前、私はフラッシュセールシステムと在庫予約パターン、特に在庫予約戦略に焦点を当てた調査を実施しました。フラッシュセールでは需要が高く在庫が限られていることが多いため、システムの安定性を維持し、顧客の期待を管理するための高度なメカニズムが必要です。私が発見したコンセプトの 1 つは、ピーク時の過剰販売を防ぐための一時的な在庫予約です。
この調査を見て、私は面接での経験を思い出しました。これらの在庫予約戦略を適用すれば、最初の設計の欠点に対処できる可能性があることに気づきました。チェックアウトプロセス中に在庫の一時的な保留を組み込むことで、システムはプロバイダーの在庫が枯渇するシナリオを効果的に処理できます。
この研究文書では、私の研究から得られた洞察を共有し、インターネット クレジット購入システムを設計するための洗練されたアプローチを提案することを目的としています。在庫予約戦略を統合することで、シームレスなエクスペリエンスを提供しながら、さまざまな障害シナリオに対応できる堅牢かつユーザーフレンドリーなプラットフォームを構築できます。
インターネット クレジット購入システムを設計する場合、シームレスで安全で楽しいユーザー エクスペリエンスを確保するために考慮すべき重要な要素がいくつかあります。それらを詳しく見てみましょう:
これらの考慮事項を考慮することで、効率的、安全、そしてユーザーフレンドリーなインターネット クレジット購入システムを設計でき、ユーザーの満足度と信頼が高まります。
上で概説した基本的な考慮事項に基づいて、次のステップでは、これらの原則を堅牢で効果的なシステム設計に変換します。さまざまなコンポーネント間の相互作用を慎重にマッピングすることで、システムが機能要件を満たすだけでなく、信頼性と拡張性を維持しながらシームレスなユーザー エクスペリエンスを提供できるようになります。
このセクションでは、システムのアーキテクチャとフローを詳しく説明し、クォータ管理、支払い処理、サービスのアクティベーションなどのコア機能がどのように連携して実装されるかを示します。目的は、それぞれの設計上の選択が、潜在的な課題への対処と信頼できる e コマース クレジット購入プラットフォームの提供にどのように貢献するかを強調することです。
まず、システム フローの概要をフローチャートで視覚化し、ユーザーが最初から最後までシステムとどのように対話するかを説明します。
わかりやすくするために、システムのフローは 6 つのフェーズに分割されています。
このフローは、ユーザーにスムーズで信頼性の高いエクスペリエンスを保証すると同時に、リソースと潜在的なエラーを効果的に管理します。
以下のシーケンス図は、さまざまな役割とコンポーネント間の相互作用を説明するのに役立ちます。
わかりやすくするために、システムのフローは 6 つのフェーズに分割されています。
システムのフローと相互作用の概要を説明したので、次はそれらすべてがコードでどのように組み合わされるかを詳しく見ていきます。このセクションでは、実装を段階的に説明し、注文の管理からプロバイダーや支払いシステムとのやり取りまで、すべてを処理する機能部分に設計がどのように変換されるかを示します。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
これらのクラスの機能は次のとおりです:
パッケージ: ここで、ユーザーが購入できるインターネット クレジット パッケージを定義します。パッケージ ID、名前、価格、プロバイダーのコスト、説明、パッケージがアクティブかどうかなどの詳細を追跡します。
注文: これはユーザーの購入の記録と考えてください。これには、注文 ID、顧客 ID、選択したパッケージ ID などの情報と、予約 ID、支払い ID、エスクロー ID、注文ステータス、支払い金額、プロバイダー費用、タイムスタンプなどの関連詳細が含まれます。
QuotaRegistration: パッケージ クォータの一時的な予約を処理します。予約 ID、関連付けられているパッケージ、有効期限が切れたとき、および現在のステータス (アクティブまたは期限切れなど) を記録します。
OrderStatus Enum: この列挙型は、CREATED、RESERVED から PAYMENT_PENDING、COMPLETED、さらには REFUNDED まで、注文が通過できるすべての段階をマップします。
RegistrationStatus Enum: 同様に、この列挙型はクォータ予約の状態 (アクティブ、期限切れ、使用中、またはキャンセル済み) を追跡します。
これらのクラスと列挙型は一緒になって、システム内のパッケージ、注文、クォータ予約を管理するためのバックボーンを構築します。これは、電子商取引機能を効果的に処理するための、シンプルでありながら構造化されたアプローチです。
// Request/Response DTOs @Getter @Setter public class OrderRequest { private String customerId; private String packageId; private BigDecimal amount; } @Getter @Setter public class PaymentCallback { private String orderId; private String paymentId; private String status; private BigDecimal amount; private LocalDateTime timestamp; } @Getter @Setter public class QuotaResponse { private String packageId; private boolean available; private Integer remainingQuota; private LocalDateTime timestamp; } @Getter @Setter public class ReservationResponse { private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } @Getter @Setter public class ActivationResponse { private String orderId; private boolean success; private String activationId; private String errorCode; private String errorMessage; } @Getter @Setter public class VerificationResponse { private String orderId; private String activationId; private boolean success; private String status; private LocalDateTime activatedAt; } @Getter @Setter public class PaymentRequest { private String orderId; private BigDecimal amount; private String currency; private String customerId; private String returnUrl; private String callbackUrl; } @Getter @Setter public class PaymentSession { private String sessionId; private String paymentUrl; private LocalDateTime expiresAt; private String status; } @Getter @Setter public class EscrowResponse { private String id; private String paymentId; private BigDecimal amount; private String status; private LocalDateTime createdAt; }
詳しく見てみましょう:
OrderRequest: これはすべて、新しい注文を作成するために必要なデータに関するものです。これには、顧客 ID、購入したいパッケージ、支払う合計金額が含まれます。
PaymentCallback: これは、支払いゲートウェイからの通知と考えてください。支払いを試行すると、注文 ID、支払い ID、ステータス (成功または失敗)、支払金額、支払いがいつ行われたかなどの詳細が表示されます。
QuotaResponse: これは、可用性の確認に関するものです。パッケージが利用可能かどうか、割り当てがどれだけ残っているか、情報が最後に更新されたのはいつかを示します。
RegistrationResponse: パッケージが予約されると、予約 ID、関連するパッケージ、予約の有効期限が切れる時期、および現在のステータス (アクティブまたは期限切れなど) のすべての詳細が表示されます。 .
ActivationResponse: これは、サービスのアクティブ化がどのように行われたかを示します。成功または失敗すると、アクティベーション ID と、問題が発生した場合のエラーの詳細が表示されます。
VerificationResponse: アクティベーション後、すべてがスムーズに進んだかどうかを検証します。これには、注文 ID、アクティベーション ID、成功ステータス、アクティベートされた時間が含まれます。
PaymentRequest: 支払いプロセスを開始する前に、この DTO は注文 ID、支払われる金額、通貨、顧客 ID、コールバック URL などの必要な詳細を収集します。
PaymentSession: これは、支払いプロセスの開始時に作成されるものです。これには、セッション ID、支払い URL (ユーザーが支払いに行く場所)、有効期限が切れる時期、およびセッション ステータスが含まれます。
EscrowResponse: 資金がエスクローに保持されている場合、エスクロー ID、支払い ID、保持金額、ステータス、作成日など、資金に関するすべてがわかります。
これらのクラスはすべて、送信されるリクエストや返される応答など、システムのさまざまな部分間の通信の構成要素を定義します。全員 (そしてすべて) が同じ認識を持っていることを保証します。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
このサービスは、パッケージ データを保存するローカル キャッシュを処理します。目標は、システムを高速化し、プロバイダーの API への不必要な呼び出しを減らすことです。
このサービスは、プロバイダーの API との通信を処理します。クォータの確認、パッケージの予約、サービスのアクティブ化、それらのアクティブ化の検証などのタスクを管理します。
このサービスは、一時的な問題が発生した場合に、RetryTemplate を使用してプロバイダーの API へのリクエストを自動的に再試行します。これにより、軽微な問題が発生した場合でも、システムの信頼性と復元力が確保されます。
これらの機能を組み合わせることで、このコードは、システムがプロバイダーの API とのスムーズで信頼性の高い通信を維持しながら、パッケージ データを効率的に管理できるようにします。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
このクラスは、システムが支払いゲートウェイとやり取りして金融取引をスムーズかつ安全に処理する方法を管理する上で重要な役割を果たします。
このクラスは、システム内で安全かつ効率的な金融取引を管理する上で、パズルの重要なピースです。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
このサービスは、注文ステータスに関してユーザーに送信されるすべての通知を処理します。仕組みは次のとおりです:
このサービスにより、ユーザーは電子メール、SMS、またはリアルタイム更新のいずれを通じてでも、注文に関する情報を常に把握できるようになります。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
ここで WebSocket の魔法がすべて起こります。サーバーとクライアント間のリアルタイムの更新を管理します。
この設定により、バックエンドとフロントエンド間のスムーズかつ即時の通信が保証されるため、ユーザーはクォータの利用可能性と注文ステータスに関する最新の情報を常に入手できます。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
これらのカスタム例外クラスの内訳と、システム内の特定のエラー シナリオを処理するためにそれらがどのように使用されるかを次に示します。
QuotaNotAvailableException:
OrderNotFoundException:
PaymentVerificationException:
これらの例外を使用することにより、システムはクリーンかつ予測可能な方法でエラーを処理します。これらは開発者にとってデバッグの効率を高めるだけでなく、何か問題が発生したときにユーザーが明確で実用的なフィードバックを確実に受け取ることができます。
// Request/Response DTOs @Getter @Setter public class OrderRequest { private String customerId; private String packageId; private BigDecimal amount; } @Getter @Setter public class PaymentCallback { private String orderId; private String paymentId; private String status; private BigDecimal amount; private LocalDateTime timestamp; } @Getter @Setter public class QuotaResponse { private String packageId; private boolean available; private Integer remainingQuota; private LocalDateTime timestamp; } @Getter @Setter public class ReservationResponse { private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } @Getter @Setter public class ActivationResponse { private String orderId; private boolean success; private String activationId; private String errorCode; private String errorMessage; } @Getter @Setter public class VerificationResponse { private String orderId; private String activationId; private boolean success; private String status; private LocalDateTime activatedAt; } @Getter @Setter public class PaymentRequest { private String orderId; private BigDecimal amount; private String currency; private String customerId; private String returnUrl; private String callbackUrl; } @Getter @Setter public class PaymentSession { private String sessionId; private String paymentUrl; private LocalDateTime expiresAt; private String status; } @Getter @Setter public class EscrowResponse { private String id; private String paymentId; private BigDecimal amount; private String status; private LocalDateTime createdAt; }
OrderService クラスは、注文の管理に関する面倒な作業を処理します。その仕組みを詳しく見てみましょう:
createOrder(OrderRequest リクエスト):
processPayment(String orderId, PaymentCallback コールバック):
verifyActivation(注文順序):
completeOrder(注文注文):
handleActivationFailure(注文順序):
getOrder(String orderId):
このサービスは注文管理プロセスのバックボーンであり、すべてを結び付けてシームレスなユーザー エクスペリエンスを実現します。
// Domain Models @Getter @Setter @Entity public class Package { @Id private String id; private String name; private BigDecimal price; private BigDecimal providerCost; private String description; private boolean active; } @Getter @Setter @Entity public class Order { @Id private String id; private String customerId; private String packageId; private String reservationId; private String paymentId; private String escrowId; private OrderStatus status; private BigDecimal amount; private BigDecimal providerCost; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Getter @Setter @Entity public class QuotaReservation { @Id private String id; private String packageId; private LocalDateTime expiresAt; private ReservationStatus status; } // Enums public enum OrderStatus { CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED } public enum ReservationStatus { ACTIVE, EXPIRED, USED, CANCELLED }
OrderController クラスは、システム内の注文を管理する REST API エンドポイントを処理します。 Think は、リクエストを行うクライアントと、面倒な作業を行うバックエンド サービスとの間の橋渡しとなります。
POST /api/orders (createOrder):
POST /api/orders/callback (handlePaymentCallback):
GET /api/orders/{orderId} (getOrder):
このコントローラーにより、クライアントとバックエンドがシームレスに通信できるようになり、注文管理が可能な限りスムーズになります。
この調査文書は、クォータ管理、支払い処理、サービスのアクティベーションなどの重要な課題に取り組む、電子商取引信用販売システムを設計するための基礎を示します。このデザインは基本をカバーしていますが、改善の余地は常にあります!
このデザインを改善するためのアイデアをいくつか紹介します:
読んでいただきありがとうございます!このドキュメントが役に立ち、同様の課題を検討している人にとって明確な情報を提供できれば幸いです。もちろん、この設計は完璧ではありません。常に改善の余地があります。ご意見やご提案がございましたら、ぜひお聞かせください。
リソース:
以上がインターネットクレジット購入システムの設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。