通过多个进程同步轮询文件中的对象列表

时间:2018-09-03 02:09:26

标签: java multiprocessing distributed-computing polling

用例: 我有一个带有ID的文件(大约500k) 我的应用程序读取并处理这些文件(每个id的处理量很大)。因此,总体而言,此处理需要大量时间和内存。

我们需要实现的是通过扩展进程数(在单独的盒子/机器上运行Java进程)并将ID的整个列表划分为一些固定的批处理大小,以便5个进程开始处理文件中的项目并选择处理完成后,就补足下一批。 例如。如果文件中的项目总数为100,而我的批量大小为5,总共3个进程,则处理应类似于

  • 过程1:1-5
  • 过程2:6-10
  • 过程3:11-15

如果进程2在其他进程之前完成,则它将开始处理16-20,并通知其他进程,以便下一个可用进程选择项21-25。

请注意,由于内存限制,我们无法在单个进程/主机上使用多线程执行此操作。

有人可以建议解决方案/参考如何实现它。

1 个答案:

答案 0 :(得分:1)

听起来您有分布式计算问题。您有一组“要处理的东西”,并且想要在多台计算机上进行该处理。最简单,最典型的方法是将这些“要处理的东西”放入分布式队列中,例如Amazon SQS或RabbitMQ(文件将不起作用)。

  1. 由一个进程(只有一个)负责将文件传输到分布式队列。如果您可以完全避免使用该文件(并且可以将写入文件的内容写入队列中),请改为执行此操作。
  2. 设置多个主机(考虑Amazon EC2)以从该队列中读取并进行处理。
    • 确保在处理完成后从队列中删除该项目(并根据处理需要多长时间设置合理的可见性超时),以避免其他工作主机在不应该的情况下捡起该项目。
    • 如果需要,可以一次或分批从队列中拉出。我建议在每个主机上设置一个线程池以执行轮询/工作/删除循环,因此只需更改线程池大小就可以轻松调整每个主机的并发量。

通过使用这样的分布式队列,一个主机获取的项目将不会被其他主机看到(从而避免了重复处理)。