关于Google Directory API users.get偶尔缺失orgUnitPath属性的问题求助
这个情况我之前在做Google Workspace集成的时候碰到过,大概率是Google分布式系统的最终一致性延迟导致的。
原因分析
Google的Directory API后台是分布式架构,当你创建新用户时,触发推送通知的时机可能早于用户所有属性(包括orgUnitPath)的全节点同步。简单说就是:用户创建的基础信息先同步完成,触发了watch的推送,但orgUnitPath这类关联组织单元的属性,可能还在后台进行跨节点同步,这时候你立刻调用users.get就会拿不到这个属性。等过几秒同步完成后,再调用就能正常获取了。
解决办法
给你几个实用的方案,按优先级排序:
添加带指数退避的重试逻辑:
收到推送通知后,不要马上调用users.get,先等1-3秒再发起请求;如果第一次返回的结果里没有orgUnitPath,就进行指数退避重试(比如第1次等1秒,第2次等2秒,第3次等4秒,最多重试3-5次)。这种短暂的延迟几乎不会影响业务流程,但能大概率避开同步窗口。明确指定API请求的
projection参数:
确认你调用users.get时用的是projection=full——虽然默认值是full,但有时候代码里可能不小心改成了basic,而basic投影不会返回orgUnitPath这类扩展属性。调用时显式指定参数更稳妥,示例请求:GET https://admin.googleapis.com/admin/directory/v1/users/{userEmail}?projection=full监听多类型的推送事件:
除了create类型的通知,也监听update类型的事件。有时候用户创建后,orgUnitPath的赋值会触发一个单独的update事件,处理这个事件也能拿到完整的用户数据。
这种同步延迟一般都是秒级的,重试机制基本能解决绝大部分场景的问题。
内容的提问来源于stack exchange,提问作者rok

