Rabbitmq 杀掉兔子生产者后的清理工作

Rabbitmq 杀掉兔子生产者后的清理工作,rabbitmq,resource-cleanup,Rabbitmq,Resource Cleanup,我的问题的关键是在兔子生产者被杀后如何清理 我有一个rabbitmq环境,有多个生产者和多个消费者(工作者)。目前,所有消息(也称为工作)都会馈送到一个中心队列中,消费者在该队列中一次和一个进程拾取一条消息(工作任务)。任何一个特定的制作人都会产生约800条工作信息,这需要3-4个小时才能完成 工人们都是开朗的人,他们不知道任务,能做制片人做的任何事情。他们以拉式方式工作,因为他们的工作可能需要10分钟才能完成每个任务。一旦他们准备好做更多的工作,他们就会轮询队列 生产者有点变化无常——有时他们

我的问题的关键是在兔子生产者被杀后如何清理

我有一个rabbitmq环境,有多个生产者和多个消费者(工作者)。目前,所有消息(也称为工作)都会馈送到一个中心队列中,消费者在该队列中一次和一个进程拾取一条消息(工作任务)。任何一个特定的制作人都会产生约800条工作信息,这需要3-4个小时才能完成

工人们都是开朗的人,他们不知道任务,能做制片人做的任何事情。他们以拉式方式工作,因为他们的工作可能需要10分钟才能完成每个任务。一旦他们准备好做更多的工作,他们就会轮询队列

生产者有点变化无常——有时他们会在队列中创建大量的工作作为消息,然后决定他们根本不需要完成这些工作。更糟糕的是,它们有时会产生大量的工作;取消这一切;然后用不同的参数重新发布工作

我没有一个机制来要求制片人对他们的作品重新提问。问题的一部分在于,在将请求推送到队列之前,他们还有其他工作要做

我不能不想把工作留在队列上,因为制作人一次运行就意味着3到4个小时的工作。我最糟糕的情况是,我有几个制作人回溯他们要求的工作,而我有几个其他制作人希望他们的工作保持在队列中

因此,在最坏的情况下,我的队列将如下所示,我需要清除Prod B消息:

... | ~800 Prod A messages | ~800 Prod B messages | ~800 Prod C messages | ...
我不能保证来自A、B和C的消息不会交错,因为我目前没有同步写入队列的操作

我所考虑的是:

  • 一个简单的队列清除将删除我需要保留的消息
  • 我可以写一个专门的消费者,收集所有的信息,并重新询问好的信息,但这似乎是一个黑客
作为一个额外的挑战,我可能需要支持制作人的工作优先于其他人的工作


所有这些都说明,在制作人将工作放入队列,然后决定取消工作请求后,我如何清理?我将创建一个管理性的辅助队列,您偶尔会在该队列上丢弃消息以发出命令,例如
PurgeQueue:C
,或
PrioritizeQueue:a
,或者
PauseUntilISaySo
最后是
OkYouMayPass
。然后,您的所有工作人员只需在他们实际工作的其他人之前检查队列/主题/任何内容(或者,如果您只有一个活动的可调度侦听器,则使连接到管理队列的侦听器具有一些信号,指示工作人员暂停,以便在完成之前处理管理操作),在极少数情况下,它有一条消息,他们将处理该消息,而不是处理其他队列的工作


如果您想删除消息,我建议您在workers中维护一个
ignoreList
,管理员消息可以用来更新它,所以一旦制作人决定“等待,不要在中执行工作”,它就会发送一条管理员消息,说“添加到您的忽略队列:msgId1、msgId2、msgId3]”,工人们会将其拉入他们的忽略队列,他们对收到的每一条工作消息所做的第一件事就是:检查他们的忽略队列,看看他们是否应该处理该消息

,所以你建议工人使用一个控制信号来修改他们处理未来拉入的方式?实际上,在员工中构建一个小型规则引擎?@GlenH7我更愿意建议在普通员工中使用一个非常简单的暂停/恢复控制信号,并使用一个单独的员工来处理管理操作,它可以暂停员工的管理工作,然后恢复员工,这样,您的员工就不必知道任何关于管理工作的事情,只需要知道如何暂停/恢复OK,所以这听起来像是我已经考虑过的第二个项目的修改版本。一个专门的管理员使用者,用于在必要时进行清理。@GlenH7编辑的目的是阐明一种方法,当您要从队列中删除一组不同的、可能交错的消息时,可以避免清除和重新发布队列。