增量查询不适用于某些租户
Delta Queries not working on some tenants
我已经浪费了一个月的时间,已经被 MPN 支持人员从支柱追赶到 post。
我们正忙于开发一项服务,为使用我们的 SaaS 平台的客户将用户配置文件图像从 Microsoft Graph 同步到我们的系统。
客户端列表包括 200 个客户端和大约 4'000'000 个 Microsoft 用户受此影响。
每天从 Microsoft Graph 进行完全同步对我们来说是自杀,而对 Microsoft Graph 基础设施来说则是谋杀,因为我们 运行 这些同步在全球范围内为我们所有的客户服务。
为了避免我们不得不锤击 Graph 服务,我们选择 运行 每个客户端完全同步一次,存储 delta 令牌,然后从那时起我们每 30 分钟只从 delta 同步更新一次。
在开发过程中,我们针对我们的一个测试租户进行了测试,一切顺利。完全同步完成,从那时起,如果用户更新了他们的个人资料图片,我们将看到增量结果。
然后我们开始针对我们的主要租户和一些客户租户进行测试,很快发现增量查询没有返回某些租户更新的结果。这导致整个项目计划停止,结果我们无法同步个人资料图片,被迫停留在当前的计划上,即通过实时查询过度查询 Graph。
我已经在 25 个租户中尝试过此方法,但有 5 个失败了。
var usersDeltaLink = SQLService.GetDeltaToken(syncConfig);
List<string> memberIds = new List<string>();
var usersDeltaRequest = _graphClient
.Users
.Delta()
.Request(usersDeltaLink == null ? new Option[0] : new[]
{
new QueryOption("$deltatoken", usersDeltaLink.Token)
});
var deltaUsers = await usersDeltaRequest.GetAsync();
int totalCount = 0;
List<Task> itemTasks = new List<Task>();
do
{
totalCount += deltaUsers.Count;
Log.Information($"Fetched out {deltaUsers.Count} users");
itemTasks.AddRange(deltaUsers.CurrentPage.Select(x => x.Id).ToList().Select(async memAccId =>
{
await UpdateUserPhoto(memAccId);
}));
}
while (deltaUsers.NextPageRequest != null && (deltaUsers = await deltaUsers.NextPageRequest.GetAsync()).Count > 0);
await Task.WhenAll(itemTasks);
Uri deltaLink = new Uri(deltaUsers.AdditionalData["@odata.deltaLink"].ToString());
var deltaToken = HttpUtility.ParseQueryString(deltaLink.Query).Get("$deltatoken");
我希望 Microsoft Graph Delta 查询能够正常工作并且对租户的失败率不会达到 20%。
我已经浪费了一个月的时间,已经被 MPN 支持人员从支柱追赶到 post。 我们正忙于开发一项服务,为使用我们的 SaaS 平台的客户将用户配置文件图像从 Microsoft Graph 同步到我们的系统。 客户端列表包括 200 个客户端和大约 4'000'000 个 Microsoft 用户受此影响。
每天从 Microsoft Graph 进行完全同步对我们来说是自杀,而对 Microsoft Graph 基础设施来说则是谋杀,因为我们 运行 这些同步在全球范围内为我们所有的客户服务。 为了避免我们不得不锤击 Graph 服务,我们选择 运行 每个客户端完全同步一次,存储 delta 令牌,然后从那时起我们每 30 分钟只从 delta 同步更新一次。
在开发过程中,我们针对我们的一个测试租户进行了测试,一切顺利。完全同步完成,从那时起,如果用户更新了他们的个人资料图片,我们将看到增量结果。 然后我们开始针对我们的主要租户和一些客户租户进行测试,很快发现增量查询没有返回某些租户更新的结果。这导致整个项目计划停止,结果我们无法同步个人资料图片,被迫停留在当前的计划上,即通过实时查询过度查询 Graph。
我已经在 25 个租户中尝试过此方法,但有 5 个失败了。
var usersDeltaLink = SQLService.GetDeltaToken(syncConfig);
List<string> memberIds = new List<string>();
var usersDeltaRequest = _graphClient
.Users
.Delta()
.Request(usersDeltaLink == null ? new Option[0] : new[]
{
new QueryOption("$deltatoken", usersDeltaLink.Token)
});
var deltaUsers = await usersDeltaRequest.GetAsync();
int totalCount = 0;
List<Task> itemTasks = new List<Task>();
do
{
totalCount += deltaUsers.Count;
Log.Information($"Fetched out {deltaUsers.Count} users");
itemTasks.AddRange(deltaUsers.CurrentPage.Select(x => x.Id).ToList().Select(async memAccId =>
{
await UpdateUserPhoto(memAccId);
}));
}
while (deltaUsers.NextPageRequest != null && (deltaUsers = await deltaUsers.NextPageRequest.GetAsync()).Count > 0);
await Task.WhenAll(itemTasks);
Uri deltaLink = new Uri(deltaUsers.AdditionalData["@odata.deltaLink"].ToString());
var deltaToken = HttpUtility.ParseQueryString(deltaLink.Query).Get("$deltatoken");
我希望 Microsoft Graph Delta 查询能够正常工作并且对租户的失败率不会达到 20%。