Training
Module
Uw eerste Orleans-app bouwen met ASP.NET Core 8.0 - Training
Meer informatie over het bouwen van cloudeigen, gedistribueerde apps met Orleans.
Deze browser wordt niet meer ondersteund.
Upgrade naar Microsoft Edge om te profiteren van de nieuwste functies, beveiligingsupdates en technische ondersteuning.
Er zijn situaties waarin een eenvoudig bericht-/antwoordpatroon niet voldoende is en de client asynchrone meldingen moet ontvangen. Een gebruiker kan bijvoorbeeld een melding ontvangen wanneer een nieuw chatbericht is gepubliceerd door een vriend.
Clientobnemers zijn een mechanisme waarmee clients asynchroon kunnen worden geïnformeerd. Waarnemersinterfaces moeten overnemen van IGrainObserver, en alle methoden moeten ofwel void
, Task, Task<TResult>of ValueTask<TResult>ValueTask. Een retourtype void
wordt niet aanbevolen omdat het het gebruik van async void
de implementatie kan stimuleren, wat een gevaarlijk patroon is, omdat dit kan leiden tot crashes van toepassingen als er een uitzondering wordt gegenereerd uit de methode. In plaats daarvan kunt u overwegen de interfacemethode van de waarnemer toe te passen OneWayAttribute voor scenario's met best effort-meldingen. Dit zorgt ervoor dat de ontvanger geen antwoord verzendt voor de aanroep van de methode en de methode onmiddellijk op de oproepsite retourneert, zonder te wachten op een reactie van de waarnemer. Een graan roept een methode aan op een waarnemer door deze aan te roepen zoals elke graaninterfacemethode. De Orleans runtime zorgt voor de levering van aanvragen en antwoorden. Een veelvoorkomend gebruiksvoorbeeld voor waarnemers is het inschakelen van een client om meldingen te ontvangen wanneer een gebeurtenis plaatsvindt in de Orleans toepassing. Een graan dat dergelijke meldingen publiceert, moet een API bieden om waarnemers toe te voegen of te verwijderen. Daarnaast is het meestal handig om een methode beschikbaar te maken waarmee een bestaand abonnement kan worden geannuleerd.
Graanontwikkelaars kunnen een hulpprogrammaklasse gebruiken, bijvoorbeeld ObserverManager<TObserver> om de ontwikkeling van waargenomen graantypen te vereenvoudigen. In tegenstelling tot korrels, die na een fout automatisch opnieuw worden geactiveerd, zijn clients niet fouttolerant: een client die mislukt, kan nooit worden hersteld.
Daarom verwijdert het ObserverManager<T>
hulpprogramma abonnementen na een geconfigureerde duur. Clients die actief zijn, moeten zich opnieuw abonneren op een timer om hun abonnement actief te houden.
Als u zich wilt abonneren op een melding, moet de client eerst een lokaal object maken waarmee de waarnemersinterface wordt geïmplementeerd. Vervolgens wordt een methode aangeroepen voor de waarnemersfactory, CreateObjectReference', om het object om te zetten in een korrelverwijzing, die vervolgens kan worden doorgegeven aan de abonnementsmethode voor het waarschuwende graan.
Dit model kan ook door andere korrels worden gebruikt om asynchrone meldingen te ontvangen. Korrels kunnen ook interfaces implementeren IGrainObserver . In tegenstelling tot in het geval van het clientabonnement implementeert het abonneren van graan simpelweg de waarnemersinterface en geeft het een verwijzing naar zichzelf door (bijvoorbeeld this.AsReference<IMyGrainObserverInterface>()
). Het is niet nodig CreateObjectReference()
omdat korrels al adresseerbaar zijn.
Stel dat we een graan hebben dat periodiek berichten naar clients verzendt. Ter vereenvoudiging is het bericht in ons voorbeeld een tekenreeks. Eerst definiëren we de interface op de client die het bericht ontvangt.
De interface ziet er als volgt uit
public interface IChat : IGrainObserver
{
Task ReceiveMessage(string message);
}
Het enige speciale is dat de interface moet overnemen van IGrainObserver
.
Nu moet elke client die deze berichten wil observeren, een klasse implementeren die wordt geïmplementeerd IChat
.
De eenvoudigste zaak zou er ongeveer als volgt uitzien:
public class Chat : IChat
{
public Task ReceiveMessage(string message)
{
Console.WriteLine(message);
return Task.CompletedTask;
}
}
Op de server moeten we nu een grain hebben waarmee deze chatberichten naar clients worden verzonden. De Grain moet ook een mechanisme hebben voor clients om zich te abonneren en zich af te melden voor meldingen. Voor abonnementen kan het graan een exemplaar van de hulpprogrammaklasse ObserverManager<TObserver>gebruiken.
Notitie
ObserverManager<TObserver> maakt deel uit van Orleans versie 7.0. Voor oudere versies kan de volgende implementatie worden gekopieerd.
class HelloGrain : Grain, IHello
{
private readonly ObserverManager<IChat> _subsManager;
public HelloGrain(ILogger<HelloGrain> logger)
{
_subsManager =
new ObserverManager<IChat>(
TimeSpan.FromMinutes(5), logger);
}
// Clients call this to subscribe.
public Task Subscribe(IChat observer)
{
_subsManager.Subscribe(observer, observer);
return Task.CompletedTask;
}
//Clients use this to unsubscribe and no longer receive messages.
public Task UnSubscribe(IChat observer)
{
_subsManager.Unsubscribe(observer);
return Task.CompletedTask;
}
}
Als u een bericht naar clients wilt verzenden, kan de Notify
methode van het ObserverManager<IChat>
exemplaar worden gebruikt. De methode maakt gebruik van een Action<T>
methode of lambda-expressie (waarbij T
het type IChat
hier is). U kunt elke methode op de interface aanroepen om deze naar clients te verzenden. In ons geval hebben we slechts één methode, ReceiveMessage
en de verzendende code op de server ziet er als volgt uit:
public Task SendUpdateMessage(string message)
{
_subsManager.Notify(s => s.ReceiveMessage(message));
return Task.CompletedTask;
}
Onze server heeft nu een methode voor het verzenden van berichten naar waarnemersclients, twee methoden voor abonneren/afmelden en de client heeft een klasse geïmplementeerd die de graanberichten kan observeren. De laatste stap is het maken van een waarnemersreferentie voor de client met behulp van onze eerder geïmplementeerde Chat
klasse en het ontvangen van de berichten nadat u zich hebt geabonneerd.
De code ziet er als volgt uit:
//First create the grain reference
var friend = _grainFactory.GetGrain<IHello>(0);
Chat c = new Chat();
//Create a reference for chat, usable for subscribing to the observable grain.
var obj = _grainFactory.CreateObjectReference<IChat>(c);
//Subscribe the instance to receive messages.
await friend.Subscribe(obj);
Wanneer ons graan op de server de SendUpdateMessage
methode aanroept, ontvangen alle geabonneerde clients het bericht. In onze clientcode ontvangt het Chat
exemplaar in de variabele c
het bericht en voert het uit naar de console.
Belangrijk
Objecten die worden CreateObjectReference
doorgegeven, worden bewaard via een WeakReference<T> en worden daarom afval verzameld als er geen andere verwijzingen bestaan.
Gebruikers moeten een referentie onderhouden voor elke waarnemer die ze niet willen verzamelen.
Notitie
Waarnemers zijn inherent onbetrouwbaar omdat een client die als host fungeert voor een waarnemer, kan mislukken en waarnemers die zijn gemaakt nadat het herstel verschillende (gerandomiseerde) identiteiten heeft. ObserverManager<TObserver> is afhankelijk van periodieke hersubscriptie door waarnemers, zoals hierboven besproken, zodat inactieve waarnemers kunnen worden verwijderd.
Implementaties van IGrainObserver worden geregistreerd via een aanroep naar IGrainFactory.CreateObjectReference en elke aanroep naar die methode maakt een nieuwe verwijzing die naar die implementatie verwijst. Orleans voert aanvragen uit die naar elk van deze verwijzingen worden verzonden, één voor één, tot voltooiing. Waarnemers zijn niet-reentrant en daarom worden gelijktijdige verzoeken aan een waarnemer niet door elkaar gekruist Orleans. Als er meerdere waarnemers zijn die gelijktijdig aanvragen ontvangen, kunnen deze aanvragen parallel worden uitgevoerd. Uitvoering van waarnemersmethoden wordt niet beïnvloed door kenmerken zoals AlwaysInterleaveAttribute of ReentrantAttribute: het uitvoeringsmodel kan niet worden aangepast door een ontwikkelaar.
.NET-feedback
.NET is een open source project. Selecteer een koppeling om feedback te geven:
Training
Module
Uw eerste Orleans-app bouwen met ASP.NET Core 8.0 - Training
Meer informatie over het bouwen van cloudeigen, gedistribueerde apps met Orleans.