Java 用于实现作业注册表的数据结构,分布到从属VM

Java 用于实现作业注册表的数据结构,分布到从属VM,java,virtual-machine,distributed-computing,apache-httpclient-4.x,master-slave,Java,Virtual Machine,Distributed Computing,Apache Httpclient 4.x,Master Slave,背景资料: 我有一个基于主/从模式的分布式应用程序。 主机定期接收以下格式的JSON文件 [{'key' : 'a_hashed_unique_key', 'partner_name' : 'name1'}] 我将所有具有相同*partner_name'*的JSON对象聚合并写入一个文件,这将导致多个作业文件,每个作业文件对应一个partner_name 所有这些生成的文件都被写入网络存储器,在主设备和从设备之间共享 从机VM一旦通电,就会请求一个作业文件,主机在网络存储器上共享作业文件的路径

背景资料:

我有一个基于主/从模式的分布式应用程序。 主机定期接收以下格式的JSON文件

[{'key' : 'a_hashed_unique_key', 'partner_name' : 'name1'}]
我将所有具有相同*partner_name'*的JSON对象聚合并写入一个文件,这将导致多个作业文件,每个作业文件对应一个partner_name

所有这些生成的文件都被写入网络存储器,在主设备和从设备之间共享

从机VM一旦通电,就会请求一个作业文件,主机在网络存储器上共享作业文件的路径,从机开始处理它

问题: 跟踪作业和正在处理作业文件的从属计算机的最佳方法是什么

一个基于散列的集合,即HashMap看起来很合适,我将同时访问它,并且可以考虑以下场景的

请求作业文件的从机。 正在从集合中删除已完成的作业。 在收到新输入文件时添加新作业文件。
我更喜欢具有内部同步的实现,这样就可以跨线程原子地读取/修改作业注册表。

那么主机在收到新作业时应该更新共享文件和HashMap吗?如果我理解的话,您需要允许多个从机执行当前的写入和读取,但是当主机读取/写入结构时,它必须具有独占访问权限。如果是这样的话,看起来像是读写器锁定问题。我想避免并发读写文件的问题,所以我将输入作业文件分为多个小文件。每个文件都有特定于特定合作伙伴名称的作业。我有NFS,它对主服务器和从服务器都是可访问的。Master拥有每个特定于合作伙伴的输入文件的位置,它只需与从机共享网络上的文件位置。文件和从机之间有一对一的映射,我想在主机上存储此元信息以管理作业请求。是的,但用于跟踪作业的哈希映射包含每个从机作业的信息。partner_name似乎是映射键的一个很好的候选对象,我想映射应该有这样的对,以便主节点可以看到每个从节点当前的作业。您的问题更多地是关于当前对单个作业文件的访问或对跟踪作业的映射的访问?我也在考虑类似的问题,是的,问题将出现在并发访问期间。我在问题中提到了并发访问场景。请注意,我在内部使用apache http core api,从机使用python urllib2从主机请求作业。因此,您希望在用Java和python编写的程序之间使用同步机制。这并不容易,我认为您应该使用底层操作系统的一些功能来做类似的事情。您是否考虑过从属服务器向主服务器发送一条完成消息,然后主服务器修改文件?以这种方式,除了主线程之外,不需要同步。