Laravel ile CQRS ve Event Sourcing Kullanımı

L

CQRS (Command Query Responsibility Segregation) ve Event Sourcing, büyük ölçekli uygulamalarda veri yönetimini ve olayların kaydını daha etkili hale getirmek için kullanılan güçlü tasarım desenleridir. Bu yaklaşımlar, özellikle yüksek trafikli ve karmaşık veri yapılarıyla çalışan sistemlerde önemli faydalar sağlar.

  • CQRS; yazma ve okuma işlemlerini ayırarak her iki işlemi de optimize etmeyi amaçlar.
  • Event Sourcing ise her değişikliğin bir olay olarak kaydedilmesini sağlar. Böylece, veri geçmişi her zaman takip edilebilir hale gelir.

Bu yazıda, CQRS ve Event Sourcing desenlerinin Laravel ile nasıl uygulanabileceğini, avantajlarını ve temel kullanım örneklerini detaylı olarak inceleyeceğiz.

1. CQRS (Command Query Responsibility Segregation) Nedir?

CQRS, yazma (Command) ve okuma (Query) işlemlerini ayırarak her birini farklı modellerde ve farklı mekanizmalarda yönetmeyi amaçlar. Bu ayrım sayesinde:

  • Okuma işlemleri için optimize edilmiş modeller,
  • Yazma işlemleri için optimize edilmiş servisler ve işlemler kullanılır.

CQRS’in Temel Avantajları:

  1. Performans İyileştirmesi: Okuma ve yazma işlemleri ayrı ayrı optimize edilebilir.
  2. Sadelik: Karmaşık veri yapıları ve sorguları için daha yönetilebilir bir yapı sunar.
  3. Esneklik: Okuma ve yazma operasyonları için farklı veri kaynakları kullanılabilir.

Laravel’de CQRS Kullanımı

Laravel’de CQRS implementasyonu için öncelikle Command ve Query sınıflarına ihtiyacımız var. Komutlar, genellikle iş mantığını taşıyan sınıflardır, sorgular ise veri okuma işlemleriyle ilgilidir.

1. Command (Yazma İşlemi)

Yazma işlemlerini bir Command sınıfı ile tanımlarız. Bu sınıf, gerekli parametreleri alıp, veri üzerinde işlemler yapar.

// app/Commands/CreatePostCommand.php
namespace App\Commands;

class CreatePostCommand
{
    public $title;
    public $content;

    public function __construct($title, $content)
    {
        $this->title = $title;
        $this->content = $content;
    }
}

2. Command Handler (Komut İşleyici)

Komutları işleyen sınıf, veritabanı işlemleri gibi iş mantığını gerçekleştirir.

// app/Handlers/CreatePostHandler.php
namespace App\Handlers;

use App\Models\Post;
use App\Commands\CreatePostCommand;

class CreatePostHandler
{
    public function handle(CreatePostCommand $command)
    {
        $post = Post::create([
            'title' => $command->title,
            'content' => $command->content,
        ]);
        return $post;
    }
}

3. Query (Okuma İşlemi)

Sorgu sınıfı, okuma işlemleri için optimize edilir. Bu sınıf yalnızca veriyi okur ve geri döndürür.

// app/Queries/GetAllPostsQuery.php
namespace App\Queries;

class GetAllPostsQuery
{
    public function handle()
    {
        return Post::all();
    }
}

4. CQRS'in Uygulama Yapısı

Bu yapıyı kullanarak uygulamanın her iki yönünü (yazma ve okuma) yönetebilirsiniz. Komut ve sorgu sınıflarını uygun servisler ile bağlar ve sisteminizi performans odaklı hale getirebilirsiniz.

2. Event Sourcing Nedir?

Event Sourcing, sistemdeki her değişikliği bir olay (event) olarak kaydetme yöntemidir. Olaylar, veri değişikliklerinin kaydedilmesini sağlar ve bu olayların geçmişi üzerinde işlem yapabilmeyi mümkün kılar. Geleneksel veritabanı işlemleri yerine, veri değişiklikleri olaylar olarak kaydedilir ve bu olaylardan güncel verilere ulaşılabilir.

Event Sourcing'in Temel Avantajları:

  1. Veri Geçmişi Takibi: Her değişiklik bir olay olarak kaydedildiği için, verinin geçmişi her zaman izlenebilir.
  2. Tekrar Edilebilirlik: Olaylar üzerinde işlem yaparak sistemi tekrar eski bir duruma getirmek mümkündür.
  3. Hatalardan Geri Dönüş: Geçmiş olaylara bakarak hataları düzeltebilir ve sistemi daha güvenli hale getirebilirsiniz.

Laravel’de Event Sourcing Kullanımı

Event Sourcing ile her değişiklik bir event (olay) olarak kaydedilir ve bu olaylar bir event store’da tutulur. Laravel’in event sistemi, bu yapıyı kurmak için kullanışlıdır.

1. Event (Olay) Sınıfı Oluşturma

Olay sınıfı, sistemdeki bir değişikliği temsil eder. Örneğin, bir yazı oluşturulduğunda bir PostCreated olayı tetiklenebilir.

// app/Events/PostCreated.php
namespace App\Events;

use App\Models\Post;
use Illuminate\Queue\SerializesModels;

class PostCreated
{
    use SerializesModels;

    public $post;

    public function __construct(Post $post)
    {
        $this->post = $post;
    }
}

2. Event Listener (Olay Dinleyici)

Olay dinleyicisi, olay tetiklendiğinde yapılacak işlemi belirler. Bu dinleyici genellikle olayı kaydeder veya veriyi başka sistemlere iletir.

// app/Listeners/LogPostCreated.php
namespace App\Listeners;

use App\Events\PostCreated;

class LogPostCreated
{
    public function handle(PostCreated $event)
    {
        // Olayı bir log dosyasına kaydediyoruz
        \Log::info('Yeni yazı oluşturuldu: ' . $event->post->title);
    }
}

3. Event’i Tetikleme

Bir işlem yapıldığında, bu işlemi bir olay olarak tetiklemek gerekir. Bu işlemi kontrolcüde yapabiliriz.

// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;

use App\Models\Post;
use App\Events\PostCreated;

class PostController extends Controller
{
    public function store(Request $request)
    {
        $post = Post::create($request->all());

        // Olayı tetikle
        event(new PostCreated($post));

        return response()->json($post, 201);
    }
}

4. Event Store Kullanımı

Event Store, olayları kaydeder ve gerektiğinde bu olayları tekrar oynatarak geçmiş verilere ulaşılmasını sağlar. Laravel'de, bu işlemi gerçekleştirmek için özel bir servis veya sınıf geliştirebilirsiniz. Event Store’un her olayı kaydetmesi ve gerektiğinde geçmiş olayları çekmesi gerekir.

3. CQRS ve Event Sourcing’i Birlikte Kullanma

CQRS ve Event Sourcing’i birlikte kullanmak, büyük ölçekli uygulamalarda performansı ve veri tutarlılığını artırabilir. İşlem ve sorgu yöneticileri birbirinden ayrıldığı için yazma ve okuma işlemleri üzerinde bağımsız iyileştirmeler yapılabilir. Ayrıca, Event Sourcing sayesinde verinin her değişikliğini kaydederek daha sağlıklı bir izleme ve hata ayıklama süreci oluşturabilirsiniz.

Sonuç

CQRS ve Event Sourcing, Laravel uygulamalarında veri yönetimi ve işlem optimizasyonu konusunda güçlü yaklaşımlar sunar. CQRS, okuma ve yazma işlemlerini ayırarak her iki yönü de daha verimli hale getirirken, Event Sourcing sayesinde veri geçmişini kaydederek hatalardan geri dönüş yapabilir ve sistemdeki tüm değişiklikleri daha güvenli bir şekilde takip edebilirsiniz.

Bu iki deseni birleştirerek daha esnek, sürdürülebilir ve izlenebilir uygulamalar geliştirebilirsiniz. Laravel'in sunduğu güçlü event ve queue sistemleri ile bu tasarım desenlerini kolaylıkla hayata geçirebilirsiniz.

By Aydın Yağız

Aydın Yağız

Teknolojiye olan tutkumla inovasyonu destekler, kullanıcı deneyimini önceliklerim arasına alırım. Kendi yeteneklerimi ve bilgilerimi paylaşarak, daha geniş bir topluluğun faydalanmasını sağlarım. İş birliği içinde hareket ederek, geleceğin teknoloji dünyasına katkıda bulunmayı hedeflerim. Sizi de bu heyecan verici yolculuğa davet ediyor, fikirlerinizi paylaşmaya ve teknolojiye dair sınırları zorlamaya teşvik ediyorum. Birlikte büyüyelim ve yeni ufuklara açılalım!

İletişime Geçin

Kodlama dünyasına adım atın ve deneyimlerinizi paylaşın. Siz de bu aktif topluluğa katılarak yeni bağlantılar kurun, fikir alışverişinde bulunun ve bilgi birikiminizi artırın.

Özelleştir

Farklı yazı tipleri ve renk seçenekleriyle stilinizi kişiselleştirin. Aşağıdaki örneklerden birini deneyerek sizin için en uygun olanı seçin.

Yazı Tipi Örnekleri

Renk Örnekleri