通过Graph API获取Azure/Entra AD用户及组过慢,求优化方案
优化Azure AD用户-组关系获取速度的方案
方案1:使用批量请求(Batch API)合并多用户组查询
单用户调用POST /users/{id}/getmembergroups产生的大量HTTP请求是耗时核心原因。利用Graph的批量请求可将最多20个独立请求打包为一个HTTP请求,大幅降低网络往返开销。
示例批量请求格式:
POST /$batch Content-Type: application/json { "requests": [ { "id": "1", "method": "POST", "url": "/users/{user-id-1}/getmembergroups", "body": { "securityEnabledOnly": false }, "headers": { "Content-Type": "application/json" } }, { "id": "2", "method": "POST", "url": "/users/{user-id-2}/getmembergroups", "body": { "securityEnabledOnly": false }, "headers": { "Content-Type": "application/json" } } // 最多可添加至20个请求 ] }
处理逻辑:
- 将35000个用户按每20个一组拆分,生成批量请求
- 批量处理所有请求后,将每个用户的组ID结果对应存储
- 最后与已获取的组列表匹配名称
该方法可将HTTP请求次数从35000次降至1750次,直接减少网络延迟带来的耗时。
方案2:反向遍历组构建用户-组映射
若组的成员分布相对集中(如大量用户属于少数组),可反向遍历所有组,获取组成员后构建用户到组的映射:
- 调用
GET /groups?$select=id,displayName获取所有组的ID和名称(与现有步骤3一致) - 对每个组,调用
GET /groups/{id}/members?$select=id获取组成员的用户ID - 遍历成员列表,将用户ID与当前组ID/名称关联,最终整理出每个用户所属的组集合
同样可通过批量请求优化组的成员查询,将多个/groups/{id}/members请求打包,减少HTTP请求次数。若组平均成员数较少,该方案的总数据传输量可能比遍历用户更小。
方案3:使用/users/{id}/memberOf替代getmembergroups
你之前尝试GET /users?$expand=memberOf失败,是因为Graph API默认不允许对多值导航属性memberOf进行全局扩展,但可针对单个用户调用GET /users/{id}/memberOf?$select=id,displayName,直接获取用户所属组的ID和名称,省去后续组匹配步骤。
该接口同样支持批量请求打包,一次获取多个用户的所属组信息,同时直接拿到组名称,减少后续的组ID匹配环节。
额外优化建议
- 使用应用权限而非委托权限调用接口,应用权限的请求限制更高,可提升并发处理能力
- 开启分页并行处理:获取用户/组列表时,同时处理已拿到的分页数据,无需等待所有数据下载完成再启动组查询
- 若仅需安全组,可将
getmembergroups的securityEnabledOnly参数设为true,减少返回数据量
内容的提问来源于stack exchange,提问作者user26830288
相关产品推荐
相关产品推荐

