إنشاء نهج مخصص لحل التعارض

مكتمل

قد تكون هناك أوقات ترغب فيها في كتابة منطقك الخاص لحل التعارضات بين العناصر. يمكن تحقيق ذلك باستخدام نهج مخصص لحل التعارض.

ستستخدم نهج الدقة المخصصة إجراءً مخزّناً لحل التعارضات بين العناصر في مناطق مختلفة. يجب تنفيذ جميع الإجراءات المخزّنة المخصصة باستخدام توقيع الدالة JavaScript التالية.

function <function-name>(incomingItem, existingItem, isTombstone, conflictingItems)

كل من هذه المعلمات الأربعة مطلوبة في الدالة:

المعلمة‬ الوصف
existingItem العنصر الذي تم تثبيتها مسبقاً
incomingItem العنصر الذي تم إدراجه أو تحديثه والذي أدى إلى حدوث التعارض
isTombstone قيمة منطقية تشير إلى ما إذا كان العنصر الوارد قد تم حذفه مسبقاً
conflictingItems صفيف لجميع العناصر التي تم تثبيتها في الحاوية التي تتعارض مع incomingItem

مثال على تنفيذ إجراء مخزّن لحل التعارض باستخدام /metadata/sortableTimestamp قد يتضمن التعليمات البرمجية التالية.

function resolveConflicts(incomingItem, existingItem, isTombstone, conflictingItems) {
  if (!incomingItem) {
    if (existingItem) {
      __.deleteDocument(existingItem._self, {});
    }
  } else if (isTombstone) {
  } else {
    if (existingItem) {
      if (incomingItem.metadata.sortableTimestamp > existingItem.metadata.sortableTimestamp) {
        return;
      }
    }
    var i;
    for (i = 0; i < conflictingItems.length; i++) {
      if (incomingItem.metadata.sortableTimestamp > conflictingItems[i].metadata.sortableTimestamp) {
        return;
      }
    }
    delete (conflictingItems, incomingItem, existingItem);
  }

  function delete (documents, incoming, existing) {
    if (documents.length > 0) {
      __.deleteDocument(documents[0]._self, {}, function (err, responseOptions) {
        documents.shift();
        delete (documents, incoming, existing);
      });
    } else if (existing) {
      __.replaceDocument(existing._self, incoming);
    } else {
      __.createDocument(collection.getSelfLink(), incoming);
    }
  }
}

يمكنك استخدام .NET SDK ل Azure Cosmos DB ل NoSQL لتكوين نهج حل التعارض المخصص. لبدء هذا المثال، سيتم إنشاء حاوية باسم products باستخدام نهج مخصص لحل التعارض.

string databaseName = "cosmicworks";
string containerName = "products";
string partitionKey = "/categoryId";
string sprocName = "resolveConflicts";

Database database = client.GetDatabase(databaseName);

ContainerProperties properties = new(containerName, partitionKey)
{
    ConflictResolutionPolicy = new ConflictResolutionPolicy()
    {
        Mode = ConflictResolutionMode.Custom,
        ResolutionProcedure = $"dbs/{databaseName}/colls/{containerName}/sprocs/{sprocName}",
    }
};

Container container = database.CreateContainerIfNotExistsAsync(properties);

وأخيراً، يتم إنشاء إجراء مخزّن باسم resolveConflicts لدعم نهج حل التعارض.

StoredProcedureProperties properties = new (sprocName, File.ReadAllText(@"code.js"))

await container.Scripts.CreateStoredProcedureAsync(properties);

بدلاً من ذلك، يمكن تكوين نهج مخصص لحل التعارض بدون إجراء مخزّن. في هذا السيناريو، تتم كتابة التعارضات إلى موجز تعارضات. يمكن بعد ذلك أن تحل التعليمات البرمجية للتطبيق حل التعارضات في الموجز يدوياً.

باستخدام .NET، يمكنك تكوين حاوية لحل التعارض اليدوي باستخدام عينة التعليمات البرمجية هذا.

Database database = client.GetDatabase("cosmicworks");

ContainerProperties properties = new("products", "/categoryId")
{
    ConflictResolutionPolicy = new ConflictResolutionPolicy()
    {
        Mode = ConflictResolutionMode.Custom
    }
};

Container container = database.CreateContainerIfNotExistsAsync(properties);