首页 文章

杀死兔子 生产环境 者后清理

提问于
浏览
1

我的问题的关键是确定如何在兔子 生产环境 者被杀死后进行清理 .

我有一个带有多个 生产环境 者和多个消费者( Worker )的rabbitmq环境 . 目前,所有消息(也称为工作)都会进入中央队列,消费者一次只能获取一条消息(工作任务) . 任何给定的 生产环境 者将产生约800条工作信息,大约需要3-4个小时才能完成 .

Worker 是快乐的人,他们与任务无关,可以为 生产环境 者提供任何东西 . 他们以拉动方式工作,因为他们的工作可能需要10分钟才能完成每项任务 . 一旦他们准备好进行更多工作,他们就会轮询队列 .

制作人有点变幻无常 - 有时他们会在队列中创建大量的工作作为消息然后决定他们不需要完成这项工作 . 更糟糕的是,他们有时会产生一堆工作;取消所有;然后用不同的参数重新发布工作 .

我没有机制要求 生产环境 者重新安排他们的工作 . 部分问题是他们在将请求推送到队列之前还有其他工作要做 .

我不能不想将工作留在队列中,因为来自 生产环境 者的单次运行代表3或4小时的工作 . 而我最糟糕的情况是,我有几个 生产环境 商回复他们所要求的工作,而我还有其他几个 生产环境 商希望将他们的工作留在队列中 .

所以在最糟糕的情况下,我的队列看起来像这样,我需要清除Prod B消息:

... | ~800 Prod A messages | ~800 Prod B messages | ~800 Prod C messages | ...

而且我无法保证来自A,B和C的消息不会交错,因为我当前没有将写入同步到队列 .

我考虑过的:

  • 简单的队列清除将取出我需要保留的消息 .

  • 我可以写一个专门的消费者来获取所有消息并重新排列好消息,但这似乎是一个黑客攻击 .

作为一个额外的挑战,我可能需要支持 生产环境 者的工作优先于其他人的工作 .

所有这一切, how can I clean up after a producer drops work onto the queue and then decides to cancel the work request?

1 回答

  • 2

    我会创建一个管理的辅助队列,偶尔会丢弃此队列上的消息以发出诸如 PurgeQueue: C ,或 PrioritizeQueue: APauseUntilISaySo 之后的命令,最后是 OkYouMayPass . 然后你所有的工作人员只需检查那个队列/主题/在他们完成的其他人之前做的事情,以及罕见的情况,它有一个消息,他们'll handle that then instead of their other queue'工作 .

    如果您遇到要删除邮件的情况,我会鼓励您在工作人员中维护 ignoreList ,管理员邮件可用于更新邮件,因此,一旦制作人决定"Wait, don't do the work in ",它就会发送一条管理员消息,说明"Add to your ignore Queue: msgId1, msgId2, msgId3]"并且工作人员会将其拉出来,将其添加到他们的忽略队列中,并且他们对他们获得的每条工作消息做的第一件事就是:检查他们的忽略队列,看看他们是否应该对该消息进行处理

相关问题