2017-05-26 136 views
1

我在群集服务器上的PHP中有应用程序。它从服务器上的aws桶复制文件处理文件(解压缩文件,使用itext java将PDF转换为XML,读取XML并将数据保存到数据库)以及上传处理后的文件返回到存储桶。负载均衡服务器(群集)上的文件处理

它对单个实例工作正常,但对多个实例的负载平衡服务器上的进程下的文件消失。 我无法直接从存储桶处理文件,因为我无法将其解压缩到存储桶中,也无法在存储桶上运行jar文件。所以我必须临时存储文件 进行处理。有什么办法来处理这种情况

+0

这些文件如何进入初始桶? – strongjz

+0

文件被手动上传到存储桶 – hrishi

回答

0

一些可能的解决方案:

  • 使用中央单键值存储(数据库)来存储文件的,你正在处理,下载新的当路径文件,检查这个文件是否已经存在。您可以使用Redis来做这件事
  • 将一个新的空文件上传到S3,但是使用文件名中的某些内容,这样您就知道如果该文件存在,附带的文件已经被处理(尽管我不确定如果S3缓存目录列表)有了这个解决方案,你也应该考虑成本将文件写入到S3,这也取决于你的规模
  • 重命名或当它正在处理
+0

问题是由于负载平衡的实例更改。当实例更改服务器上的所有文件消失 – hrishi

+0

并解压缩文件并应用jar从pdf中提取XML我需要从服务器上下载文件,因为我无法直接将此功能应用于存储区 – hrishi

0

有可能从S3中删除文件对此的多种解决方案:

一种解决方案是在上传时处理文件时检查并应用标记d应用一些标签,如processed=true,并在下载文件时检查标签。

更好的解决方案是使用lambda来完成这个任务。

0

可以使用的

  1. S3中的图案,以拉姆达
  2. LAMBDA在SQS滴消息
  3. 应用监视器SQS
  4. 应用程序文件
  5. 删除消息。

enter image description here

或只是有拉姆达尽在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

0

你需要的是一个系统,它将存储文件没有损失。这有很多的选择。

a)另一台服务器

b)SQS队列。 @strongiz答案上面解释得很好。

c)甚至另一个数据库。

在每种情况下,您都需要一个标志来定义文件是否被处理。当文件处理完成

一)删除文件或

B)更改标志

因为,PHP是面向会话的,你不能存储数据有permannently,因此,你需要连接到另一个界面。在数据库的情况下,您实际上可以存储文件路径条目和标志以确定文件是否处理。所以,即使是3的组合也可能工作。