ProtectedPayment, e-ticaret platformları için geliştirilmiş, Clean Architecture prensiplerine uygun olarak tasarlanmış ve asenkron mesajlaşma teknolojileri kullanarak korumalı ödeme sistemi implementasyonudur. Kullanıcıların sipariş verdikten sonra 10 dakika boyunca ödemeyi durdurma veya iptal etme hakkına sahip olduğu bir senaryo üzerine kurgulanmıştır.
- ✅ Clean Architecture: Domain-centric, bağımlılıkların içe doğru olduğu katmanlı mimari
- ✅ Sipariş Yönetimi: Bekleme, gönderim ve iptal olaylarının yönetimi
- ✅ 10 Dakikalık İptal Penceresi: Kullanıcı sipariş sonrası ödemeyi durdurabilir veya iptal edebilir
- ✅ Asenkron İşlem: Ödeme provizyonda bekletilir, işlemler asenkron olarak gerçekleşir
- ✅ Üç Farklı Mesajlaşma Teknolojisi: RabbitMQ, Apache Kafka ve Redis Streams
- ✅ Outbox Pattern: Transactional messaging ile tutarlılık garantisi
- ✅ Inbox Pattern: İdempotent message processing
- ✅ Event-Driven Architecture: Asenkron mesajlaşma ile loose coupling
- ✅ Ölçeklenebilir Mimari: Katmanlı ve test edilebilir yapı
- ✅ Docker Desteği: Containerize edilmiş dağıtım
Proje, Clean Architecture prensiplerine uygun olarak katmanlara ayrılmıştır:
ProtectedPayment/
├── src/
│ ├── domain/ # Domain Layer (En içteki katman)
│ │ ├── ProtectedPayment.Domain/ # İş kuralları ve domain mantığı
│ │ │ ├── Entities/ # Domain entities (Order, OutboxMessage, InboxMessage, IdempotencyKey)
│ │ │ ├── Events/ # Event models (OrderPendingEvent, OrderCancelledEvent, vb.)
│ │ │ ├── Repositories/ # Repository interfaces (IOrderRepository, IUnitOfWork, vb.)
│ │ │ └── Errors/ # Domain errors ve Result types
│ │ └── ProtectedPayment.SharedKernel/ # Paylaşılan domain primitives
│ │
│ ├── application/ # Application Layer
│ │ ├── ProtectedPayment.Application/ # Use cases ve business logic
│ │ │ ├── Orders/ # Order service ve use cases
│ │ │ ├── OutboxMessages/ # Outbox pattern implementation
│ │ │ └── InboxMessages/ # Inbox pattern implementation
│ │ └── ProtectedPayment.Application.Contracts/ # DTOs ve Contracts
│ │
│ ├── infrastructure/ # Infrastructure Layer
│ │ └── ProtectedPayment.Infrastructure/
│ │ ├── Database/ # DbContext, Configurations, Migrations
│ │ ├── Repositories/ # Repository implementations
│ │ └── Messaging/ # Messaging implementations
│ │ ├── RabbitMQ/ # RabbitMQ bus service
│ │ ├── Kafka/ # Kafka bus service
│ │ └── Redis/ # Redis bus service
│ │
│ └── host/ # Presentation/Host Layer
│ ├── ProtectedPayment.Order.API/ # RESTful API (HTTP endpoints)
│ └── ProtectedPayment.Worker/ # Background services (Message consumers)
│
└── docker-compose files # Container orchestration
- Bağımlılık: Hiçbir katmana bağımlı değil (tamamen izole)
- İçerik:
- Domain entities (Order, OutboxMessage, InboxMessage, IdempotencyKey)
- Event models (OrderPendingEvent, OrderCancelledEvent, OrderConfirmedEvent, OrderShippedEvent)
- Repository interfaces
- Domain errors ve business rules
- SharedKernel (Shared types, primitives)
- Bağımlılık: Sadece Domain Layer'a bağımlı
- İçerik:
- Use cases ve application services (OrderService)
- Outbox Pattern implementation (OutboxMessageService)
- Inbox Pattern implementation (InboxMessageService)
- DTOs ve Contracts
- Business orchestration
- Bağımlılık: Domain ve Application katmanlarına bağımlı
- İçerik:
- Entity Framework Core DbContext
- Repository implementations
- Messaging implementations (RabbitMQ, Kafka, Redis)
- Database migrations
- External service integrations
- SaveChangesInterceptor (Outbox pattern için)
- Bağımlılık: Tüm katmanlara bağımlı (composition root)
- İçerik:
- Order.API: RESTful API endpoints, controllers
- Worker: Background services (OrderPendingConsumer, OrderCancelledConsumer, vb.)
- Dependency Injection configuration
- Middleware pipeline
- Application startup
1️⃣ Kullanıcı sipariş oluşturur
↓
2️⃣ Ödeme provizyonda bekletilir (Status: Pending)
↓
3️⃣ 10 dakikalık süre başlar
↓
4️⃣ Kullanıcı iptal ederse → Ödeme iade edilir
VEYA
10 dakika dolarsa → Ödeme otomatik onaylanır
↓
5️⃣ Sipariş sevkiyat aşamasına geçer
Veritabanı transaction'ı içinde oluşturulan event'ler OutboxMessage tablosuna yazılır. Background service bu mesajları okuyup message broker'a gönderir. Bu sayede distributed transaction problemi çözülür.
Gelen mesajlar işlenmeden önce InboxMessage tablosuna kaydedilir. Aynı mesaj tekrar gelirse idempotency kontrolü yapılır ve işlem atlanır.
- .NET 10 - Modern, yüksek performanslı web API ve arka plan servis uygulamaları
- ASP.NET Core - Order API
- .NET Worker Service - Background services (Event consumers)
- Entity Framework Core 10 - ORM
- RabbitMQ - TTL + Dead Letter Exchange ile delayed processing
- Apache Kafka - Timestamp-based delayed message handling
- Redis - Sorted Set ile scheduled job processing
- PostgreSQL - İlişkisel veritabanı
- Entity Framework Core 10 - ORM ve veritabanı yönetimi
- Entity Framework Core Migrations - Veritabanı versiyonlama
- SaveChangesInterceptor - Outbox pattern için otomatik event kayıt
- Clean Architecture - Domain-centric layered architecture
- Outbox Pattern - Transactional messaging guarantee
- Inbox Pattern - Idempotent message processing
- Repository Pattern - Data access abstraction
- Unit of Work Pattern - Transaction management
- Event-Driven Architecture - Asynchronous messaging between services
- Dependency Injection - Inversion of Control
- Confluent.Kafka (v2.13.0) - Kafka client
- StackExchange.Redis (v2.10.1) - Redis client
- RabbitMQ.Client (v7.2.0) - RabbitMQ client
- Newtonsoft.Json (v13.0.4) - JSON serialization
- Polly (v8.6.5) - Dayanıklılık ve hata yönetimi
- Scalar.AspNetCore - API dokümantasyonu
- ETPackages.Result (v1.0.0) - Result pattern implementasyonu ve hata yönetimi
- ETPackages.Endpoints (v2.0.0) - Minimal API endpoint tanımlama altyapısı
- Docker - Application containerization
- Docker Compose - Multi-container orchestration
git clone https://github.com/etartar/ProtectedPayment.git
cd ProtectedPaymentdotnet restoredocker-compose -f docker-compose.rabbitmq.yml up -ddocker-compose -f docker-compose.kafka.yml up -ddocker-compose -f docker-compose.redis.yml up -ddocker-compose -f docker-compose.yml up -ddocker-compose dosyasını çalıştırdığınızda tüm servisler ayağa kalkacaktır ve VS RabbitMQ Profile, VS Kafka Profile ve VS Redis Profile kısmından istediğiniz ortamda projeyi debug edebileceksiniz.
GET /ordersPOST /orders
Content-Type: application/json
{
"productName": "Iphone 16",
"amount": 120000
}POST /orders/019c0bd7-2368-7c43-a703-c16761405ab3/cancel
Content-Type: application/jsonOrder API başlatıldıktan sonra Scalar UI'ya erişin:
http://localhost:5300/scalar/v1
Sorular veya öneriler için GitHub Issues açabilirsiniz.
- Backend Guru eğitim programı
- .NET ve açık kaynak komunite