锁定文件创建的最佳方式(最佳性能)
本文关键字:最佳 性能 方式 锁定 文件创建 | 更新日期: 2023-09-27 18:09:20
我有一个web应用程序返回图像到我的前端。在这个应用程序中发生的事情是:当向一个特定的映像发出请求时,应用程序检查该映像是否已经存在于磁盘上;如果存在,则返回图像。
当磁盘上不存在映像时,我的问题就开始了。在这种情况下,会同时对磁盘上不存在的同一个映像发出两个请求。当两个线程试图同时在磁盘上创建同一个文件时,会出现问题。
为了解决这个问题,我尝试在创建磁盘映像时创建一个互斥锁。但是它有一个问题:由于同时有大量的请求,服务器负载是巨大的,服务器崩溃了。
我想听听你对解决这个问题的意见。或者你会怎么做?谢谢。
您可以尝试以下模式:
- 尝试读取图像(如果成功,则完成)
- 尝试创建带有写锁的映像
- 只在"文件使用异常",小延迟(毫秒)
- 返回步骤1(重试)
使延迟非常小,只比创建图像所需的时间稍微大一点。实现重试限制,最多3次左右。
这将允许您使用已经存在的(文件)锁定机制
可以调用带有O_CREAT
和O_EXCL
标志的open
函数。第一个进程的开放调用将获得创建文件的独占访问权,它将开始下载图像。后续进程的open调用将失败,因为它们的open不是排他性的,并且"errno"将被设置为EEXIST。
根据您的设计,后续进程可以等待完成文件创建,也可以返回。
fd = open(path, O_CREAT|O_EXCL)