Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
DOTYCZY: NoSQL
W tym artykule opisano kroki wymagane do przeprowadzenia migracji kodu istniejącej aplikacji, który używa biblioteki procesora zestawienia zmian do funkcji zestawienia zmian w najnowszej wersji zestawu .NET SDK (nazywanego również zestawem SDK platformy .NET w wersji 3).
Wymagane zmiany kodu
Zestaw .NET V3 SDK zawiera kilka zmian łamiących zgodność. Oto kluczowe kroki do migracji aplikacji:
- Przekształć instancje
DocumentCollectionInfo
na odwołaniaContainer
dla monitorowanych i dzierżawionych kontenerów. - Dostosowania, które używają
WithProcessorOptions
, powinny być aktualizowane do używaniaWithLeaseConfiguration
iWithPollInterval
dla interwałów,WithStartTime
dla czasu rozpoczęcia orazWithMaxItems
do zdefiniowania maksymalnej liczby elementów. - Ustaw
processorName
naGetChangeFeedProcessorBuilder
tak, aby dopasować wartość skonfigurowaną w elemencieChangeFeedProcessorOptions.LeasePrefix
, lub użyjstring.Empty
w przeciwnym razie. - Zmiany nie są już dostarczane jako
IReadOnlyList<Document>
. Zamiast tego jest używaneIReadOnlyCollection<T>
, gdzieT
to typ, który należy zdefiniować. Nie ma już klasy elementu bazowego. - Aby obsłużyć zmiany, nie potrzebujesz już implementacji elementu
IChangeFeedObserver
, zamiast tego musisz zdefiniować delegata. Delegat może być funkcją statyczną lub, jeśli musisz zachować stan pomiędzy uruchomieniami, możesz utworzyć własną klasę i przekazać metodę instancji jako delegata.
Jeśli na przykład oryginalny kod do utworzenia procesora strumienia zmian wygląda następująco:
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();
Zmigrowany kod będzie wyglądać następująco:
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();
Dla delegata możesz mieć statyczną metodę odbierania zdarzeń. Jeśli korzystasz z IChangeFeedObserverContext
, możesz przejść do używania ChangeFeedProcessorContext
.
-
ChangeFeedProcessorContext.LeaseToken
można użyć zamiastIChangeFeedObserverContext.PartitionKeyRangeId
-
ChangeFeedProcessorContext.Headers
można użyć zamiastIChangeFeedObserverContext.FeedResponse
-
ChangeFeedProcessorContext.Diagnostics
zawiera szczegółowe informacje o opóźnieniu żądania na potrzeby rozwiązywania problemów
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);
}
}
Zdarzenia dotyczące kondycji i możliwość obserwacji
Jeśli wcześniej używałeś IHealthMonitor
lub korzystałeś z IChangeFeedObserver.OpenAsync
i IChangeFeedObserver.CloseAsync
, użyj interfejsu API powiadomień.
-
IChangeFeedObserver.OpenAsync
można zastąpićWithLeaseAcquireNotification
. -
IChangeFeedObserver.CloseAsync
można zastąpićWithLeaseReleaseNotification
. -
IHealthMonitor.InspectAsync
można zastąpićWithErrorNotification
.
Kontener stanowy i dzierżawowy
Podobnie jak w bibliotece procesora zestawienia zmian, funkcja w .NET V3 SDK używa kontenera dzierżawy do przechowywania stanu. Schematy są jednak różne.
Procesor zestawienia zmian zestawu SDK w wersji 3 wykryje każdy stary stan biblioteki i przeprowadzi migrację go do nowego schematu automatycznie po pierwszym wykonaniu zmigrowanego kodu aplikacji.
Aplikację można bezpiecznie zatrzymać przy użyciu starego kodu, zmigrować kod do nowej wersji, uruchomić zmigrowaną aplikację i wszelkie zmiany, które wystąpiły podczas zatrzymania aplikacji, zostaną pobrane i przetworzone przez nową wersję.
Dodatkowe zasoby
Następne kroki
Teraz możesz dowiedzieć się więcej o procesorze strumienia zmian w następujących artykułach.
- Omówienie procesora strumienia zmian
- Korzystanie z estymatora kanału zmian
- Czas uruchomienia procesora strumienia zmian
- Próbujesz zaplanować pojemność migracji do usługi Azure Cosmos DB?
- Jeśli wiesz, ile rdzeni wirtualnych i serwerów znajduje się w istniejącym klastrze bazy danych, przeczytaj o szacowaniu jednostek żądań przy użyciu rdzeni wirtualnych lub procesorów wirtualnych
- Jeśli znasz typowe stawki żądań dla bieżącego obciążenia bazy danych, przeczytaj o szacowaniu jednostek żądań przy użyciu planisty pojemności usługi Azure Cosmos DB