我已经浪费了一个月的时间被 MPN 支持从一个支柱追到另一个帖子。我们正忙于开发一项服务,以便使用我们的 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%。