简而言之,我的API将接受文件上传。我(最终)将它们存储在S3中,但为了保存在同一请求中将它们上传到S3,我将上传过程排队并在后台进行。
我最初将文件存储在服务器上,在我的工作中,我正在排队文件路径,然后在服务器上抓取该文件路径的内容,然后发送到S3。
我在单个服务器上开发/暂存。我的生产环境将位于负载均衡器后面,有2-3台服务器。我意识到我的工作将在2/3的时间内失败,因为我在工作中链接的文件可能位于不同的服务器而不是运行该作业的服务器上。
我意识到我只能base64_encode
文件内容,并将其存储在Redis中(而不是仅存储文件的路径)。使用以下内容:
$contents = base64_encode(file_get_contents($file));
UploadFileToCloud::dispatch($filePath, $contents, $lead)->onQueue('s3-uploads');
我有一个很大的Redis商店,所以我相信我可以为很多小文件(很可能在我的情况下)这样做,但有些文件可能非常大。
我开始担心使用此方法可能会遇到问题,很可能与我的Redis商店内存不足有关。
我考虑过所有实例之间的共享驱动器,并恢复到我原来的存储文件路径的方法,但不确定。
我遇到的另一个问题是文件上传失败,如果它是一个大文件,failed_jobs
表可以处理base64编码的20mb pdf的数据量(例如)。
base64编码文件内容并排队最好的方法吗?或者,是否有人可以推荐在多服务器环境中排队上传文件上传的替代方法?