Aracılığıyla paylaş


Çoğaltılmış taneler

Bazen, birden çok kümeyi çalıştırırken ve kullanırken OneInstancePerClusterAttributeolduğu gibi aynı dilimin birden çok etkin örneği olabilir. JournaledGrain, çoğaltılan örnekleri minimum düzeyde sürtüşmeyle destekleyecek şekilde tasarlanmıştır. Tüm örneklerin aynı olay dizisini kabul etmesini sağlamak için gerekli protokolleri çalıştırmak için günlük tutarlılığı sağlayıcılarına dayanır. Özellikle, aşağıdaki yönlerle ilgilenir:

  • Tutarlı Sürümler: Tahıl durumunun tüm sürümleri (belirsiz sürümler hariç) aynı genel olay dizisini temel alır. Özellikle, iki örnek aynı sürüm numarasını görüyorsa, aynı durumu görür.

  • Yarış Olayları: Birden çok örnek aynı anda bir etkinlik oluşturabilir. Tutarlılık sağlayıcısı bu yarışı çözer ve herkesin aynı sırayı kabul etmesini sağlar.

  • Bildirimler/Reactivity: Tek bir taneli örnekte bir olay tetiklendiğinde tutarlılık sağlayıcısı yalnızca depolamayı güncelleştirmez, aynı zamanda diğer tüm örnek örneklerine de bildirir.

Tutarlılık hakkında genel bir tartışma için model TechReport ve GSP makalemize (Genel Sıralı Protokol) bakın.

Koşullu olaylar

Yarış olayları bir çakışmaya neden olursa sorunlu olabilir, yani her ikisi de bir nedenden dolayı işlememelidir. Örneğin, bir banka hesabından para çekerken, iki örnek para çekme için yeterli fon olduğunu bağımsız olarak belirleyebilir ve bir para çekme olayı verebilir. Ancak her iki olayın birleşimi de fazla çizebilir. Bunu JournaledGrain önlemek için API bir RaiseConditionalEvent yöntemi destekler.

bool success = await RaiseConditionalEvent(
    new WithdrawalEvent() { /* ... */ });

Koşullu olaylar, yerel sürümün depolamadaki sürümle eşleşip eşleşmediğini bir kez daha denetler. Değilse, olay dizisi bu arada büyüdü demektir, yani bu olay başka bir olaya karşı yarış kaybetti. Bu durumda, koşullu olay günlüğe eklenmez ve RaiseConditionalEvent false döndürür.

Bu, koşullu depolama güncelleştirmeleriyle e-etiketleri kullanmanın analogudur ve benzer şekilde çakışan olayların işlenmesini önlemek için basit bir mekanizma sağlar.

ve gibi DepositEvent aynı tanecik için hem koşullu hem de koşulsuz olayları kullanmak mümkün ve mantıklıdır WithdrawalEvent. Depozitolar koşullu olmamalıdır: bir DepositEvent yarışı kaybetse bile iptal edilmesi gerekmez, ancak yine de küresel olay dizisine eklenebilir.

tarafından RaiseConditionalEvent döndürülen görevin beklenmesi, olayı onaylamak için yeterlidir; örneğin, öğesini çağırmak ConfirmEventsda gerekmez.

Açık eşitleme

Bazen, bir tanenin en son sürüme tam olarak yakalandığından emin olmak istenir. Bu, çağrılarak zorunlu kılınabilir:

await RefreshNow();

Bu işlem iki işlem yapar:

  1. Onaylanmamış tüm olayları onaylar.
  2. Depolama alanından en son sürümü yükler.