Php 负载平衡服务器(群集)上的文件处理
我在集群服务器上的PHP中有应用程序。它从服务器上的aws bucket复制文件(解压文件。使用itext java将PDF转换为XML,读取XML并将数据保存到数据库),然后将处理后的文件上载回bucket 它可以很好地用于单个实例,但在多个实例的负载平衡中,服务器上进程下的文件将消失。 我不能直接从bucket处理文件,因为我不能在bucket上解压缩它,也不能在bucket上运行jar文件。所以我必须存储文件Php 负载平衡服务器(群集)上的文件处理,php,networking,amazon-s3,Php,Networking,Amazon S3,我在集群服务器上的PHP中有应用程序。它从服务器上的aws bucket复制文件(解压文件。使用itext java将PDF转换为XML,读取XML并将数据保存到数据库),然后将处理后的文件上载回bucket 它可以很好地用于单个实例,但在多个实例的负载平衡中,服务器上进程下的文件将消失。 我不能直接从bucket处理文件,因为我不能在bucket上解压缩它,也不能在bucket上运行jar文件。所以我必须存储文件 临时处理。有没有办法处理这种情况一些可能的解决方案: 使用中心单键值存储(数据
临时处理。有没有办法处理这种情况一些可能的解决方案:
- 使用中心单键值存储(数据库)存储当前正在处理的文件的路径,下载新文件时,请检查此文件是否已被删除。你可以用Redis来做这个
- 将一个新的、空的文件上传到S3,但是在文件名中有一些东西,这样您就知道如果文件存在,伴随的文件已经被处理了(虽然我不确定S3是否缓存目录列表)用这个解决方案,您也应该考虑将文件写入S3的成本,这也取决于您的刻度 。
- 在处理文件时重命名或从S3中删除该文件
- 使用中心单键值存储(数据库)存储当前正在处理的文件的路径,下载新文件时,请检查此文件是否已被删除。你可以用Redis来做这个
- 将一个新的、空的文件上传到S3,但是在文件名中有一些东西,这样您就知道如果文件存在,伴随的文件已经被处理了(虽然我不确定S3是否缓存目录列表)用这个解决方案,您也应该考虑将文件写入S3的成本,这也取决于您的刻度 。
- 在处理文件时重命名或从S3中删除该文件
- 一些可能的解决方案:
processed=true
,并在下载文件时检查标记
更好的解决方案是使用lambda执行此任务。此任务可以有多种解决方案: 一种解决方案是,如果文件在上传时已处理,则检查并应用标记。应用一些标记,如
processed=true
,并在下载文件时检查标记
更好的解决方案是使用lambda执行此任务。您可以使用
您可以使用
您需要的是一个能够存储文件而不会丢失的系统。有很多替代方案 a) 另一台服务器 b) SQS队列。 @上面的strongiz答案很好地解释了这一点 c) 甚至还有另一个数据库 在每种情况下,您都需要一个标志来定义文件是否被处理。当文件处理完成时 a) 删除文件或 b) 换旗 因为,PHP是面向会话的