我在群集服务器上的PHP中有应用程序。它从服务器上的aws桶复制文件处理文件(解压缩文件,使用itext java将PDF转换为XML,读取XML并将数据保存到数据库)以及上传处理后的文件返回到存储桶。负载均衡服务器(群集)上的文件处理
它对单个实例工作正常,但对多个实例的负载平衡服务器上的进程下的文件消失。 我无法直接从存储桶处理文件,因为我无法将其解压缩到存储桶中,也无法在存储桶上运行jar文件。所以我必须临时存储文件 进行处理。有什么办法来处理这种情况
我在群集服务器上的PHP中有应用程序。它从服务器上的aws桶复制文件处理文件(解压缩文件,使用itext java将PDF转换为XML,读取XML并将数据保存到数据库)以及上传处理后的文件返回到存储桶。负载均衡服务器(群集)上的文件处理
它对单个实例工作正常,但对多个实例的负载平衡服务器上的进程下的文件消失。 我无法直接从存储桶处理文件,因为我无法将其解压缩到存储桶中,也无法在存储桶上运行jar文件。所以我必须临时存储文件 进行处理。有什么办法来处理这种情况
一些可能的解决方案:
有可能从S3中删除文件对此的多种解决方案:
一种解决方案是在上传时处理文件时检查并应用标记d应用一些标签,如processed=true
,并在下载文件时检查标签。
更好的解决方案是使用lambda来完成这个任务。
可以使用的
或只是有拉姆达尽在S3上传工作。取决于进程运行的时间。执行时间为5分钟。 http://docs.aws.amazon.com/lambda/latest/dg/limits.html
例如:
设置一个lambda函数来监控上传新对象事件S3。然后让lambda函数在SQS中放下一条消息(根据它收到的事件数据,Lambda函数知道源桶名称和对象键名称)。服务器可以监视队列,处理消息,提取文件并将其上传到新的存储桶,从旧的s3存储桶中删除文件,然后从队列中删除消息。如果服务器在处理期间死亡,则消息返回到队列(可见性超时)。一种确保在旧桶上处理和删除的方法是启用版本控制和生命周期策略。处理消息时,如果旧存储桶中不存在这些文件,请发送警报和/或检查以前的版本。您还可以在旧存储桶上使用生命周期策略,以便在版本大于X天的情况下永久删除版本。
监测S3和λ
http://docs.aws.amazon.com/lambda/latest/dg/with-s3.html
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
S3版本
http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
选择永久删除以前的版本,然后后进入的天数对象成为以前的版本以永久删除该对象(例如455天)。 http://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
你需要的是一个系统,它将存储文件没有损失。这有很多的选择。
a)另一台服务器
b)SQS队列。 @strongiz答案上面解释得很好。
c)甚至另一个数据库。
在每种情况下,您都需要一个标志来定义文件是否被处理。当文件处理完成
一)删除文件或
B)更改标志
因为,PHP是面向会话的,你不能存储数据有permannently,因此,你需要连接到另一个界面。在数据库的情况下,您实际上可以存储文件路径条目和标志以确定文件是否处理。所以,即使是3的组合也可能工作。
这些文件如何进入初始桶? – strongjz
文件被手动上传到存储桶 – hrishi