Sitemize hoşgeldiniz!  ::  Son eklenen yazı: Git’te “master” mı “main” mi? Bir kelimenin ardındaki hikâye  ::  Toplam 63 yazı  ::  Görüş ve önerileriniz için iletişim sayfasını kullanabilirsiniz.
» Menü
Anasayfa
Hakkımda
İletişim
» Kategoriler
› nostalji (8)
› laravel (7)
› php (5)
› web (3)
› agile (3)
› go (2)
› golang (2)
› api (2)
› redis (2)
› git (2)
› github (2)
› model (1)
» Arşiv
› Ekim 2025 (2)
› Temmuz 2025 (1)
› Nisan 2025 (3)
› Mart 2025 (5)
› Şubat 2025 (1)
› Ocak 2025 (43)
› Haziran 2011 (1)
› Kasım 2009 (1)
› Temmuz 2009 (1)
› Temmuz 2007 (1)
› Ocak 2007 (1)
› Kasım 2006 (1)
› Ekim 2006 (1)
› Ağustos 2006 (1)
Anasayfa » Yazılar » Event Sourcing ve CQRS (Command Query Responsibility Segregation) Nedir?
Event Sourcing ve CQRS (Command Query Responsibility Segregation) Nedir?
Yazan: Atilla Mutlu | Tarih: 14.01.2025 15:46 | Kategori: event sourcing, 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
    ) {}
}
  1. 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,
        ]);
    }
}
  1. 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
    ) {}
}
  1. 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));
    }
}
  1. 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']);
  1. 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.

« Geri dön | Yorum gönder | Yukarı ↑
» Hakkımda
A
Atilla Mutlu
Yazılım Geliştirici

Devamını oku »
» Son Yazılar
› Git’te “master” mı “main” mi? Bir kelimenin ardındaki hikâye
› Laravel Model Controller
› PostgreSQL Mini‑Kılavuz
› ReactJS Rehberi
› Spatie Laravel Paketleri
» İstatistik
Ziyaretçi Sayısı
036358
Toplam yazı: 63
PHPpowered SQLiteinside Firefoxile daha iyi CSStables ♥
Bu site en iyi 1024x768 çözünürlükte görüntülenir.
Copyright © 2006-2026
Anasayfa | Hakkımda | İletişim | Yukarı ↑
Bu sayfa 0,026 saniyede oluşturuldu.