31 Aralık 2019 Salı

Yazılım Mimarisindeki Genel Kabiliyetler - Kaydetme (Record/Save)

Giriş
Bir çok sistemde giren veriyi veya sinyali kaydedip, gerektiği zaman tekrar oynatabilmesi isteniyor. Böylece herhangi bir andaki durumun tekrar edilebilmesi sağlanıyor.


Kaydetme için kullanılan iki temel çözüm var.

1. Gelen mesajları kaydetme
2. Mesajları işledikten sonra nesneleri yani state'i kaydetme

1. Mesaj Kaydetme
Mesajları kaydetme dışarıdan bir kanal ile beslenen bir yazılımda uygulanır. Örneğin uzaktan kumanda edilen bir yazılım gibi.

Gördüğüm bazı çözümler şöyle

1.1. Tee Kanal Kullanma
Bir nevi Unix'teki tee komutunu andırdığı için bu ismi verdim. Gerçek kanalın yerine tee kanal geçer. Gelen çağrıyı hem gerçek kanala hem de kayıt işlemini yapan kanala göndererek çalışır.

Kanal bir yazılım socketi, web servis çağrısı olabilir.

1.2. Mesajın Filtrelendikten Sonra Kaydedilmesi

Örnek
Bu yöntemde elimizde bir viewer olduğunu düşünelim. Bu viewer çeşitli filtreleme yeteneklerine sahip olsun. Kaynağa göre, Hedefe göre, Gönderilen veya Alınan durumuna göre vs. filtreleme yapıyor olsun

Kaydetme işlemi bu filtrelerden geçen mesajlara uygulanıyorsa kanal seviyesinde yapılamaz. Daha yukarı bir katmanda yani viewer seviyesinde yapmak gerekir.

1.3 Kayıt Formatı
Mesajları genellikle bir şekilde zenginleştirdikten sonra kaydetmek gerekiyor. 
Örnek
Şöyle yaparız. Burada mesaj verisi yanında ne zaman geldiği, daha sonra filtrelemek için tipi gibi ilave bilgiler de kaydediliyor.
public class StoredEvent
{
  public Guid Id { get; set; }
  public DateTime Timestamp { get; set; }
  public string EventType { get; set; }
  public string EventData { get; set; }
}
1.3 Tekrar Oynatma (Replay)
Tekrar oynatma için kaydedilmiş dosyaları okuyan bir kod lazım. Ama daha da önemlisi bu mesajları sisteme geri besleyecek bir de kanal lazım. 


2. State Kaydetme
State kaydetme örneğin simülasyon yazılımında kullanılır. Burada amaç hesaplamayı kaydetmektir.

2. 1. Nesnelerin Periyodik Olarak Kaydedilmesi
Tick bazında çalışan bir sistem olsun. Her tick'te processorlar/nesneler mesajları işledikten sonra elimizdeki her nesneyi diske kaydedelim. Örneğin nesnemiz bir araba olsun. Her tick'te arabanın konumu değişsin. Eğer araba nesnesini kaydedersek mesaj yerine nesneyi kaydetmiş oluruz ancak yine de kayıt yeteneği elde ederiz.

HLA alt yapısı kullanılıyorsa Snapshot alma yeteneği kullanılabilir.

2.2. Restore (Yeniden Yükleme)
HLA alt yapısı kullanılıyorsa Snapshot restore yeteneği kullanılabilir. HLA RTIambassador Arayüzü - Federation Restore Kabiliyeti yazısına bakabilirsiniz.

Restore işleminde aynı CRUD gibi davranmak gerekiyor. Farklı olarak nesnelerin onCreate() metodu ile onRestore() metodlarının farklı olmasını gerekebilir.  Bu yüzden

- Önce nesnelerin onRestore() metodları çağrılır. Böylece mevcut nesneler eski haline geri getirilir.
- Sonra kaydetme işleminden sonra silinmiş nesneler için tekrar onCreate()/onNew() metodları çağrılır. Böylece silinmiş nesneler tekrar ortama geri gelirler.

3. Kaydetme Ortamı
Kaydetme ortamı genellikle bellek olamıyor çünkü uzun saatler boyunca yapılan kayıtlar belleği bitirir. Bu yüzden veritabanı, gömülü veritabanı veya dosya yöntemlerinden birisi seçilebilir.

Kayıt çok fazla yer kaplıyorsa sıkıştırma düşünülebilir.



Hiç yorum yok:

Yorum Gönder