gpt4 book ai didi

java - 如何创建一个向客户端分发工作单元的服务器?

转载 作者:搜寻专家 更新时间:2023-10-30 20:31:28 25 4
gpt4 key购买 nike

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

我认为解决方案可能是:
1) 做一个单线程的服务器架构( ServerSocket.accept() 只有在之前的客户端请求服务完成后才会再次调用,这样服务器一次只能被一个客户端有效访问)
2) 在多线程架构中,使查询和元组锁定操作同步,这样我就获得了一种原子性(有效地对数据库进行序列化操作)
3) 对数据库服务器(或文件,在 SQLite 的情况下)使用原子查询操作,但在这种情况下我需要帮助,因为我不知道事情到底是怎么回事......

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

最佳答案

针对您的每个潜在解决方案的一些反馈...

1) make a single-threaded server architecture ( ServerSocket.accept() is called again only after the previous client request has been served, so that the server is effectively accessed by only a client at time)

ServerSocket.accept() 不允许您这样做,您可能需要某种其他类型的同步以在获取元组 的情况下仅允许一个线程.这基本上会引导您找到解决方案 (2)。

2) in a multi-threaded architecture, make the query and tuples-lock operations synchronized, so that I obtain a kind of atomicity (effectively serializing operations over the database)

可行、易于实现并且是解决问题的通用方法。唯一的问题是你有多关心性能、延迟和吞吐量,因为如果你有很多这样的客户端并且工作单元的时间跨度很短,那么客户端可能会在 90% 的时间里锁定等待获得“ token ”。

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

assigned_node_id = work_unit_id % number_of_working_nodes

这种称为预分配的技术并不适用于所有类型的问题,因此它取决于您的应用程序。如果您有许多短时间运行的进程,请使用此方法。

3) use atomic query operations to the database server (or file, in the case of SQLite), but in this case I need help because I don't know how things really goes...

它在本质上与 (2) 相同,但如果您能够做到这一点(我怀疑您仅使用 SQL 就可以做到),您最终会被 RDBMS 的某些特定功能所束缚。您很可能不得不使用一些非标准的 SQL 过程来实现此解决方案。而且,它不能解决您在解决方案 2 中发现的问题。

总结

解决方案 2 更有可能在 90% 的情况下工作,任务越长越好。如果任务的时间非常短,肯定会选择基于预分配 的算法。

对于解决方案 3,您放弃了便携性和灵 active 。

DRY:尝试一些其他的开源系统......

很少有开源 java 项目已经在处理此类问题,它们对您来说可能有点过分,但我认为值得一提......

http://www.gridgain.com/

http://www.jppf.org/

关于java - 如何创建一个向客户端分发工作单元的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com