与RabbitMq共享工作人员池

与RabbitMq共享工作人员池,rabbitmq,message-queue,priority-queue,task-queue,Rabbitmq,Message Queue,Priority Queue,Task Queue,我正在构建一个多租户应用程序,在该应用程序中,用户可以提交要由工作人员处理的成批任务(工作人员的数量是动态的)。我试图实现以下目标: 如果我们有来自一个用户的单个批处理,则让所有工作人员处理来自该单个用户的消息 如果另一个用户提交一个批处理作业,每个用户将获得一半的工作人员(因此第一个用户现在的工作速度较慢,而后一个用户不必等到第一个用户完成所有冗长的作业) 这样的事情在工作队列中可能发生吗?(出于某种原因,这感觉像是对FIFO和队列概念的一种扭曲,但这就是我的用例:D)您可以查看优先级队列

我正在构建一个多租户应用程序,在该应用程序中,用户可以提交要由工作人员处理的成批任务(工作人员的数量是动态的)。我试图实现以下目标:

  • 如果我们有来自一个用户的单个批处理,则让所有工作人员处理来自该单个用户的消息
  • 如果另一个用户提交一个批处理作业,每个用户将获得一半的工作人员(因此第一个用户现在的工作速度较慢,而后一个用户不必等到第一个用户完成所有冗长的作业)

这样的事情在工作队列中可能发生吗?(出于某种原因,这感觉像是对FIFO和队列概念的一种扭曲,但这就是我的用例:D)

您可以查看优先级队列实现:

如果这对你不起作用,你可以尝试其他一些黑客来实现你想要的:

您可以将100个队列绑定到主题交换,并将路由密钥设置为用户ID%100的散列,即每个任务的密钥介于1和100之间,同一用户的任务的密钥相同。每个队列都绑定了一个介于1和100之间的唯一模式。现在,您有了一组工作人员,他们从一个随机队列号开始,然后在每个作业后增加该队列号,再次%100以在队列100后循环回队列1

现在,您的worker fleet可以并行处理多达100个唯一用户,或者如果没有其他工作要做,则所有worker都可以专注于单个用户。如果工作人员需要在每个作业之间遍历所有100个队列,那么在只有一个用户在单个队列上有很多作业的情况下,每个作业之间自然会有一些开销。减少队列数量是解决这一问题的一种方法。您还可以让每个工作人员保持到每个队列的连接,并使用来自每个队列的最多一条未确认消息。然后,如果未确认的消息超时设置得足够高,工作进程就可以更快地在内存中循环处理挂起的消息

或者,您可以创建两个交换,每个交换都有一个绑定队列。所有的工作都将进入第一个交换和队列,由一组工作人员使用。如果某个工作单元花费的时间太长,工作人员可以取消它并将其推到第二个队列。工人仅在第一个队列上没有任何内容时才处理第二个队列。您可能还需要两个具有相反队列优先级的工作人员,以确保在不断有短任务到达时仍能处理长时间运行的任务,以便最终始终处理用户批。这不会真正地将您的工作人员队伍分布到所有任务中,但它会阻止一个用户执行长时间运行的任务,阻止您的工作人员为同一个用户或另一个用户执行短时间运行的任务。它还假设您可以取消作业,然后在以后重新运行,而不会出现任何问题。这还意味着超时的任务会浪费资源,需要以低优先级重新运行。除非你能提前确定快速和慢速任务

如果一个用户有100个慢任务,而另一个用户发布了一批任务,那么使用100个队列的第一个建议也可能有问题。这些任务只有在其中一个慢任务完成后才会被查看。如果这是一个合理的问题,您可以潜在地将这两种解决方案结合起来