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

问题描述 投票:0回答:1

使用案例:我有一个带有ID的文件(大约500k)我的应用程序读取这些文件并处理它们(每个id的处理很大)。总的来说,这个处理需要大量的时间和内存。

我们需要实现的是扩展进程数量(在单独的盒子/机器上运行Java进程)并将整个id列表划分为一些固定的批量大小,这样5个进程就可以从文件中开始处理项目并获取下一个批处理完成后。例如。如果文件中的总项目数为100,而我的批次大小为5,总共3个进程,那么处理应该是这样的

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

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

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

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

java multiprocessing distributed-computing polling
1个回答
1
投票

听起来你有一个分布式计算问题。您有一组“需要处理的东西”,并希望跨多台机器进行处理。最简单和最典型的方法是将这些“处理过程”放入像Amazon SQS或RabbitMQ这样的分布式队列中(文件不起作用)。

  1. 让一个进程(并且只有一个)负责将文件传输到分布式队列。如果您可以完全避免该文件(并且只需写入该文件就可以写入该文件),请执行此操作。
  2. 设置多个主机(考虑使用Amazon EC2)从该队列中读取,然后进行处理。 确保在处理完成后从队列中删除该项目(并根据处理时间设置合理的可见性超时),以避免其他工作人员主持人在不应该处理该项目时。 如果需要,您可以一次一个地从队列中提取,也可以分批提取。我建议在每个主机上设置一个线程池来执行poll / work / delete循环,这样只需更改线程池大小就可以轻松调整每个主机的并发数量。

通过使用这样的分布式队列,其他主机不会看到一个主机占用的项目(因此避免了双重处理)。

© www.soinside.com 2019 - 2024. All rights reserved.