موجز تغيير العملية في خدمة Azure Blob Storage

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

لمعرفة المزيد حول موجز التغيير، انظر موجز التغيير في Azure Blob Storage.

إعداد مشروعك

يرشدك هذا القسم خلال إعداد مشروع للعمل مع مكتبة عميل Blobs Change Feed ل .NET.

تثبيت الحزم

من دليل المشروع الخاص بك، قم بتثبيت الحزمة لمكتبة عميل Azure Storage Blobs Change Feed ل .NET باستخدام dotnet add package الأمر . في هذا المثال، نضيف العلامة --prerelease إلى الأمر لتثبيت أحدث إصدار معاينة.

dotnet add package Azure.Storage.Blobs.ChangeFeed --prerelease

تستخدم أمثلة التعليمات البرمجية في هذه المقالة أيضا حزم Azure Blob Storage وAzure Identity .

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs

أضف توجيهات using

أضف التوجيهات التالية using إلى ملف التعليمات البرمجية:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.ChangeFeed;

إنشاء كائن عميل

لتوصيل التطبيق ب Blob Storage، قم بإنشاء مثيل للفئة BlobServiceClient . يوضح المثال التالي كيفية إنشاء كائن عميل باستخدام DefaultAzureCredential للتخويل. لمعرفة المزيد، راجع تخويل الوصول والاتصال ب Blob Storage. للعمل مع موجز التغيير، تحتاج إلى دور Azure RBAC المضمن في Storage Blob Data Reader أو أعلى.

// TODO: Replace <storage-account-name> with the name of your storage account
string accountName = "<storage-account-name>";

BlobServiceClient client = new(
        new Uri($"https://{accountName}.blob.core.windows.net"),
        new DefaultAzureCredential());

يتم تمرير كائن العميل كمعلمة إلى بعض الطرق الموضحة في هذه المقالة.

قراءة السجلات في موجز التغيير

إشعار

موجز التغيير هو كيان غير قابل للتغيير، ومخصص للقراءة فقط في حساب التخزين الخاص بك. يمكن لأي عدد من التطبيقات قراءة ومعالجة موجز التغيير في وقت واحد وبشكل مستقل في الوقت المناسب بما يلائمها. لا تُزال السجلات من موجز التغيير عندما يقرؤها أحد التطبيقات. تكون حالة القراءة أو التكرار لكل قارئ مستهلك مستقلة وتُحفَظ من خلال تطبيقك فقط.

يتكرر مثال التعليمات البرمجية التالي عبر جميع السجلات في موجز التغيير، ويضيفها إلى قائمة، ثم يرجع قائمة أحداث موجز التغيير:

public async Task<List<BlobChangeFeedEvent>> ChangeFeedAsync(BlobServiceClient client)
{
    // Create a new BlobChangeFeedClient
    BlobChangeFeedClient changeFeedClient = client.GetChangeFeedClient();

    List<BlobChangeFeedEvent> changeFeedEvents = [];

    // Get all the events in the change feed
    await foreach (BlobChangeFeedEvent changeFeedEvent in changeFeedClient.GetChangesAsync())
    {
        changeFeedEvents.Add(changeFeedEvent);
    }

    return changeFeedEvents;
}

يطبع مثال التعليمات البرمجية التالي بعض القيم من قائمة أحداث موجز التغيير:

public void showEventData(List<BlobChangeFeedEvent> changeFeedEvents)
{
    foreach (BlobChangeFeedEvent changeFeedEvent in changeFeedEvents)
    {
        string subject = changeFeedEvent.Subject;
        string eventType = changeFeedEvent.EventType.ToString();
        BlobOperationName operationName = changeFeedEvent.EventData.BlobOperationName;

        Console.WriteLine("Subject: " + subject + "\n" +
        "Event Type: " + eventType + "\n" +
        "Operation: " + operationName.ToString());
    }
}

استئناف قراءة السجلات من صفحة محفوظة

يمكنك اختيار حفظ آخر صفحة تمت قراءتها في موجز التغييرات، ثم استئناف التكرار من خلال السجلات في وقت لاحق. يمكنك حفظ صفحة القراءة عن طريق الحصول على مؤشر موجز التغيير. المؤشر عبارة عن سلسلة ويمكن للتطبيق الخاص بك حفظ هذه السلسلة بأي طريقة منطقية لتصميم التطبيق الخاص بك، على سبيل المثال، إلى ملف أو قاعدة بيانات.

يكرر هذا المثال من خلال جميع السجلات في موجز التغييرات، ويضيفها إلى قائمة، ويحفظ المؤشر. تُعاد القائمة والمؤشر إلى المتصل.

public async Task<(string, List<BlobChangeFeedEvent>)> ChangeFeedResumeWithCursorAsync(
    BlobServiceClient client,
    string cursor)
{
    // Get a new change feed client
    BlobChangeFeedClient changeFeedClient = client.GetChangeFeedClient();
    List<BlobChangeFeedEvent> changeFeedEvents = new List<BlobChangeFeedEvent>();

    IAsyncEnumerator<Page<BlobChangeFeedEvent>> enumerator = changeFeedClient
        .GetChangesAsync(continuationToken: cursor)
        .AsPages(pageSizeHint: 10)
        .GetAsyncEnumerator();

    await enumerator.MoveNextAsync();

    foreach (BlobChangeFeedEvent changeFeedEvent in enumerator.Current.Values)
    {

        changeFeedEvents.Add(changeFeedEvent);
    }

    // Update the change feed cursor. The cursor is not required to get each page of events,
    // it's intended to be saved and used to resume iterating at a later date.
    cursor = enumerator.Current.ContinuationToken;
    return (cursor, changeFeedEvents);
}

دفق معالجة السجلات

يمكنك اختيار معالجة سجلات موجز التغيير أثناء الالتزام بموجز التغيير. راجع المواصفات. تُنشَر أحداث التغيير في موجز التغيير في فترة 60 ثانية في المتوسط. نوصي بإجراء استطلاع للتغييرات الجديدة مع وضع هذه الفترة في الاعتبار عِند تحديد الفاصل الزمني للاستطلاع.

يستقصي هذا المثال استطلاعات رأي دورية للتغييرات. في حال وجود سجلات التغيير، تعالج هذه التعليمة البرمجية هذه السجلات وتحفظ مؤشر موجز التغيير. وبهذه الطريقة إذا تم إيقاف العملية ثم بدء تشغيلها مرة أخرى، يُمكن للتطبيق استخدام المؤشر لاستئناف معالجة السجلات من حيث توقفت آخر مرة. يحفظ هذا المثال المؤشر إلى ملف محلي لأغراض العرض التوضيحي، ولكن يمكن للتطبيق الخاص بك حفظه بأي شكل منطقي للسيناريو الخاص بك.

public async Task ChangeFeedStreamAsync(
    BlobServiceClient client,
    int waitTimeMs,
    string cursor)
{
    // Get a new change feed client
    BlobChangeFeedClient changeFeedClient = client.GetChangeFeedClient();

    while (true)
    {
        IAsyncEnumerator<Page<BlobChangeFeedEvent>> enumerator = changeFeedClient
        .GetChangesAsync(continuationToken: cursor).AsPages().GetAsyncEnumerator();

        while (true)
        {
            var result = await enumerator.MoveNextAsync();

            if (result)
            {
                foreach (BlobChangeFeedEvent changeFeedEvent in enumerator.Current.Values)
                {
                    string subject = changeFeedEvent.Subject;
                    string eventType = changeFeedEvent.EventType.ToString();
                    BlobOperationName operationName = changeFeedEvent.EventData.BlobOperationName;

                    Console.WriteLine("Subject: " + subject + "\n" +
                        "Event Type: " + eventType + "\n" +
                        "Operation: " + operationName.ToString());
                }

                // Helper method to save cursor
                SaveCursor(enumerator.Current.ContinuationToken);
            }
            else
            {
                break;
            }

        }
        await Task.Delay(waitTimeMs);
    }
}

void SaveCursor(string cursor)
{
    // Specify the path to the file where you want to save the cursor
    string filePath = "path/to/cursor.txt";

    // Write the cursor value to the file
    File.WriteAllText(filePath, cursor);
}

قراءة السجلات ضمن نطاق زمني محدد

يمكنك قراءة السجلات التي تقع ضمن نطاق زمني مُحدد. يتكرر هذا المثال عبر كافة السجلات في موجز التغيير الذي يقع ضمن تاريخ ونطاق زمني محددين، ويضيفها إلى قائمة، ويعيد القائمة:

async Task<List<BlobChangeFeedEvent>> ChangeFeedBetweenDatesAsync(BlobServiceClient client)
{
    // Get a new change feed client
    BlobChangeFeedClient changeFeedClient = client.GetChangeFeedClient();
    List<BlobChangeFeedEvent> changeFeedEvents = new List<BlobChangeFeedEvent>();

    // Create the start and end time.  The change feed client will round start time down to
    // the nearest hour, and round endTime up to the next hour if you provide DateTimeOffsets
    // with minutes and seconds.
    DateTimeOffset startTime = new DateTimeOffset(2024, 3, 1, 0, 0, 0, TimeSpan.Zero);
    DateTimeOffset endTime = new DateTimeOffset(2024, 6, 1, 0, 0, 0, TimeSpan.Zero);

    // You can also provide just a start or end time.
    await foreach (BlobChangeFeedEvent changeFeedEvent in changeFeedClient.GetChangesAsync(
        start: startTime,
        end: endTime))
    {
        changeFeedEvents.Add(changeFeedEvent);
    }

    return changeFeedEvents;
}

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

الخطوات التالية