Delen via


Zelfstudie: voorraad bijwerken met Azure Portal en onderwerpen/abonnementen

Azure Service Bus is een berichtenservice in de cloud met meerdere tenants die informatie tussen toepassingen en diensten verzendt. Asynchrone bewerkingen bieden flexibele, Brokered Messaging, samen met gestructureerde FIFO-berichtenuitwisseling (first in, first out) en mogelijkheden voor publiceren/abonneren. Zie Wat is Service Bus? voor een gedetailleerd overzicht van Azure Service Bus.

In deze zelfstudie leert hoe u onderwerpen en abonnementen van Service Bus kunt gebruiken in een scenario met detailhandelvoorraad, waarbij gebruik wordt gemaakt van kanalen voor publiceren/abonneren met Azure Portal en .NET. Een voorbeeld van dit scenario is het bijwerken van het voorraadassortiment voor meerdere winkels. In dit scenario ontvangt elke winkel of reeks winkels berichten op basis waarvan ze hun assortiment kunnen bijwerken. Deze zelfstudie laat zien hoe dit scenario met behulp van abonnementen en filters kan worden geïmplementeerd. Eerst maakt u een onderwerp met drie abonnementen, voegt u enkele regels en filters toe en verzendt en ontvangt u vervolgens berichten van het onderwerp en abonnementen.

Afbeelding van een afzender, een onderwerp met drie abonnementen en drie ontvangers.

In deze zelfstudie leert u het volgende:

  • Een Service Bus-onderwerp en drie abonnementen voor dat onderwerp maken met behulp van Azure Portal
  • Filters toevoegen voor abonnementen met behulp van .NET-code
  • Berichten maken met verschillende inhoud
  • Berichten verzenden en controleren of ze zijn aangekomen in de verwachte abonnementen
  • Berichten ontvangen van de abonnementen

Vereisten

Het volgende moet zijn geïnstalleerd om deze zelfstudie te voltooien:

  • Azure-abonnement. Als u Azure-services, waaronder Azure Service Bus, wilt gebruiken, hebt u een abonnement nodig. Als u nog geen abonnement op Azure hebt, kunt u een gratis account maken voordat u begint.
  • Visual Studio 2019 of hoger.

Service Bus-onderwerpen en -abonnementen

Elk abonnement op een onderwerp kan een kopie van elk bericht ontvangen. Onderwerpen zijn qua protocol en semantiek volledig compatibel met Service Bus-wachtrijen. Service Bus-onderwerpen ondersteunen een breed scala aan selectieregels met filtervoorwaarden, met optionele acties waarmee berichteigenschappen worden ingesteld of gewijzigd. Telkens wanneer een regel overeenkomt, wordt er een bericht gegenereerd. Volg deze koppeling voor meer informatie over regels, filters en acties.

Een naamruimte in de Azure-portal maken

Als u Service Bus-berichtenentiteiten wilt gebruiken in Azure, moet u eerst een naamruimte maken met een naam die uniek is binnen Azure. Een naamruimte biedt een bereikcontainer voor Service Bus-resources (wachtrijen, onderwerpen, enzovoort) in uw toepassing.

Ga als volgt te werk om een naamruimte te maken:

  1. Meld u aan bij het Azure-portaal.

  2. Navigeer naar de pagina Alle services.

  3. Selecteer integratie in de linkernavigatiebalk in de lijst met categorieën, beweeg de muisaanwijzer over Service Bus en selecteer + vervolgens de knop op de Service Bus-tegel.

    Afbeelding van de selectie van Een resource maken, integratie en vervolgens Service Bus in het menu.

  4. Voer in de tag Basisinformatie van de pagina Naamruimte maken de volgende stappen uit:

    1. Kies voor Abonnement een Azure-abonnement waarin u de naamruimte maakt.

    2. Kies voor Resourcegroep een bestaande resourcegroep waarin de naamruimte moet worden opgenomen of maak een nieuwe resourcegroep.

    3. Voer een naam in voor de naamruimte. De naamruimtenaam moet voldoen aan de volgende naamconventies:

      • De naam moet uniek zijn in Azure. In het systeem wordt onmiddellijk gecontroleerd of de naam beschikbaar is.
      • De naamlengte is ten minste 6 en maximaal 50 tekens.
      • De naam mag alleen letters, cijfers, afbreekstreepjes "-" bevatten.
      • De naam moet beginnen met een letter en eindigen op een letter of cijfer.
      • De naam eindigt niet op '-sb' of '-mgmt'.
    4. Kies voor Locatie de regio waarin uw naamruimte moet worden gehost.

    5. Selecteer voor de prijscategorie de prijscategorie (Basic, Standard of Premium) voor de naamruimte. Voor deze quickstart selecteert u Standard.

      Belangrijk

      Kies Standard of Premium indien u gebruik wilt maken van onderwerpen en abonnementen. Onderwerpen/abonnementen worden niet ondersteund in de prijscategorie Basic.

      Als u de Prijscategorie Premium hebt geselecteerd, geeft u het aantal berichteneenheden op. De Premium-prijscategorie biedt isolatie van resources op het niveau van de CPU en het geheugen, zodat elke workload geïsoleerd wordt uitgevoerd. Deze resourcecontainer wordt een Messaging-eenheid genoemd. Een Premium-naamruimte heeft ten minste één Messaging-eenheid. U kunt 1, 2, 4, 8 of 16 berichteneenheden selecteren voor elke Service Bus Premium-naamruimte. Zie Service Bus Premium Messaging voor meer informatie.

    6. Selecteer Controleren en maken onderaan de pagina.

      Afbeelding van de pagina Een naamruimte maken

    7. Controleer de instellingen op de pagina Beoordelen en maken en selecteer Maken.

  5. Zodra de implementatie van de resource is geslaagd, selecteert u Ga naar de resource op de implementatiepagina.

    Afbeelding van de pagina geslaagde implementatie met de koppeling Ga naar resource.

  6. U ziet de startpagina voor uw Service Bus-naamruimte.

    Afbeelding van de startpagina van de Service Bus-naamruimte die is gemaakt.

Verbindingsreeks naar de naamruimte (Azure Portal)

Als u een nieuwe naamruimte maakt, wordt automatisch een eerste SAS-beleid (Shared Access Signature) gegenereerd met primaire en secundaire sleutels en primaire en secundaire verbindingsreeks s die elk volledige controle over alle aspecten van de naamruimte verlenen. Raadpleeg Service Bus-verificatie en -autorisatie voor meer informatie over het maken van regels met beperktere rechten voor reguliere afzenders en ontvangers.

Een client kan de verbindingsreeks gebruiken om verbinding te maken met de Service Bus-naamruimte. Voer de volgende stappen uit om de primaire verbindingsreeks voor uw naamruimte te kopiëren:

  1. Selecteer op de pagina Service Bus-naamruimte gedeeld toegangsbeleid in het linkermenu.

  2. Selecteer RootManageSharedAccessKey op de pagina Beleid voor gedeelde toegang.

  3. Selecteer in het venster Beleid: RootManageSharedAccessKey de knop Kopiëren naast primaire verbindingsreeks om de verbindingsreeks naar het klembord te kopiëren voor later gebruik. Plak deze waarde in Kladblok of een andere tijdelijke locatie.

    Schermopname toont het S A S-beleid RootManageSharedAccessKey, dat sleutels en verbindingsreeksen omvat.

    U kunt deze pagina gebruiken om de primaire sleutel, secundaire sleutel, primaire verbindingsreeks en secundaire verbindingsreeks te kopiëren.

Een onderwerp maken met de Azure-portal

  1. Selecteer in het linkermenu op de pagina Service Bus-naamruimte de optie Onderwerpen.

  2. Selecteer + Onderwerp op de werkbalk.

  3. Voer een naam in voor het onderwerp. Houd voor de overige opties de standaardwaarden aan.

  4. Selecteer Maken.

    Schermopname van de pagina Onderwerp maken.

Abonnementen op het onderwerp maken

  1. Selecteer het onderwerp dat u in de vorige sectie hebt gemaakt.

    Schermopname van de pagina Onderwerpen met uw onderwerp geselecteerd.

  2. Selecteer in het linkermenu op de pagina Service Bus-onderwerp de optie Abonnementen en vervolgens op de werkbalk + Abonnement.

    Schermopname van de pagina Abonnementen met de knop Abonnement toevoegen geselecteerd.

  3. Voer op de pagina Abonnement maken de volgende stappen uit:

    1. Voer S1 in als naam van het abonnement.

    2. Selecteer vervolgens Maken om het abonnement te maken.

      Schermopname van de pagina Abonnement maken.

  4. Herhaal de vorige stap tweemaal om abonnementen met de naam S2 en S3 te maken.

Filterregels voor abonnementen maken

Nadat de naamruimte en het onderwerp/abonnementen zijn ingericht en u de verbindingsreeks voor de naamruimte hebt, kunt u filterregels voor de abonnementen maken en vervolgens berichten verzenden en ontvangen. U kunt de code in deze GitHub-voorbeeldmap controleren.

Berichten verzenden en ontvangen

Voer de volgende stappen uit om de code uit te voeren:

  1. Ga naar een gewone opdrachtprompt of een opdrachtprompt van PowerShell en kloon de Service Bus GitHub-opslagplaats met behulp van de volgende opdracht:

    git clone https://github.com/Azure/azure-service-bus.git
    
  2. Navigeer naar de voorbeeldmap azure-service-bus\samples\DotNet\Azure.Messaging.ServiceBus\BasicSendReceiveTutorialWithFilters.

  3. Haal de verbindingsreeks op die u eerder in deze zelfstudie naar Kladblok hebt gekopieerd. U hebt ook de naam nodig van het onderwerp dat u in de vorige sectie hebt gemaakt.

  4. Typ de volgende opdracht bij de opdrachtprompt:

    dotnet build
    
  5. Navigeer naar de map BasicSendReceiveTutorialWithFilters\bin\Debug\netcoreapp3.1.

  6. Typ de volgende opdracht om het programma uit te voeren. Vervang myConnectionString door de waarde die u eerder hebt verkregen en vervang myTopicName door de naam van het onderwerp dat u hebt gemaakt:

    dotnet --roll-forward Major BasicSendReceiveTutorialWithFilters.dll -ConnectionString "myConnectionString" -TopicName "myTopicName"
    
  7. Volg de instructies in de console om eerst filters te maken. Een onderdeel van het maken van filters is het verwijderen van de standaardfilters. Wanneer u PowerShell of CLI gebruikt, hoeft u het standaardfilter niet te verwijderen, maar als u dit in code doet, moet u deze verwijderen. De consoleopdrachten 1 en 3 helpen bij het beheren van de filters voor de abonnementen die u eerder hebt gemaakt:

    • Voer 1: uit om de standaardfilters te verwijderen.

    • Voer 2: uit om uw eigen filters toe te voegen.

    • Voer 3 uit: Sla deze stap over voor de zelfstudie. Met deze optie kunt u eventueel uw eigen filters verwijderen. De standaardfilters worden niet opnieuw gemaakt.

      Uitvoer van 2

  8. Nadat de filters zijn gemaakt, kunt u berichten verzenden. Druk op 4 en u ziet dat er 10 berichten naar het onderwerp worden verzonden:

    Verzonden uitvoer

  9. Druk op 5 en u ziet dat er berichten binnenkomen. Als u geen 10 berichten terug hebt ontvangen, drukt u op 'm' om het menu weer te geven en drukt u nogmaals op 5.

    Ontvangen uitvoer

Resources opschonen

Wanneer u deze stappen niet meer nodig hebt, volgt u deze stappen om resources op te schonen.

  1. Navigeer naar uw naamruimte in Azure Portal.
  2. Selecteer op de pagina Service Bus-naamruimte Verwijderen in de opdrachtbalk om de naamruimte en resources (wachtrijen, onderwerpen en abonnementen) erin te verwijderen.

De voorbeeldcode begrijpen

Deze sectie bevat meer informatie over de werking van de voorbeeldcode.

Verbindingsreeks en onderwerp ophalen

De code declareert eerst een set variabelen die de uitvoering van de rest van het programma bepalen.

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.

De verbindingsreeks en de naam van het onderwerp worden via opdrachtregelparameters doorgegeven, zie hieronder, en worden dan gelezen met de methode 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();
    }
}

Standaardfilters verwijderen

Wanneer u een abonnement maakt, maakt Service Bus een standaardfilter per abonnement. Dit filter maakt het mogelijk om elk bericht te ontvangen dat naar het onderwerp wordt verzonden. Als u aangepaste filters wilt gebruiken, kunt u het standaardfilter verwijderen, zoals wordt weergegeven in de volgende code:

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();
}

Filters maken

Met de volgende code worden de aangepaste filters toegevoegd die zijn gedefinieerd in deze zelfstudie:

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();
}

Uw aangepaste filters verwijderen

Als u alle filters uit uw abonnement wilt verwijderen, kunt u in de volgende code zien hoe u dat doet:

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();
}

Berichten verzenden

Het verzenden van berichten naar een onderwerp is vergelijkbaar met het verzenden van berichten naar een wachtrij. Dit voorbeeld laat zien hoe u berichten kunt verzenden met behulp van een takenlijst en asynchrone verwerking:

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()}"); ;
    }
}

Berichten ontvangen

Berichten worden ook ontvangen via een takenlijst en in de code wordt batchverwerking toegepast. U kunt verzenden en ontvangen met behulp van batchverwerking, maar in dit voorbeeld wordt alleen ontvangen gedemonstreerd. In werkelijkheid zou u niet uit de lus breken, maar herhalen en een hogere tijdsduur instellen, zoals één minuut. De ontvangstoproep naar de broker wordt gedurende deze tijd geopend en als berichten binnenkomen, worden ze onmiddellijk geretourneerd en wordt er een nieuwe ontvangstoproep uitgegeven. Dit concept wordt long polling genoemd. Het gebruik van de ontvangstpomp, die u kunt zien in de quickstart en in verschillende andere voorbeelden in de opslagplaats, is een meer typische optie.

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());
        }
    }
}

Notitie

U kunt resources van Service Bus beheren met Service Bus Explorer. Met Service Bus Explorer kunnen gebruikers verbinding maken met een Service Bus-naamruimte en berichtenentiteiten op een eenvoudige manier beheren. Het hulpprogramma biedt geavanceerde functies zoals functionaliteit voor importeren/exporteren of de mogelijkheid van het testen van onderwerpen, wachtrijen, abonnementen, relay-services, Notification Hubs en Event Hubs.

Volgende stappen

In deze zelfstudie hebt u resources ingericht met behulp van Azure Portal en vervolgens berichten verzonden en ontvangen van een Service Bus-onderwerp en de daarbij behorende abonnementen. U hebt geleerd hoe u:

  • Een Service Bus-onderwerp en een of meer abonnementen op dat onderwerp kunt maken met Azure Portal.
  • Onderwerpfilters toevoegen met .NET-code
  • Twee berichten met verschillende inhoud maken
  • De berichten verzenden en controleren of ze zijn ontvangen in de verwachte abonnementen
  • Berichten ontvangen van de abonnementen

Meer voorbeelden voor het verzenden en ontvangen van berichten vindt u in de Service Bus-voorbeelden op GitHub.

Ga naar de volgende zelfstudie voor meer informatie over het gebruik van de mogelijkheden voor publiceren/abonneren van Service Bus.