البرنامج التعليمي: تحديث المخزون باستخدام مدخل Azure والموضوعات / الاشتراكات

ناقل خدمة Azure عبارة عن خدمة مراسلة سحابية متعددة المستأجرين ترسل معلومات بين التطبيقات والخدمات. تمنحك العمليات غير المتزامنة رسائل مرنة ومتوافقة مع الوسيط، جنبًا إلى جنب مع إمكانيات النشر / الاشتراك المنظمة لمن يدخل أولاً، ويخرج أولاً (FIFO). للحصول على نظرة عامة مفصلة على ناقل خدمة Azure، راجع ما هو ناقل خدمة Azure؟.

يوضح هذا البرنامج التعليمي كيفية استخدام مواضيع واشتراكات ناقل الخدمة في سيناريو مخزون البيع بالتجزئة، مع نشر/اشتراك القنوات باستخدام مدخل Azure و .NET. مثال على هذا السيناريو هو تحديث فرز المخزون لمتاجر البيع بالتجزئة متعددة. في هذا السيناريو، يحصل كل مخزن أو مجموعة من المتاجر على رسائل مخصصة لهم لتحديث عمليات الفرز الخاصة بهم. يوضح هذا البرنامج التعليمي كيفية تنفيذ هذا السيناريو باستخدام الاشتراكات والفلاتر. أولاً، يمكنك إنشاء موضوع مع ثلاثة اشتراكات، وإضافة بعض القواعد وعوامل التصفية، ثم إرسال الرسائل واستقبالها من الموضوع والاشتراكات.

Image showing a sender, a topic with three subscriptions, and three receivers.

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إنشاء موضوع ناقل خدمة Azure وثلاثة اشتراكات لهذا الموضوع باستخدام مدخل Azure
  • إضافة عوامل التصفية للاشتراكات باستخدام تعليمة .NET برمجية
  • إنشاء رسائل بمحتوى مختلف
  • إرسال الرسائل والتحقق من وصولها في الاشتراكات المتوقعة
  • تلقي رسائل من اشتراكات

المتطلبات الأساسية

لإكمال هذا البرنامج التعليمي، تأكد من أن لديك ما يلي:

  • اشتراك Azure. لاستخدام خدمات Azure، بما في ذلك Azure Service Bus، تحتاج إلى اشتراك. في حالة عدم الاشتراك في Azure، يمكن إنشاءfree account قبل البدء.
  • Visual Studio 2019 أو أحدث.

موضوعات واشتراكات Service Bus

يمكن لكل subscription to a topic استقبال نسخة من كل رسالة. تُعد الموضوعات ممتثلة للبروتوكول بشكل كامل ومتناسقة دلاليًا مع قوائم ناقل خدمة. تُدعم موضوعات ناقل خدمة مجموعة واسعة من قواعد التحديد إضافة إلى شروط التصفية، مع إجراءات اختيارية تقوم بتعيين خصائص الرسالة أو تعديلها. في كل مرة يحدث تطابق لقاعدة ما، تُنتج رسالة. يرجى النقر علىlink التالي للمزيد حول القواعد وعوامل التصفية والأفعال.

إنشاء مساحة اسم في مدخل Microsoft Azure

لبدء استخدام الكيانات المراسلة "ناقل الخدمة" في Azure، يجب أولاً إنشاء مساحة اسم باسم مميز عبر Azure. توفر مساحة الاسم حاوية تحديد النطاق لموارد ناقل خدمة Microsoft Azure (قوائم الانتظار والموضوعات وما إلى ذلك) داخل التطبيق الخاص بك.

لإنشاء مساحة اسم:

  1. قم بتسجيل الدخول إلى بوابة Azure.

  2. انتقل إلى صفحة جميع الخدمات.

  3. في شريط التنقل الأيسر، حدد Integration من قائمة الفئات، وقم بتمرير الماوس فوق ناقل خدمة Microsoft Azure، ثم حدد + الزر على لوحة Service Bus.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. في علامة التبويب "Basics" في صفحة "Create namespace" اتبع الخطوات الآتية:

    1. بالنسبة إلى Subscription، اختر اشتراك Azure لإنشاء مساحة الاسم.

    2. بالنسبة إلى "Resource group"، اختر مجموعة موارد موجودة حيث توجد مساحة الاسم، أو قم بإنشاء مجموعة موارد جديدة.

    3. أدخل name لمساحة الاسم. يجب أن يلتزم اسم مساحة الاسم باصطلاحات التسمية التالية:

      • يجب أن يكون الاسم فريدًا عبر Azure. يتحقق النظام على الفور لمعرفة ما إذا كان الاسم متوفرًا.
      • ألا يقل طول الاسم عن 6 أحرف ولا يزيد عن 50 حرفاً.
      • لا يمكن أن يحتوي الاسم إلا على أحرف وأرقام وواصلات "-".
      • يجب أن يبدأ الاسم وينتهي بحرف أو رقم.
      • ألا ينتهي الاسم بـ "-sb" أو "-mgmt".
    4. بالنسبة إلى "Location"، اختر المنطقة التي ينبغي استضافة مساحة الاسم فيها.

    5. بالنسبة إلى "Pricing tier"، حدد مستوى التسعير (Basic أو Standard أو Premium) لمساحة الاسم. بالنسبة لهذا التشغيل السريع، حدد Standard.

      هام

      وإذا كنت ترغب في استخدام الموضوعات والاشتراكات، فاختر إما "Standard" أو "Premium". فإن الموضوعات/الاشتراكات غير مدعومة في مستوى التسعير الأساسي.

      وإذا حددت مستوى التسعير "Premium"، فحدد عدد وحدات المراسلة. ويوفر المستوى المميز عزل الموارد على مستوى وحدة المعالجة المركزية والذاكرة بحيث يتم تشغيل كل حمل عمل على حدة. تسمى حاوية المورد هذه وحدة المراسلة. وتحتوي مساحة الاسم المميزة على وحدة مراسلة واحدة على الأقل. ويمكنك تحديد وحدات المراسلة 1 أو 2 أو 4 أو 8 أو 16 لكل مساحة اسم مميزة لناقل خدمة Azure. ولمزيد من المعلومات، راجع المراسلة المميزة لناقل خدمة Microsoft Azure.

    6. حدد مراجعة + إنشاء عند أسفل الصفحة.

      Image showing the Create a namespace page

    7. في صفحة "Review + create"، راجع الإعدادات ثم حدد "Create".

  5. بمجرد نجاح نشر المورد، حدد Go to resource في صفحة التوزيع.

    Image showing the deployment succeeded page with the Go to resource link.

  6. راجع الصفحة الرئيسية لمساحة اسم ناقل الخدمة.

    Image showing the home page of the Service Bus namespace created.

الحصول على سلسلة الاتصال إلى مساحة الاسم (مدخل Microsoft Azure)

يؤدي إنشاء مساحة اسم جديدة تلقائيًّا إلى إنشاء قاعدة توقيع الوصول المشترك (SAS) الأولية مع زوج مقترن من المفاتيح الأساسية والثانوية التي يمنح كلٌّ منها التحكم الكامل على جميع جوانب مساحة الاسم. راجع المصادقة والتخويل لناقل خدمة Microsoft Azure للحصول على معلومات حول كيفية إنشاء قواعد ذات حقوق أكثر تقييداً للجهات المرسلة والمستقبلة.

يمكن للعميل استخدام سلسلة الاتصال للاتصال بمساحة اسم ناقل الخدمة. ولنسخ سلسة الاتصال الأساسية لمساحة الاسم، اتبع الخطوات الآتية:

  1. في صفحة Service Bus Namespace، حددShared access policies في القائمة اليسرى.

  2. في إطارShared access policies، حدد RootManageSharedAccessKey.

  3. في النافذة النهج: RootManageSharedAccessKey، انقر فوق زر النسخ بجوار سلسلة الاتصال الأساسية، وهذا لنسخ سلسلة الاتصال إلى الحافظة لاستخدامها لاحقاً. وقم بلصق هذه القيمة في المفكرة أو بعض المواقع المؤقتة الأخرى.

    Screenshot shows an S A S policy called RootManageSharedAccessKey, which includes keys and connection strings.

    يمكنك استخدام هذه الصفحة لنسخ المفتاح الأساسي والمفتاح الثانوي وسلسلة الاتصال الأساسية وسلسلة الاتصال الثانوية.

إنشاء موضوع باستخدام مدخل Azure

  1. في صفحة ناقل خدمة Service Bus وحددالموضوعاتفي القائمة اليسرى.

  2. اخترحفظ في شريط الأدوات.

  3. أدخل اسمالموضوع. اترك الخيارات الأخرى بقيمها الافتراضية.

  4. حدد إنشاء.

    Screenshot of the Create topic page.

إنشاء اشتراكات للموضوع

  1. حدد الموضوعالذي أنشأته في القسم السابق.

    Screenshot of the Topics page with your topic selected.

  2. في صفحةموضوع ناقل خدمة Service Bus حدد الاشتراكات من القائمة اليمنى، ثم حدد + اشتراك على شريط الأدوات.

    Screenshot of the Subscriptions page with the Add subscription button selected.

  3. في صفحة Create subscription، اتبع الخطوات التالية:

    1. أدخل S1لاسم الاشتراك.

    2. ثم حدد Createلإنشاء الاشتراك.

      Screenshot of the Create subscription page.

  4. كرر الخطوة السابقة مرتين لإنشاء اشتراكات باسم S2 وS3.

إنشاء قواعد تصفية على الاشتراكات

بعد توفير مساحة الاسم والموضوع/الاشتراكات، ولديك سلسلة الاتصال إلى مساحة الاسم، تصبح جاهزا لإنشاء قواعد التصفية على الاشتراكات، ثم إرسال الرسائل وتلقيها. يمكنك فحص التعليمات البرمجية في هذا المجلد نموذج GitHub.

إرسال رسائل وتلقيها

لتشغيل التعليمة البرمجية، اتبع الخطوات التالية:

  1. في موجه الأوامر أو موجه PowerShell، استنسخ مستودع Service Bus GitHub بإصدار الأمر التالي:

    git clone https://github.com/Azure/azure-service-bus.git
    
  2. انتقل إلى مجلد العينةazure-service-bus\samples\DotNet\Azure.Messaging.ServiceBus\BasicSendReceiveTutorialWithFilters.

  3. احصل على سلسلة الاتصال التي نسختها إلى المفكرة سابقا في هذا البرنامج التعليمي. تحتاج أيضًا إلى اسم الموضوع الذي أنشأته في القسم السابق.

  4. في موجه الأوامر، اكتب الأمر التالي:

    dotnet build
    
  5. انتقل إلى مجلد BasicSendReceiveTutorialWithFilters\bin\Debug\netcoreapp3.1.

  6. اكتب الأمر التالي لتشغيل البرنامج. تأكد من استبدال myConnectionString القيمة التي تم الحصول عليها مسبقًا، واسم myTopicName الموضوع الذي قمت بإنشائه:

    dotnet --roll-forward Major BasicSendReceiveTutorialWithFilters.dll -ConnectionString "myConnectionString" -TopicName "myTopicName"
    
  7. اتبع التعليمات الموجودة في وحدة التحكم لتحديد إنشاء الفلتر أولاً. جزء من إنشاء عوامل التصفية هو إزالة عوامل التصفية الافتراضية. عندما تستخدم PowerShell أو CLI، لا تحتاج إلى إزالة عامل التصفية الافتراضي، ولكن إذا قمت بذلك في التعليمات البرمجية، يجب عليك إزالتها. تساعدك أوامر وحدة التحكم 1 و3 في إدارة عوامل التصفية في الاشتراكات التي قمت بإنشائها مسبقًا:

    • تنفيذ 1: لإزالة المرشحات الافتراضية.

    • تنفيذ 2: لإضافة عوامل التصفية الخاصة بك.

    • تنفيذ 3: تخطي هذه الخطوة من أجل البرنامج التعليمي. يزيل هذا الخيار عوامل التصفية لديك. لن يؤدي إلى إعادة إنشاء عوامل التصفية الافتراضية.

      Showing output of 2

  8. بعد إنشاء الفلتر، يمكنك إرسال الرسائل. اضغط 4 ولاحظ 10 رسائل يتم إرسالها للموضوع:

    Send output

  9. اضغط 5 ولاحظ الرسائل التي يتم استلامها. إذا لم تحصل على 10 رسائل، فاضغط على "m" لعرض القائمة، ثم اضغط على 5 مرة أخرى.

    Receive output

تنظيف الموارد

اتبع هذه الخطوات لتنظيف الموارد عند عدم الحاجة إليها.

  1. انتقل إلى مجموعة الموارد في مدخل Azure.
  2. في الصفحة مساحة اسم ناقل خدمة Azure، حدد حذف من شريط الأوامر لحذف مساحة الاسم والموارد (قوائم الانتظار والموضوعات والاشتراكات) فيه.

افهم نموذج التعليمات البرمجية

يحتوي هذا القسم على ما يزيد من التفاصيل حول ما يفعله نموذج التعليمات البرمجية.

الحصول على سلسلة الاتصال والموضوع

أولاً، التعليمات البرمجية بتعريف مجموعة من المتغيرات التي تدفع تنفيذ المتبقية من البرنامج.

string ServiceBusConnectionString;
string TopicName;

static string[] Subscriptions = { "S1", "S2", "S3" };
static IDictionary<string, string[]> SubscriptionFilters = new Dictionary<string, string[]> {
    { "S1", new[] { "StoreId IN('Store1', 'Store2', 'Store3')", "StoreId = 'Store4'"} },
    { "S2", new[] { "sys.To IN ('Store5','Store6','Store7') OR StoreId = 'Store8'" } },
    { "S3", new[] { "sys.To NOT IN ('Store1','Store2','Store3','Store4','Store5','Store6','Store7','Store8') OR StoreId NOT IN ('Store1','Store2','Store3','Store4','Store5','Store6','Store7','Store8')" } }
};
// You can have only have one action per rule and this sample code supports only one action for the first filter, which is used to create the first rule. 
static IDictionary<string, string> SubscriptionAction = new Dictionary<string, string> {
    { "S1", "" },
    { "S2", "" },
    { "S3", "SET sys.Label = 'SalesEvent'"  }
};
static string[] Store = { "Store1", "Store2", "Store3", "Store4", "Store5", "Store6", "Store7", "Store8", "Store9", "Store10" };
static string SysField = "sys.To";
static string CustomField = "StoreId";
static int NrOfMessagesPerStore = 1; // Send at least 1.

يتم تمرير سلسلة الاتصال واسم الموضوع عبر معلمات سطر الأوامر كما هو موضح، ثم تتم قراءتهما في Main()الطريقة:

static void Main(string[] args)
{
    string ServiceBusConnectionString = "";
    string TopicName = "";

    for (int i = 0; i < args.Length; i++)
    {
        if (args[i] == "-ConnectionString")
        {
            Console.WriteLine($"ConnectionString: {args[i + 1]}");
            ServiceBusConnectionString = args[i + 1]; // Alternatively enter your connection string here.
        }
        else if (args[i] == "-TopicName")
        {
            Console.WriteLine($"TopicName: {args[i + 1]}");
            TopicName = args[i + 1]; // Alternatively enter your queue name here.
        }
    }

    if (ServiceBusConnectionString != "" && TopicName != "")
    {
        Program P = StartProgram(ServiceBusConnectionString, TopicName);
        P.PresentMenu().GetAwaiter().GetResult();
    }
    else
    {
        Console.WriteLine("Specify -Connectionstring and -TopicName to execute the example.");
        Console.ReadKey();
    }
}

إزالة عوامل التصفية الافتراضية

عند إنشاء اشتراك، تنشئ Service Bus عامل تصفية افتراضي لكل اشتراك. يتيح هذا الفلتر استلام كل رسالة يتم إرسالها إلى الموضوع. إذا كنت ترغب في استخدام عوامل تصفية مخصصة، يمكنك إزالة عامل التصفية الافتراضي، كما هو موضح في التعليمات البرمجية التالية:

private async Task RemoveDefaultFilters()
{
    Console.WriteLine($"Starting to remove default filters.");

    try
    {
        var client = new ServiceBusAdministrationClient(ServiceBusConnectionString);
        foreach (var subscription in Subscriptions)
        {
            await client.DeleteRuleAsync(TopicName, subscription, CreateRuleOptions.DefaultRuleName);
            Console.WriteLine($"Default filter for {subscription} has been removed.");
        }

        Console.WriteLine("All default Rules have been removed.\n");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    await PresentMenu();
}

إنشاء عوامل تصفية

التعليمات البرمجية التالية يضيف عوامل التصفية المخصصة المعرفة في هذا البرنامج التعليمي:

private async Task CreateCustomFilters()
{
    try
    {
        for (int i = 0; i < Subscriptions.Length; i++)
        {
            var client = new ServiceBusAdministrationClient(ServiceBusConnectionString);
            string[] filters = SubscriptionFilters[Subscriptions[i]];
            if (filters[0] != "")
            {
                int count = 0;
                foreach (var myFilter in filters)
                {
                    count++;

                    string action = SubscriptionAction[Subscriptions[i]];
                    if (action != "")
                    {
                        await client.CreateRuleAsync(TopicName, Subscriptions[i], new CreateRuleOptions
                        {
                            Filter = new SqlRuleFilter(myFilter),
                            Action = new SqlRuleAction(action),
                            Name = $"MyRule{count}"
                        });
                    }
                    else
                    {
                        await client.CreateRuleAsync(TopicName, Subscriptions[i], new CreateRuleOptions
                        {
                            Filter = new SqlRuleFilter(myFilter),
                            Name = $"MyRule{count}"
                        });
                    }
                }
            }

            Console.WriteLine($"Filters and actions for {Subscriptions[i]} have been created.");
        }

        Console.WriteLine("All filters and actions have been created.\n");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    await PresentMenu();
}

إزالة عوامل التصفية المخصصة التي تم إنشاؤها

إذا كنت ترغب في إزالة كافة عوامل التصفية على الاشتراك الخاص بك، فإن التعليمات البرمجية التالية توضح كيفية القيام بذلك:

private async Task CleanUpCustomFilters()
{
    foreach (var subscription in Subscriptions)
    {
        try
        {
            var client = new ServiceBusAdministrationClient(ServiceBusConnectionString);
            IAsyncEnumerator<RuleProperties> rules = client.GetRulesAsync(TopicName, subscription).GetAsyncEnumerator();
            while (await rules.MoveNextAsync())
            {
                await client.DeleteRuleAsync(TopicName, subscription, rules.Current.Name);
                Console.WriteLine($"Rule {rules.Current.Name} has been removed.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    Console.WriteLine("All default filters have been removed.\n");

    await PresentMenu();
}

إرسال رسائل

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

public async Task SendMessages()
{
    try
    {
        await using var client = new ServiceBusClient(ServiceBusConnectionString);
        var taskList = new List<Task>();
        for (int i = 0; i < Store.Length; i++)
        {
            taskList.Add(SendItems(client, Store[i]));
        }

        await Task.WhenAll(taskList);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    Console.WriteLine("\nAll messages sent.\n");
}

private async Task SendItems(ServiceBusClient client, string store)
{
    // create the sender
    ServiceBusSender tc = client.CreateSender(TopicName);

    for (int i = 0; i < NrOfMessagesPerStore; i++)
    {
        Random r = new Random();
        Item item = new Item(r.Next(5), r.Next(5), r.Next(5));

        // Note the extension class which is serializing an deserializing messages
        ServiceBusMessage message = item.AsMessage();
        message.To = store;
        message.ApplicationProperties.Add("StoreId", store);
        message.ApplicationProperties.Add("Price", item.GetPrice().ToString());
        message.ApplicationProperties.Add("Color", item.GetColor());
        message.ApplicationProperties.Add("Category", item.GetItemCategory());

        await tc.SendMessageAsync(message);
        Console.WriteLine($"Sent item to Store {store}. Price={item.GetPrice()}, Color={item.GetColor()}, Category={item.GetItemCategory()}"); ;
    }
}

تلقي الرسائل

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

public async Task Receive()
{
    var taskList = new List<Task>();
    for (var i = 0; i < Subscriptions.Length; i++)
    {
        taskList.Add(this.ReceiveMessages(Subscriptions[i]));
    }

    await Task.WhenAll(taskList);
}

private async Task ReceiveMessages(string subscription)
{
    await using var client = new ServiceBusClient(ServiceBusConnectionString);
    ServiceBusReceiver receiver = client.CreateReceiver(TopicName, subscription);

    // In reality you would not break out of the loop like in this example but would keep looping. The receiver keeps the connection open
    // to the broker for the specified amount of seconds and the broker returns messages as soon as they arrive. The client then initiates
    // a new connection. So in reality you would not want to break out of the loop. 
    // Also note that the code shows how to batch receive, which you would do for performance reasons. For convenience you can also always
    // use the regular receive pump which we show in our Quick Start and in other GitHub samples.
    while (true)
    {
        try
        {
            //IList<Message> messages = await receiver.ReceiveAsync(10, TimeSpan.FromSeconds(2));
            // Note the extension class which is serializing an deserializing messages and testing messages is null or 0.
            // If you think you did not receive all messages, just press M and receive again via the menu.
            IReadOnlyList<ServiceBusReceivedMessage> messages = await receiver.ReceiveMessagesAsync(maxMessages: 100);

            if (messages.Any())
            {
                foreach (ServiceBusReceivedMessage message in messages)
                {
                    lock (Console.Out)
                    {
                        Item item = message.As<Item>();
                        IReadOnlyDictionary<string, object> myApplicationProperties = message.ApplicationProperties;
                        Console.WriteLine($"StoreId={myApplicationProperties["StoreId"]}");
                        if (message.Subject != null)
                        {
                            Console.WriteLine($"Subject={message.Subject}");
                        }
                        Console.WriteLine(
                            $"Item data: Price={item.GetPrice()}, Color={item.GetColor()}, Category={item.GetItemCategory()}");
                    }

                    await receiver.CompleteMessageAsync(message);
                }
            }
            else
            {
                break;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

إشعار

يمكنك إدارة موارد ناقل خدمة Azure باستخدام مستكشف ناقل الخدمة هذه. يسمح The Service Bus Explorer للمستخدمين بالاتصال بمساحة اسم Service Bus وإدارة الكيانات المراسلة بطريقة سهلة. توفر الأداة ميزات متقدمة مثل وظيفة الاستيراد والتصدير أو القدرة على اختبار الموضوع وقوائم الانتظار والاشتراكات وخدمات الترحيل ومراكز الإعلام ومراكز الأحداث.

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

في هذا البرنامج التعليمي، قمت بتوفير الموارد باستخدام مدخل Azure، ثم قمت بإرسال واستلام الرسائل من موضوع ناقل الخدمة واشتراكاته. لقد تعرفت على كيفية:

  • أنشئ موضوع Service Bus واشتراكًا واحدًا أو أكثر لهذا الموضوع باستخدام مدخل Azure
  • إضافة عوامل تصفية الموضوع باستخدام التعليمات البرمجية .NET
  • إنشاء رسالتين بمحتوى مختلف
  • إرسال الرسائل والتحقق من وصولها في الاشتراكات المتوقعة
  • تلقي رسائل من اشتراكات

لمزيد من الأمثلة على إرسال الرسائل وتلقيها، ابدأ بنماذج Service Bus على GitHub.

تقدم إلى البرنامج التعليمي التالي لمعرفة المزيد حول استخدام إمكانات النشر/الاشتراك في Service Bus.