Modern olay kaynaklı mimarilerde veri bütünlüğü ve izlenebilirlik hayati önem taşır. Geleneksel ilişkisel veritabanları, olay kaynaklı sistemlerin gerektirdiği yüksek yazma verimliliği ve şema esnekliği ile baş etmekte zorlanabilir. Neyse ki PostgreSQL, mühendislerin yüksek performans ve esneklikle değiştirilemez, sadece ekleme yapılabilen denetim kayıtları oluşturmasını sağlayan güçlü bir özellik kombinasyonu sunar—özellikle JSONB veri türü ve Mantıksal Çözümleme (Logical Decoding).
Bu yazıda, veritabanını kilitlemeden veya performanstan ödün vermeden her durum değişikliğini yakalayan sağlam bir denetim sistemi oluşturmak için bu araçların nasıl kullanılacağını inceleyeceğiz.
Temel Sorun: Olay Kaynağında Denetim
Olay kaynaklı mimari, bir uygulamanın durumunun bir olay dizisinden türetildiğini belirtir. Uyumluluk ve hata ayıklama gereksinimlerini karşılamak için bu olayların değiştirilemez olduğundan emin olmalıyız. Bir kez yazıldıktan sonra bir olay değiştirilemez veya silinemez. Bu "sadece ekleme" (append-only) deseni, ilişkisel bir çerçeve içinde karmaşık, yapılandırılmamış yük verilerini verimli bir şekilde saklayabilen JSONB sütunları için idealdir.
Bununla birlikte, JSON'ı bir tabloda saklamak yeterli değildir. Birincil işlemin gecikmesini etkilemeden, bu yazımları güvenilir bir şekilde yakalamamız ve potansiyel olarak veri ambarları veya gerçek zamanlı panolar gibi aşağı akış tüketicilerine paylaşmamız gerekir.
Değiştirilemez Olaylar İçin Şema Tasarımı
İlk olarak, değiştirilemezliği zorlayan bir şema tanımlayalım. Çift kayıtları önlemek için olay kimliği ve zaman damgası üzerinde benzersiz bir kısıtlama kullanırız ve kaydın gerçekten sadece ekleme yapılabilir olmasını sağlamak için güncelleme tetikleyicilerini atlarız.
CREATE TABLE event_store (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
aggregate_id UUID NOT NULL,
event_type VARCHAR(50) NOT NULL,
payload JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Opsiyonel: Birikmiş olay geçmişi sorgulamak için indeks
CREATE INDEX idx_event_store_aggregate
ON event_store (aggregate_id, created_at);
payload alanını bir JSONB türü yaparak, tüm blob'u serileştirmeden olay içindeki belirli alanları sorgulama yeteneği kazanırız. Bu, hata ayıklama veya denetim günlüklerini filtreleme açısından kritik öneme sahiptir.
Ayrıştırmak İçin Mantıksal Eşzamanlamadan Yararlanma
Olayları saklamak ilk adım olsa da, bu veriyi diğer sistemlerle paylaşmak mantıksal eşzamanlamanın parladığı yerdir. Tüm veritabanını kopyalayan fiziksel eşzamanlamanın aksine, mantıksal eşzamanlama belirli tabloları abone olmanıza ve değişiklikleri okunabilir bir formatta (genellikle JSON veya protokol tamponları) akıtmanıza olanak tanır.
Bunu etkinleştirmek için postgresql.conf dosyanızı yapılandırmanız gerekir:
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10
Etkinleştirildikten sonra, aşağı akış tüketicilerine olayları akıtan bir yayın oluşturabilirsiniz:
PUBLICATION event_pub FOR TABLE event_store;
Bu Yaklaşımın Avantajları
- Performans: Aşağı akış tüketicileri, Yazma-Öncesi Günlüğü (WAL) asenkron olarak okur. Bu, birincil yazma yoluna minimum ek yük ekler.
- Hata Toleransı: Tüketici devre dışı kalırsa, son tüketilen konumdan WAL'ı yeniden oynatabilir, böylece hiçbir olayın kaybolmaması sağlanır.
- Ayrıştırmak: Birbirlerini etkilemeden birden fazla tüketici (örneğin, bir Elasticsearch indeksleyici, bir Kafka üreticisi, bir veri ambarı yükleyici) sahip olabilirsiniz.
Pratik Uygulama: WAL'ı Okuma
Geliştiriciler, bu akışları tüketmek için Java/Go'da pgoutput veya Python'da mantıksal çözümleme eklentileri ile psycopg2 gibi kütüphaneler kullanabilir. Veriler, şemanıza doğrudan eşlenen bir formatta gelir ve bu da serileştirmeyi basitleştirir.
Örneğin, bir tüketici şu formatta bir mesaj alabilir:
{
"operation": "INSERT",
"table": "event_store",
"tuple": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"aggregate_id": "b2c1e9f0-...",
"event_type": "OrderPlaced",
"payload": {"item": "Widget", "qty": 1},
"created_at": "2023-10-27T10:00:00Z"
}
}
Sonuç
PostgreSQL'in JSONB esnekliğini Mantıksal Eşzamanlama ile birleştirmek, olay kaynaklı sistemlerde değiştirilemez denetim kayıtları için savaş testinden geçmiş bir temel sağlar. Birincil verilerinizde güçlü tutarlılığı korurken, değişiklikleri ikincil sistemlere zahmetsizce akıtmanıza olanak tanır. Bu mimari, ölçeklenebilir, dayanıklıdır ve modern veri mühendisliğinin karmaşıklıklarını işlemek için PostgreSQL'in olgun ekosisteminden yararlanır.
Şemayı uygulayarak küçük başlayın, ardından ilk tüketicinize veri beslemek için bir mantıksal eşzamanlama yuvası entegre edin. Sonuç, hem bakımı kolay hem de üretim ölçekli denetim gereksinimlerini karşılayacak kadar sağlam bir sistem olacaktır.