DocumentDB changefeed 如何支持 resume/continuation?
How does DocumentDB changefeed support resume/continuation?
DocumentDB 最近发布了更改源。
通过 API 您可以请求变更集。
这里的参数是延续令牌和最大项目数。
如果我没看错,你会从 continuation token = null 开始。
您请求最多 x 个项目,如果有更多项目可用,则响应会附带一个延续令牌。这样,您就知道另一个变更集可用。
如果响应中的继续标记为空,您将获得所有结果。
但是,下次您请求 API 时,您没有继续令牌...
这会导致完整的数据库作为变更集吗?我怎样才能防止这种情况发生?
我需要用最近使用过的令牌调用 API 吗?这会导致某些更改将被第二次处理吗?
使用 Change Feed,您总是会得到一个延续标记(不同于查询和阅读提要,它们在没有更多结果时不会 return 一个延续标记)。
IDocumentQuery<Document> query = client.CreateDocumentChangeFeedQuery(
collectionUri,
new ChangeFeedOptions
{
PartitionKeyRangeId = pkRange.Id,
StartFromBeginning = true,
RequestContinuation = continuation, // From last call to change feed
MaxItemCount = -1
});
// Paginate through all results currently available
while (query.HasMoreResults)
{
FeedResponse<DeviceReading> readChangesResponse = query.ExecuteNextAsync<DeviceReading>().Result;
foreach (DeviceReading changedDocument in readChangesResponse)
{
Console.WriteLine("\tRead document {0} from the change feed.", changedDocument.Id);
numChangesRead++;
}
// Save token for resuming after some time
checkpoints[pkRange.Id] = readChangesResponse.ResponseContinuation;
}
DocumentDB 最近发布了更改源。 通过 API 您可以请求变更集。
这里的参数是延续令牌和最大项目数。 如果我没看错,你会从 continuation token = null 开始。 您请求最多 x 个项目,如果有更多项目可用,则响应会附带一个延续令牌。这样,您就知道另一个变更集可用。
如果响应中的继续标记为空,您将获得所有结果。
但是,下次您请求 API 时,您没有继续令牌... 这会导致完整的数据库作为变更集吗?我怎样才能防止这种情况发生? 我需要用最近使用过的令牌调用 API 吗?这会导致某些更改将被第二次处理吗?
使用 Change Feed,您总是会得到一个延续标记(不同于查询和阅读提要,它们在没有更多结果时不会 return 一个延续标记)。
IDocumentQuery<Document> query = client.CreateDocumentChangeFeedQuery(
collectionUri,
new ChangeFeedOptions
{
PartitionKeyRangeId = pkRange.Id,
StartFromBeginning = true,
RequestContinuation = continuation, // From last call to change feed
MaxItemCount = -1
});
// Paginate through all results currently available
while (query.HasMoreResults)
{
FeedResponse<DeviceReading> readChangesResponse = query.ExecuteNextAsync<DeviceReading>().Result;
foreach (DeviceReading changedDocument in readChangesResponse)
{
Console.WriteLine("\tRead document {0} from the change feed.", changedDocument.Id);
numChangesRead++;
}
// Save token for resuming after some time
checkpoints[pkRange.Id] = readChangesResponse.ResponseContinuation;
}