【发布时间】:2016-05-14 08:02:02
【问题描述】:
我有一个 python 脚本,它定期扫描目录,处理新文件。每个文件都需要很长时间来处理(几个小时)。我目前在单台计算机上运行脚本,将已处理文件的名称写入本地文件。不花哨或健壮,但它或多或少有效。我想使用多台工作机器来提高吞吐量(和稳健性)。我的目标是让它尽可能简单。 Zookeeper 集群是现成的。
我的计划是在 zookeeper 中创建一个目录“started_files”,其中包含带有文件名的临时节点,已知该文件名是唯一的。我会有另一个目录“completed_files”,其中包含带有文件名的常规节点。在伪代码中,
if filename does not exist in completed files:
try:
create emphemeral node filename in started files
process(filename)
create node filename in completed files
except node exists error:
do nothing, another worker is processing it
我的第一个问题是这是否安全。任何情况下,两台不同的机器都可以成功创建同一个节点吗?我不完全理解doc。对文件进行两次处理不会导致任何问题,但我希望它在原则上是正确的。
其次,这是一种体面的方法吗?还有另一种显然更好的方法吗?我每天将处理 10 个文件,因此这部分应用程序的性能对我来说并不重要(我当然希望处理文件更快)。或者,我可以有另一个只有一个实例的脚本(或选择一个领导者)来扫描文件并将它们放入队列中。我可以修改导致这些文件首先神奇地出现的代码。我可以用芹菜或风暴。然而,所有这些替代方案都扩大了我试图保持小而简单的范围。
【问题讨论】:
标签: python apache-zookeeper distributed-computing