针对 Google Photos API 的竞争条件

我正在开发此 CLI以将图像上传到 Google 照片。CLI 创建多个 go 例程来并行上传文件1。上传后,相同的例程会将其添加到Album如果这些相册在2之前不存在,则创建这些相册。

由于并发性和Google Photos API 允许创建两个Albums具有相同名称的事实,我想要避免重复的专辑名称。

GetOrCreateAlbumByName() 3并不能确保Album是唯一的。它基本上询问是否存在同名的专辑,如果不存在,它将创建一个新专辑。但是可以并行调用此函数,因此Album可以创建两个具有相同名称的函数。除了实现互斥锁之外,我还在观察重复项。

你会建议如何处理?

  1. 创建一个处理专辑创建的 Worker(如微服务)。在创建相册之前,每个 goroutine 都将被阻止。它将删除Album创建部分的并发性。

  2. 维护一个相册缓存并使用它来检查相册是否已经创建。在这种情况下,竞争条件也可能发生,但概率较小。

  3. 1 和 2 一起使用。

  4. 其他,请注明。

我对 1、2 和 3 感到担忧……这就是为什么我想知道您将如何处理。

提前致谢


眼眸繁星
浏览 137回答 1
1回答

UYOU

您用于Client.GetOrCreateAlbumByName()获取或创建相册。此方法对于并发使用是安全的,它在内部使用互斥锁来序列化调用,从而确保不会创建重复项。但是,您在这里创建和使用多个客户端,这意味着对所有客户端的并发调用不会被序列化,只会对单个客户端的并发调用。所以解决方案要么使用单个客户端,然后所有调用都将被序列化,或者如果这不可能,您必须序列化对所有客户端的调用,例如使用单个互斥锁或其他方式。如何使用互斥锁序列化对所有客户端的调用的示例:var mu sync.Mutexfunc GetOrCreateAlbumByName(c *gphotos.Client, name string) (*photoslibrary.Album, error) {    mu.Lock()    defer mu.Unlock()    return c.GetOrCreateAlbumByName(name)}无论您在哪里使用client.GetOrCreateAlbumByName(name),都将其替换为调用:GetOrCreateAlbumByName(client, name)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go