Proveedores de flujos de Orleans

Los flujos pueden venir en diferentes formas y maneras. Algunos flujos podrían entregar eventos a través de vínculos TCP directos, mientras que otros entregan eventos a través de colas duraderas. Los diferentes tipos de transmisión pueden usar diferentes estrategias de procesamiento por lotes, algoritmos de almacenamiento en caché o procedimientos de presión inversa. Los proveedores de secuencias son puntos de extensibilidad en el Orleans Streaming Runtime que te permiten implementar cualquier tipo de flujo, evitando que las aplicaciones de streaming se limiten solo a un subconjunto de esas opciones de comportamiento. Este punto de extensibilidad es similar en espíritu a los proveedores de almacenamiento Orleans.

Proveedor de flujos de Azure Event Hub

Azure Event Hubs es un servicio de ingesta de datos en tiempo real totalmente administrado capaz de recibir y procesar millones de eventos por segundo. Está diseñado para controlar la ingesta de datos de alto rendimiento y baja latencia de varios orígenes y el procesamiento posterior de esos datos por varios consumidores.

Event Hubs se usa a menudo como base de una arquitectura de procesamiento de eventos más grande, que actúa como "puerta principal" para una canalización de eventos. Puede usarlo para ingerir datos de varios orígenes, como fuentes de redes sociales, dispositivos IoT y archivos de registro. Una de las principales ventajas de Event Hubs es la capacidad de escalar horizontalmente para satisfacer las necesidades de incluso las cargas de trabajo de procesamiento de eventos más grandes. También es altamente disponible y tolerante a errores, con varias réplicas de datos distribuidas en varias regiones de Azure para garantizar la alta disponibilidad.

El paquete NuGet Microsoft.Orleans.Streaming.EventHubs contiene el proveedor de flujos de Event Hubs.

Proveedor de flujos de Cola de Azure (AQ)

El proveedor de flujos de cola de Azure (AQ) entrega eventos a través de colas de Azure. En el lado productor, el proveedor de flujos de AQ pone en cola los eventos directamente en la cola de Azure. En el lado del consumidor, el proveedor de flujos de AQ administra un conjunto de agentes de extracción que extraen eventos de un conjunto de colas de Azure y los entrega al código de la aplicación que los consume. Los agentes de extracción podrían considerarse un "microservicio" distribuido; es decir, un componente distribuido elástico con particiones y alta disponibilidad. Los agentes de extracción se ejecutan dentro de los mismos silos que hospedan granos de aplicación. Por lo tanto, no es necesario ejecutar roles de trabajo de Azure independientes para extraer de las colas. El entorno de ejecución de streaming de Orleans administra completamente la existencia de los agentes de extracción, su gestión, el control de contrapresión, el equilibrio de las colas entre ellos y la transferencia de colas desde un agente con errores a otro agente. Todo esto es transparente para el código de la aplicación que utiliza flujos.

El paquete NuGet Microsoft.Orleans.Streaming.AzureStorage contiene el proveedor de secuencias de Azure Queue Storage.

Adaptadores de cola

Los distintos proveedores de flujos que entregan eventos a través de colas duraderas muestran un comportamiento similar y están sujetos a implementaciones similares. Por lo tanto, proporcionamos un PersistentStreamProvider genérico y extensible que permite conectar distintos tipos de colas sin tener que escribir un proveedor de flujos completamente nuevo desde cero. PersistentStreamProvider usa un componente IQueueAdapter, que abstrae detalles específicos de implementación de colas y proporciona medios para poner en cola y quitar de cola eventos. La lógica dentro PersistentStreamProvider controla todo lo demás. El proveedor de colas de Azure mencionado anteriormente también se implementa de esta manera: es una instancia de PersistentStreamProvider que usa una AzureQueueAdapter.

integración de .NET Aspire para streaming

.NET Aspire simplifica Orleans configuración de streaming mediante la administración automática del aprovisionamiento y la conexión de recursos.

Azure Queue Storage streaming con Aspire

Proyecto AppHost (Program.cs):

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage");
var queues = storage.AddQueues("streaming");

var orleans = builder.AddOrleans("cluster")
    .WithClustering(builder.AddRedis("redis"))
    .WithStreaming("AzureQueueProvider", queues);

builder.AddProject<Projects.MySilo>("silo")
    .WithReference(orleans)
    .WithReference(queues);

builder.Build().Run();

Proyecto de silo (Program.cs):

var builder = Host.CreateApplicationBuilder(args);

builder.AddServiceDefaults();
builder.AddKeyedAzureQueueServiceClient("streaming");
builder.UseOrleans();

builder.Build().Run();

Sugerencia

Durante el desarrollo local, Aspire usa automáticamente el emulador de Azurite para Azure Queue Storage. En implementaciones de producción, Aspire se conecta a su cuenta real de almacenamiento de Azure según la configuración de implementación de Azure.

Importante

Debe llamar a AddKeyedAzureQueueServiceClient para registrar el cliente de cola en el contenedor de inyección de dependencias. Orleans El proveedor de streaming busca recursos por su nombre de servicio con clave; si se omite este paso, Orleans no podrá resolver el cliente de cola y producirá un error de resolución de dependencias en tiempo de ejecución.

Streaming en memoria para el desarrollo

En escenarios de desarrollo y pruebas locales, puede usar el streaming en memoria que no requiere ninguna dependencia externa:

Proyecto AppHost (Program.cs):

var builder = DistributedApplication.CreateBuilder(args);

var orleans = builder.AddOrleans("cluster")
    .WithDevelopmentClustering()
    .WithMemoryStreaming("MemoryStreamProvider");

builder.AddProject<Projects.MySilo>("silo")
    .WithReference(orleans);

builder.Build().Run();

Proyecto de silo (Program.cs):

var builder = Host.CreateApplicationBuilder(args);

builder.AddServiceDefaults();
builder.UseOrleans();

builder.Build().Run();

Advertencia

Los flujos en memoria no son duraderos y se pierden cuando se reinicia el silo. Use streaming en memoria solo para desarrollo y pruebas, nunca para cargas de trabajo de producción que requieran durabilidad de mensajes.

Canales de difusión con Aspire

Los canales de difusión proporcionan un sencillo mecanismo pub/sub para difundir mensajes a todos los suscriptores:

Proyecto AppHost (Program.cs):

var builder = DistributedApplication.CreateBuilder(args);

var orleans = builder.AddOrleans("cluster")
    .WithDevelopmentClustering()
    .WithBroadcastChannel("BroadcastChannel");

builder.AddProject<Projects.MySilo>("silo")
    .WithReference(orleans);

builder.Build().Run();

Proyecto de silo (Program.cs):

var builder = Host.CreateApplicationBuilder(args);

builder.AddServiceDefaults();
builder.UseOrleans();

builder.Build().Run();

Para obtener documentación completa sobre Orleans y .NET Aspire integración, consulte Orleans y .NET Aspire integration.

Proveedor de flujo de mensajes simple

El proveedor de flujo de mensajes simple, también conocido como proveedor SMS, entrega eventos a través de TCP usando mensajería de grano de Orleans normal. Dado que los eventos de SMS se entregan a través de vínculos TCP no confiables, SMS no garantiza la entrega de eventos confiable y no reenvía automáticamente mensajes con error para secuencias SMS. De forma predeterminada, la llamada del productor a OnNextAsync devuelve un Task, que representa el estado de procesamiento del consumidor del flujo. Esto indica al productor si el consumidor recibió y procesó correctamente el evento. Si se produce un error en esta tarea, el productor puede decidir enviar de nuevo el mismo evento, logrando la confiabilidad en el nivel de aplicación. Aunque la entrega de mensajes de transmisión es el mejor esfuerzo, las secuencias sms son fiables. Es decir, el enlace de suscriptor a productor realizado por Pub-Sub es totalmente confiable.

Consulte también