5

Çalışma arkadaşlarım ve bir istemciyi sunucuyla eşitlemek için deltalar kullanan birkaç istemci sunucu mimarisi programı oluşturduk. Kayıtları silmeyle ilgili bir sorun, birden fazla projede görünmek gibi görünüyor. Bir sunucu, kayıtları yerel olarak nasıl silebilir ve gelecekteki istemciler için silme delta bilgisi oluşturmak için yeterli bilgiye sahip olabilir?İstemci sunucu mimarisinde silinen veriler için delta nasıl oluşturulur?

Örnek 1:

Bir gerçek zamanlı oyun oyunlar arasında varlıkları eşitlemek için UDP istemci sunucusu kullanır. Sadece değiştirilmiş oyun durumunu ve daha önce bırakılan paket verilerini içeren deltalar iletilir. Sunucu bir varlığı silerse, her bir müşteriye bu nesneyi silmesi için bir silme deltası gönderebilir. Bu bir paket düşürülmezse çalışır. Sunucu, hangi verinin düştüğünü belirlediğinden ve deltasları yeniden iletebildiğinden, bu durum normal durum verileri için uygun bir yöntemdir, ancak bu, sunucunun (her istemciden tam bir onaylama yapmadan) sunucu öğesinin yerel olarak silinemediği anlamına gelir. veri silme deltası oluşturmak için var olacaktır.

Örnek 2:

Bir istemci, bir sunucuda depolanan bir veri tabanı ile senkronize etmek için ister. Sunucu, sunucudaki her kayıt için değiştirilmiş bir tarih saklar. Müşteri bir senkronizasyon isteğinde bulunduğunda, güncellediği son tarihi iletir. Sunucu, o tarihten bu yana değiştirilen tüm kayıtları toplar ve bunları istemciye gönderir. Bu, silme işlemleriyle çalışır, ancak sunucu her kaydın silinmesini sağlar ve silme işlemini belirtmek için bir bayrak kullanır. Sunucu, yerel olarak depolanmış bir kaydı siler.

Her iki örnekte de, düşünebildiğim tek çözüm, silinmiş olan her şeyi içeren bir kaydı tutmak veya belirli bir tarih/saatten sonra tüm bir senk işlemini zorlamak. Bunlar sürdürülebilir veya zarif modeller gibi görünmüyor. Bu tür bir sorunu çözmek için sürdürülebilir yöntemler nelerdir?

cevap

1

Bu neden sürdürülebilir görünmüyor? Bir çok senkronizasyon çerçevesi bunu kullanır ve buna Tombstoning, afaik denir. Kayıt silinir veya silinmiş olarak işaretlenir ve başka bir tabloda (veritabanlarıyla ilgili ise) silinmiş öğeye bir başvuru tutulur. Bu şekilde sistemler silinmiş kayıtları senkronize edebilir. Aslında, sadece veriyi silmekle ilgili değil. Bazıları, bir kaydın her güncellemesinin de bir silme olduğunu söyleyebilir. Çünkü kaydın eski versiyonu bir daha asla bulunamaz. Bu yüzden, veri mağazasına güncellemeler göndermek yerine, yalnızca eski verileri saklamak önemliyse, yalnızca ekler gönderin.

UDP ve paket kaybı durumunda, yazılımınızı bunun etrafında tasarlamak zorundasınız. Bir oyun zaten silinmiş olan bazı varlıklar için veri gönderirse, görmezden gel veya buna uygun şekilde cevap ver. Burada çok seçenek var.

Ayrıca olay kaynaklarına bakıyor olabilirsiniz. Kutsal bir şey ya da herhangi bir şey değil, ama normal CRUD'dan farklı şekilde çalışıyor. Bunun yerine komutu ayırmak ve sorgulamak için CQRS'yi kullanır ve olay kaynağı oluşturmak için olay kaynağı kullanılır. Sadece olayları saklarsın. Öyleyse, bir tarafın durumunu ne zaman istersen, tüm olayları okuyorsun. Muhtemelen her zaman bir ekleme, sıfır veya birden fazla güncelleştirme ve ardından bazı silme ifadeleriyle başlar. Bilmen gereken her şey var. Bu olaylar ayrıca en son durumun okuma modellerini oluşturan diğer bileşenlere de gönderilir. Bu şekilde, bazı UI, okuma modelinden okuyabilir ve hızlı yanabilir, ancak her durum değişikliği, her olay için iş mantığını ele alan etkinlik akışından gelir.

Bu konuyla ilgileniyorsanız, Greg Young ve diğer birçok insandan CQRS ve Etkinlik Kaynaklarını okuyun.

+0

Disk kullanımı ve arama süresi artar. Eğer binlerce müşteri potansiyel olarak bir sene içinde toplanabilecek her zaman bir sunucu üzerinde değişiklikler gönderiyorsa ve en kötü tarafı bunu asla çözemedim. Bu model için düşündüğüm bir strateji, belirli bir süre sonra tam bir güncellemeyi zorlamaktı. Bu, sunucunun kayıtları silmesinin her 3 ayda bir yapılmasını sağlayacaktı, ancak bu, zarif bir model gibi görünmüyor. UDP örneğinde, sanırım kaydın yeni bir nesne tarafından yeniden kullanılmakta olup olmadığını belirlemek için nesneyle bazı karma aktarımlar yapabilirim. –

+0

Sadece okuduğumu ve Microsoft'un anlattığım gibi mezar taşlarıyla son kullanma tarihi modelini kullandığını gördünüz. –

+0

Evet Tüm deltaları aynı şekilde ele alan ve sürüm değişiklikleri yığını olan bir CQRS tipi model kullanmayı düşündüm, ancak bu özel depolama sorununu bir araya getirebilir. Her bir kayıt için tüm sürüm geçmişini saklamak veya bir çeşit anlık görüntü süresi sunmak zorundayım. –

İlgili konular