我有一个Web应用程序将图像返回到我的前端。 在这个应用程序中会发生什么:当对特定图像发出请求时,应用程序检查图像是否已存在于磁盘上;如果存在则返回图像。
当磁盘上不存在图像时,我的问题就开始了。在这种情况下,对于磁盘上不存在的同一图像,同时发出两个请求。当两个线程同时尝试在磁盘上创建相同的文件时,会出现问题。
要解决这个问题,我尝试做的是在创建磁盘映像时创建一个Mutex。但它有一个问题:由于大量的同时请求,服务器负载很大,服务器崩溃。
我想问一下你的想法是什么来解决这个问题。或者你会做什么呢?
谢谢。
答案 0 :(得分:2)
您可以尝试以下模式:
使延迟非常小,只比创建图像所需的时间稍微大一点。 实施重试限制,最多3次左右。
这将允许您使用现有的(文件)锁定机制
答案 1 :(得分:-1)
您可以使用open
和O_CREAT
标记来调用O_EXCL
函数。第一个进程的开放调用将获得创建文件的独占访问权限,它将开始下载映像。后续进程的公开调用将失败,因为它们的open不是独占的,而“errno”将被设置为EEXIST。
根据您的设计,后续流程可以等待完整的文件创建,也可以返回。
fd = open(path, O_CREAT|O_EXCL)