Java 负载分布在多个队列中,其中包含要由访问队列的工作线程处理的工作项

Java 负载分布在多个队列中,其中包含要由访问队列的工作线程处理的工作项,java,algorithm,Java,Algorithm,我有一个设计需求,其中来自不同来源的数据需要由多个线程处理,但约束是——处理来自给定来源的数据的线程应该始终继续处理来自该来源的数据 我使用了一个采用Q的SingleThreadExecutor,并使用了一致的哈希类型方法,其中源的哈希%10映射到处理数据的线程 这里唯一关心的是散列可能不是统一的,一些线程可能比其他线程负载更大。 有没有更好的方法或方法来实现这一点? 有没有人尝试过类似的设计问题?为了在给定的队列或线程集中实现数据负载的均匀分布,可以尝试哪些建议 提前感谢。这是一个在线问题。因

我有一个设计需求,其中来自不同来源的数据需要由多个线程处理,但约束是——处理来自给定来源的数据的线程应该始终继续处理来自该来源的数据

我使用了一个采用Q的SingleThreadExecutor,并使用了一致的哈希类型方法,其中源的哈希%10映射到处理数据的线程

这里唯一关心的是散列可能不是统一的,一些线程可能比其他线程负载更大。 有没有更好的方法或方法来实现这一点? 有没有人尝试过类似的设计问题?为了在给定的队列或线程集中实现数据负载的均匀分布,可以尝试哪些建议


提前感谢。

这是一个
在线问题。因为您事先不知道每个源需要多少处理,所以无法实现完美的平衡

我不能100%确定您所描述的解决方案是什么,因此我接下来的几行可能是您已经说过的内容的重复:

我会在一些数据结构中保留源/进程的映射,在其中我还将保留当前等待该进程的作业数(来自所有源)

当一个新的源出现时,我会把它分配给负载最小的进程

在严重的情况下(例如,只有三个源保持活动状态,并且所有三个都在同一进程上),我会将传入的作业(临时)排队,当进程完成处理其队列中已经存在的作业时,我会重新分发源/进程映射


希望这有意义并且有用。

您能解释相同的线程约束吗?它在许多方面都是非典型的,听起来像是XY约束。例如,我有5个生成数据的源,A、B、C、D和E,我有3个队列,它们是这些数据的使用者,每个Q都有一个工作线程分配给它,这样当Q有数据时可以处理数据。如果我开始将源A的数据放在第一季度,源C的数据放在第二季度,那么来自A的后续数据必须放在第一季度,来自Chas的数据只能放在第二季度。这就是我所说的同一线程约束。我将更具体地说:解释为什么你有(或相信你有)那个约束。它指出了一个潜在的设计问题,这个问题可能是可以解决的。您如何确定负载最小的队列?我的主要问题是,从第一个请求开始分配负载的最佳方式是什么?常用的算法有哪些?我知道其中一种算法是散列算法,但有没有流行的循环算法等?为了跟踪队列上的负载,保留一个带有队列ID的对象以及有多少任务在等待它。(添加任务时增加,完成时减少)