Migración desde la biblioteca de procesadores de fuente de cambios al SDK de Azure Cosmos DB para .NET V3
SE APLICA A: NoSQL
En este artículo se describen los pasos necesarios para migrar el código de una aplicación existente que usa la biblioteca de procesadores de fuente de cambios a la característica de fuente de cambios en la versión más reciente del SDK de .NET (que también se conoce como el SDK de .NET V3).
Cambios de código necesarios
El SDK de .NET V3 tiene varios cambios importantes; estos son los pasos principales para migrar la aplicación:
- Convierta las instancias de
DocumentCollectionInfo
en referencias deContainer
para los contenedores supervisados y de concesiones. - Las personalizaciones que usan
WithProcessorOptions
se deben actualizar para usarWithLeaseConfiguration
yWithPollInterval
para los intervalos,WithStartTime
para la hora de inicio yWithMaxItems
para definir el número máximo de elementos. - Establezca el
processorName
enGetChangeFeedProcessorBuilder
para que coincida con el valor configurado enChangeFeedProcessorOptions.LeasePrefix
, o bien, puede usarstring.Empty
. - Los cambios ya no se entregan como
IReadOnlyList<Document>
sino que, en su lugar, se trata de unIReadOnlyCollection<T>
dondeT
es un tipo que debe definir. Ya no hay ninguna clase de elemento base. - Para controlar los cambios, ya no necesita una implementación de
IChangeFeedObserver
, sino que debe definir un delegado. El delegado puede ser una función estática o, si necesita mantener el estado entre las ejecuciones, puede crear su propia clase y pasar un método de instancia como delegado.
Por ejemplo, si el código original para compilar el procesador de fuente de cambios tiene el siguiente aspecto:
ChangeFeedProcessorLibrary.DocumentCollectionInfo monitoredCollectionInfo = new ChangeFeedProcessorLibrary.DocumentCollectionInfo()
{
DatabaseName = databaseId,
CollectionName = Program.monitoredContainer,
Uri = new Uri(configuration["EndPointUrl"]),
MasterKey = configuration["AuthorizationKey"]
};
ChangeFeedProcessorLibrary.DocumentCollectionInfo leaseCollectionInfo = new ChangeFeedProcessorLibrary.DocumentCollectionInfo()
{
DatabaseName = databaseId,
CollectionName = Program.leasesContainer,
Uri = new Uri(configuration["EndPointUrl"]),
MasterKey = configuration["AuthorizationKey"]
};
ChangeFeedProcessorLibrary.ChangeFeedProcessorBuilder builder = new ChangeFeedProcessorLibrary.ChangeFeedProcessorBuilder();
var oldChangeFeedProcessor = await builder
.WithHostName("consoleHost")
.WithProcessorOptions(new ChangeFeedProcessorLibrary.ChangeFeedProcessorOptions
{
StartFromBeginning = true,
LeasePrefix = "MyLeasePrefix",
MaxItemCount = 10,
FeedPollDelay = TimeSpan.FromSeconds(1)
})
.WithFeedCollection(monitoredCollectionInfo)
.WithLeaseCollection(leaseCollectionInfo)
.WithObserver<ChangeFeedObserver>()
.BuildAsync();
El código migrado tendrá el siguiente aspecto:
Container leaseContainer = client.GetContainer(databaseId, Program.leasesContainer);
Container monitoredContainer = client.GetContainer(databaseId, Program.monitoredContainer);
ChangeFeedProcessor changeFeedProcessor = monitoredContainer
.GetChangeFeedProcessorBuilder<ToDoItem>("MyLeasePrefix", Program.HandleChangesAsync)
.WithInstanceName("consoleHost")
.WithLeaseContainer(leaseContainer)
.WithMaxItems(10)
.WithPollInterval(TimeSpan.FromSeconds(1))
.WithStartTime(DateTime.MinValue.ToUniversalTime())
.Build();
Para el delegado, puede tener un método estático para recibir los eventos. Si fuera a consumir información de IChangeFeedObserverContext
, puede migrarla para usar ChangeFeedProcessorContext
:
ChangeFeedProcessorContext.LeaseToken
se puede usar en lugar deIChangeFeedObserverContext.PartitionKeyRangeId
ChangeFeedProcessorContext.Headers
se puede usar en lugar deIChangeFeedObserverContext.FeedResponse
ChangeFeedProcessorContext.Diagnostics
contiene información detallada sobre la latencia de solicitud para la solución de problemas
static async Task HandleChangesAsync(ChangeFeedProcessorContext context, IReadOnlyCollection<ToDoItem> changes, CancellationToken cancellationToken)
{
Console.WriteLine($"Started handling changes for lease {context.LeaseToken}...");
Console.WriteLine($"Change Feed request consumed {context.Headers.RequestCharge} RU.");
// SessionToken if needed to enforce Session consistency on another client instance
Console.WriteLine($"SessionToken ${context.Headers.Session}");
// We may want to track any operation's Diagnostics that took longer than some threshold
if (context.Diagnostics.GetClientElapsedTime() > TimeSpan.FromSeconds(1))
{
Console.WriteLine($"Change Feed request took longer than expected. Diagnostics:" + context.Diagnostics.ToString());
}
foreach (ToDoItem item in changes)
{
Console.WriteLine($"\tDetected operation for item with id {item.id}, created at {item.creationTime}.");
// Simulate work
await Task.Delay(1);
}
}
Eventos de mantenimiento y observabilidad
Si anteriormente usaba IHealthMonitor
o aprovechaba IChangeFeedObserver.OpenAsync
y IChangeFeedObserver.CloseAsync
, use la API de notificaciones.
IChangeFeedObserver.OpenAsync
se puede reemplazar porWithLeaseAcquireNotification
.IChangeFeedObserver.CloseAsync
se puede reemplazar porWithLeaseReleaseNotification
.IHealthMonitor.InspectAsync
se puede reemplazar porWithErrorNotification
.
Contenedor de estado y concesión
De manera similar a la biblioteca de procesadores de fuente de cambios, la característica de fuente de cambios del SDK de .NET V3 usa un contenedor de concesión para almacenar el estado. Sin embargo, los esquemas son diferentes.
El procesador de fuente de cambios del SDK V3 detectará cualquier estado de la biblioteca anterior y lo migrará al esquema nuevo de manera automática en la primera ejecución del código de aplicación migrada.
Puede detener la aplicación de manera segura con el código anterior, migrar el código a la versión nueva, iniciar la aplicación migrada y todos los cambios que se hayan producido mientras se detuvo la aplicación se recogerán y procesarán con la versión nueva.
Recursos adicionales
Pasos siguientes
Puede obtener más información sobre el procesador de la fuente de cambios en los siguientes artículos:
- Introducción a la fuente de cambios
- Uso del calculador de la fuente de cambios
- Hora de inicio del procesador de la fuente de cambios
- ¿Intenta planear la capacidad de una migración a Azure Cosmos DB?
- Si lo único que sabe es el número de núcleos virtuales y servidores del clúster de bases de datos existente, lea sobre el cálculo de unidades de solicitud mediante núcleos o CPU virtuales.
- Si conoce las tasas de solicitudes típicas de la carga de trabajo de la base de datos actual, obtenga información sobre el cálculo de unidades de solicitud mediante la herramienta de planeamiento de capacidad de Azure Cosmos DB.