2011-04-01 26 views
2

我需要一个java应用程序来管理数据库,以将工作单元分配给客户端。 实际上,它是一个网格应用程序:数据库充满了客户端的输入参数,并且它的所有元组都必须分发给请求的客户端。客户端发送结果后,服务器相应地修改数据库(例如标记计算的元组)。
现在让我们假设我有一个充满元组的数据库(SQLite或MySQL),并且客户端请求一组输入元组:我希望一组工作单元专门发送给一个唯一的客户端,所以我需要将其标记为“已经被另一个客户请求”。 如果我查询数据库的第一个(例如5)查询,同时另一个客户端提出相同的请求(在多线程服务器体系结构中,并没有任何同步),我认为有可能两个客户端接收相同的工作 - 单位。如何创建向客户端分发工作单元的服务器?

我想象的解决方案可能是:
1)让一个单线程的服务器架构(的ServerSocket.accept()再次调用以前的客户端请求已送达后,才,使服务器仅有效访问客户端)
2)在多线程架构中,使查询和元组锁操作同步,以便我获得一种原子性(有效地对数据库进行序列化操作)
3)使用原子查询操作到数据库服务器(或文件,在SQLite的情况下),但在这种情况下,我需要帮助,因为我不知道事情真的如何...

但是我希望你能理解我的问题:它与seti @ home非常相似,分配它的工作单元,但是所有分布式单元与其众多客户端的交集都是空的(理论上)。 我的非功能性需求是语言是java,而数据库是SQLite或MySQL。

回答

1

一些反馈为每个可能的解决方案......

1)使一个单一线程服务器 架构(的ServerSocket.accept() 又称为 以前的客户端的请求一直后才 服务,使服务器 有效地只有一个客户在 一次访问)

ServerSocket.accept()不会允许你这样做,你可能需要一些其他类型的同步,以允许只有一个线程处于getting tuples的情况。这基本上引导你到你的解决方案(2)。

2)在多线程架构, 使查询和元组锁 操作同步,因此我 获得对数据库中的种类的原子 (有效地串行化操作 的)

可行,易于实施和解决问题的常用方法。唯一的问题是你对性能,延迟和吞吐量的关心程度,因为如果你有很多这样的客户端,并且工作单元的时间跨度很短,那么客户端可能会最终锁定90%的时间来获得“令牌”。

该问题的可能解决方案。为工作单元使用基于散列的分配。假设您有50个工作单位要在50个客户之间共享。您以这样的方式为您的工作单位提供ID,以便您的客户将获得某些工作单位。最后,你可以用一个简单的模块操作节点分配:

assigned_node_id = work_unit_id % number_of_working_nodes

这种技术被称为pre-allocation,对于所有类型的问题不工作,所以这取决于你的应用程序。如果您有很多短时间运行的过程,请使用此方法。

3)使用原子查询操作到 数据库服务器(或文件,在案件的SQLite ),但在这种情况下,我需要 帮助,因为我不知道事情怎么 真的不用..

它基本上和(2)一样,但是如果你能够做到这一点,我怀疑你可以只用SQL,那么你最终会被绑定到RDBMS的一些特定功能。很可能你需要一些非标准的SQL程序来实现这个解决方案。而且,它没有解决,你会发现问题与解决方案2.

Summary

解决方案2是更可能的情况占90%的工作,时间越长,任务是为这个解决方案更好。如果任务时间很短,那么一定要选择基于pre-allocation的算法。

通过解决方案3,您放弃了便携性和灵活性。

DRY: try some other Open Source systems ...

有迹象表明已经处理此类问题的几个开源Java项目,他们可能是你矫枉过正,但我​​认为这是值得一提的他们......

http://www.gridgain.com/

http://www.jppf.org/

1

我建议你阅读this one之类的文章,看看DB如何为你做同步工作。

相关问题