class Event Sourcing ve CQRS (Command Query Responsibility Segregation) Nedir? extends Post
@created_at(
"2025-01-14 15:46"
)
@tag(
"event sourcing"
)
@tag(
"cqrs"
)
***
Event Sourcing ve CQRS, modern yazılım mimarilerinde önemli bir yere sahip olan iki kavramdır. Bu yazıda bu kavramların detaylarına inecek ve Laravel kullanarak microservice mimarisinde bu yaklaşımların nasıl uygulanabileceğini göstereceğiz.
---
**Event Sourcing Nedir?**
Event Sourcing, uygulamanın durumunu veritabanında bir dizi "olay" şeklinde kaydetme yaklaşımıdır. Geleneksel mimarilerde sadece son durum (state) saklanırken, Event Sourcing'de her bir değişiklik (event) kaydedilir. Bu yaklaşımla:
1. **Geçmiş Veri Analizi**: Sistemde hangi olayın ne zaman ve nasıl meydana geldiği kolayca izlenebilir.
2. **Veri Tutarlılığı**: Tüm değişiklikler kaydedildiği için veri kaybı olasılığı azalır.
3. **Audit Log**: Sistem için doğrulama ve hata ayıklama çok daha kolay hale gelir.
---
**CQRS (Command Query Responsibility Segregation) Nedir?**
CQRS, bir uygulamadaki veri yazma ve okuma işlemlerinin birbirinden ayrılmasını savunan bir mimari modeldir. Geleneksel mimarilerde aynı model hem yazma hem okuma işlemleri için kullanılırken, CQRS'de bu işlemler ayrık bileşenler olarak ele alınır.
- **Command**: Sisteme bir eylem yaptırmak (yazma) için kullanılan bileşenlerdir.
- **Query**: Sistemdeki veriyi okumak için kullanılan bileşenlerdir.
Bu yaklaşım, performansı artırır ve sistemin daha ölçeklenebilir olmasını sağlar.
---
**Laravel ile Event Sourcing ve CQRS Nasıl Yapılır?**
Laravel, bu kavramları uygulamak için ideal bir framework'dür. Laravel Event Sourcing paketlerini kullanarak bu mimarileri kolayca uygulayabilirsiniz.
---
**1. Laravel Event Sourcing Kurulumu**
composer require spatie/laravel-event-sourcing
Bu paket, Event Sourcing konseptini uygulamak için tüm gerekli bileşenleri sağlar.
---
**2. Event Sourcing ile Veri Kaydetme**
Bir modeldeki değişiklikleri "event" olarak kaydetmek için aşağıdaki adımlar izlenir:
1. Bir olay sınıfı oluşturun:
php artisan make:event ProductCreated
namespace App\Events;
class ProductCreated
{
public function __construct(
public string $name,
public float $price
) {}
}
2. Bu olaya bir projeleştirici (projector) ekleyin:
php artisan make:projector ProductProjector
namespace App\Projectors;
use App\Events\ProductCreated;
use App\Models\Product;
use Spatie\EventSourcing\Projectors\Projector;
class ProductProjector implements Projector
{
public function onProductCreated(ProductCreated $event)
{
Product::create([
'name' => $event->name,
'price' => $event->price,
]);
}
}
3. `event-sourcing.php` dosyasına projectoru ekleyin:
return [
'projectors' => [
App\Projectors\ProductProjector::class,
],
];
---
**3. CQRS ile Komut ve Sorgu Ayrımı**
CQRS'yi uygulamak için adımlar:
1. **Command Oluşturma:**
php artisan make:command CreateProductCommand
namespace App\Commands;
class CreateProductCommand
{
public function __construct(
public string $name,
public float $price
) {}
}
2. **Command Handler (Komut Yönetici):**
namespace App\Handlers;
use App\Commands\CreateProductCommand;
use App\Events\ProductCreated;
class CreateProductHandler
{
public function handle(CreateProductCommand $command)
{
event(new ProductCreated($command->name, $command->price));
}
}
3. **Query Handler:**
namespace App\Queries;
use App\Models\Product;
class ProductQuery
{
public function getAllProducts()
{
return Product::all();
}
}
---
**4. Microservice Mimarisi ve API Kullanımı**
Event Sourcing ve CQRS'nin microservice yapısında kullanımı için API tasarımı büyük önem taşır. Event Store verilerini Kafka veya RabbitMQ gibi mesaj kuyrukları ile diğer servislerle paylaşabilirsiniz.
**Ornek:**
Bir ürün ekleme işlemi bir microservice olarak tasarlanabilir.
1. **API Endpoint:**
Route::post('/products', [ProductController::class, 'store']);
2. **Controller:**
namespace App\Http\Controllers;
use App\Commands\CreateProductCommand;
use App\Handlers\CreateProductHandler;
class ProductController extends Controller
{
public function store(Request $request, CreateProductHandler $handler)
{
$command = new CreateProductCommand(
$request->name,
$request->price
);
$handler->handle($command);
return response()->json(['message' => 'Product created!']);
}
}
---
**Sonuç**
Event Sourcing ve CQRS, özellikle büyük ve karmaşık sistemlerde veri tutarlılığı, performans ve izlenebilirlik gibi konularda önemli avantajlar sunar. Laravel gibi güçlü bir framework ile bu yaklaşımlar kolayca hayata geçirilebilir. Bu kavramları daha iyi anlamak için Laravel Event Sourcing paketi ile pratik yapmanızı tavsiye ederim.
**Event Sourcing ve CQRS Mimarisini Anlamak ve Genişletmek**
Modern yazılım mimarilerinde Event Sourcing ve CQRS, çoğu zaman bir arada kullanılarak büyük sistemlerin şeffaflığını, performansını ve ölçeklenebilirliğini artırmada kritik bir rol oynar. Bu yazıda, bu iki mimariyi daha da derinlemesine inceleyip, onlarla ilgili yakından bağlantılı konseptleri ele alacağız.
---
### Event Sourcing: Çok Yönlü Veri Kaydetme Stratejisi
**Event Sourcing** bir sistemin tüm durum değişikliklerini (events) olay tabanlı olarak kaydederek, verilerin nasıl ve ne zaman değiştiğini izlememizi sağlayan bir yaklaşımdır. Geleneksel olarak bir kaydın son hali saklanırken, Event Sourcing her bir adımı tutar.
#### Avantajları:
- **Audit Log:** Sistem davranışını tam anlamıyla izleyebilme.
- **Sistem Hatası Kurtarıcısı:** Olayları yeniden oynatarak sistemin geçmişini tekrarlayabilme.
- **Gerçek Zamanlı Veri:** Olay temelli mimariler, sistemlerin anlık tepki verebilmesini sağlar.
#### Laravel'de Nasıl Uygulanır?
Laravel'in **Spatie Event Sourcing** paketi, olay tabanlı uygulamaları hızlı bir şekilde geliştirmek için ideal bir seçenektir. Bu paketi kullanarak bir sistemin tüm olaylarını kolayca kaydedebilir ve çalıştırabilirsiniz.
---
### CQRS: Okuma ve Yazma Sorumluluğunu Ayırma
**CQRS (Command Query Responsibility Segregation)**, okuma ve yazma işlemlerini ayırarak sistemin karmaşıklığını azaltan ve performansını artıran bir mimari desenidir.
#### Neden CQRS?
- Okuma (Query) ve Yazma (Command) işlemlerinin farklı şekilde optimize edilmesine olanak tanır.
- Büyük sistemlerde veritabanı yükünü dengeler.
- Karmaşık iş mantığı gerektiren senaryolarda daha basit bir tasarım sunar.
#### Laravel ile Nasıl Uygulanır?
Laravel'de CQRS, genellikle komut sınıfları (Command) ve sorgu sınıfları (Query) oluşturularak uygulanır.
**Örnek:**
1. **Command**:
namespace App\Commands;
class CreateOrderCommand
{
public function __construct(
public string $orderId,
public array $products
) {}
}
2. **Handler**:
namespace App\Handlers;
use App\Commands\CreateOrderCommand;
use App\Models\Order;
class CreateOrderHandler
{
public function handle(CreateOrderCommand $command)
{
Order::create([
'id' => $command->orderId,
'products' => json_encode($command->products),
]);
}
}
3. **Query**:
namespace App\Queries;
use App\Models\Order;
class OrderQuery
{
public function getOrderById(string $orderId)
{
return Order::find($orderId);
}
}
---
### Dağıtılmış Sistemler ve Event-Driven Architecture
Event Sourcing ve CQRS, genellikle **Event-Driven Architecture** ve **Microservice** yapısıyla birleştirilir. Bu mimarilerde farklı servisler, Kafka veya RabbitMQ gibi mesaj kuyruğu sistemleri aracılığıyla birbirleriyle iletişim kurar.
#### Neler Bilmelisin?
- **Mesaj Kuyruğu Araçları:** Kafka, RabbitMQ veya Redis Streams.
- **API Gateway:** Microservice yapısında güvenlik ve yönlendirme için Kong veya NGINX kullanılabilir.
- **Service Mesh:** Istio veya Linkerd gibi araçlarla mikroservis iletişimlerini yönetebilirsin.
---
### Eventual Consistency ve Saga Pattern
#### Eventual Consistency
Event Sourcing ve CQRS kullanan sistemlerde, verilerin anında tutarlı olması gerekmez. İşlem sonrasında veriler zamanla tutarlı hale gelir. Bu yaklaşım:
- Çok fazla trafik alan sistemlerde performansı artırır.
- Gerçek zamanlı olmayan, ancak yakından izlenen sistemlerde faydalıdır.
#### Saga Pattern
Saga Pattern, birden fazla servisin katıldığı karmaşık işlemleri yönetmek için kullanılan bir desen.
**Laravel'de Kullanım:**
- Saga Pattern'i uygulamak için Event Bus ve Listener yapılarını Laravel'de kullanabilirsin.
- **Örnek:** Bir sipariş işlemi sürecinde ödeme, stok azaltma ve teslimat planlama gibi adımlar bir Saga'ya bağlanabilir.
---
### Performans Optimizasyonu ve Monitoring
Event Sourcing ve CQRS kullanan sistemlerde performans kritik bir rol oynar. Aşağıdaki yaklaşımları kullanabilirsin:
- **Cache Kullanımı:** Redis veya Memcached ile sorguları hızlandır.
- **Loglama ve Monitoring:** Laravel Telescope, Horizon gibi araçlarla sistemi izleyebilirsin.
- **Load Balancing:** İşlemleri dengelemek için NGINX veya HAProxy kullan.
---
### Sonuç
Event Sourcing ve CQRS, büyük ve karmaşık sistemlerde veri tutarlılığını, şeffaflığı ve performansı artırır. Laravel, bu mimarileri kolayca uygulamak için zengin bir ekosistem sunar. Ancak bu yaklaşımları kullanmadan önce sistem ihtiyaçlarını dikkatlice analiz etmek ve bu mimarilerin fayda sağlayıp sağlamayacağını belirlemek kritik bir öneme sahiptir.