Java 数据处理平衡

Java 数据处理平衡,java,hibernate,load-balancing,Java,Hibernate,Load Balancing,我有一个包含作业的队列,这些作业根据作业的类型流向不同的执行器池。队列位于DB表中,包含来自具有优先级的不同客户端的作业等。我省略了一些与问题无关的细节。 在某个时间点,不同的客户机同时将许多具有相同优先级的作业放入队列中,例如大约15-20000个作业 在当前的实现中,作业是使用hibernate根据这个条件获取的,为了简单起见,我省略了一些限制 Calendar cal=Calendar.getInstance(); cal.add(Calendar.MINUTE,-分钟); 条件c=get

我有一个包含作业的队列,这些作业根据作业的类型流向不同的执行器池。队列位于DB表中,包含来自具有优先级的不同客户端的作业等。我省略了一些与问题无关的细节。 在某个时间点,不同的客户机同时将许多具有相同优先级的作业放入队列中,例如大约15-20000个作业

在当前的实现中,作业是使用hibernate根据这个条件获取的,为了简单起见,我省略了一些限制

Calendar cal=Calendar.getInstance();
cal.add(Calendar.MINUTE,-分钟);
条件c=getSession().createCriteria(QueueEntry.class)
.add(限制.eq(“处理”,假))
.add(Restrictions.or(Restrictions.ge(“serverTimestamp”,cal.getTime()),Restrictions.ge(“sentTimestamp”,cal.getTime()))
.add(Restrictions.lt(“attemps”,attemps))
.addOrder(Order.asc(“优先级”))
.addOrder(Order.asc(“服务器时间戳”))
.setMaxResults(限制);
在当前情况下,如果客户端A在10:00:00时插入15k个任务,客户端B在10:00:05(5秒后)以相同的优先级插入3k个任务,则B的任务将在A的任务之后获取并执行

我需要在客户机之间平衡获取的作业(队列表中有一个“客户机”列)——例如,如果吞吐量为10个任务/秒,则获取a的5个任务和B的5个任务。当客户端B没有更多任务时,获取A的10个任务


是否有一些简单的方法或技巧来处理查询?数据库是Postgres。

我不认为通过修改现有的
标准或仅通过一个查询就可以做到这一点。为了防止客户端饥饿,您必须为每个客户端创建单独的资源池,这是由以下人员采取的方法:

公平调度程序将作业组织到池中,并在这些池之间公平分配资源。默认情况下,每个用户都有一个单独的池,这样每个用户都可以获得相同的集群份额。还可以根据用户的Unix组或任何jobconf属性设置作业池。在每个池中,可以使用公平共享或先进先出(FIFO)调度来调度作业

您可以运行一个查询,以获取具有等待作业总数的不同客户端的列表。基于不同的客户端计数,划分全局作业限制,并在单独的查询中获取每个给定客户端的等待作业