Python 删除RabbitMQ(AMQP)服务器上队列中的消息

Python 删除RabbitMQ(AMQP)服务器上队列中的消息,python,python-3.x,rabbitmq,amqp,Python,Python 3.x,Rabbitmq,Amqp,我有一个大任务,它由200个子任务(消息)组成,这些子任务将发布到队列中。如果我想取消此1任务,则应删除200条消息(或已留下但尚未处理的消息)。有没有办法删除队列中这些已发布的消息 我可以想到的一个解决方案是创建一个队列(Q),在这里我发布一个新队列(X)的名称。然后,每个使用者连接到这个新的动态创建的队列(X),并处理200条已发布的消息。如果我想中止整个任务,我只从发布服务器端删除该队列(X)。这是一种常见的方法吗?我认为您建议的方法没有什么问题 第一个问题是由于RMQ,它旨在通过减少对代

我有一个大任务,它由200个子任务(消息)组成,这些子任务将发布到队列中。如果我想取消此1任务,则应删除200条消息(或已留下但尚未处理的消息)。有没有办法删除队列中这些已发布的消息


我可以想到的一个解决方案是创建一个队列(Q),在这里我发布一个新队列(X)的名称。然后,每个使用者连接到这个新的动态创建的队列(X),并处理200条已发布的消息。如果我想中止整个任务,我只从发布服务器端删除该队列(X)。这是一种常见的方法吗?

我认为您建议的方法没有什么问题

第一个问题是由于RMQ,它旨在通过减少对代理的请求量来提高性能。如果您的消费者已检索到一批任务,他们将在请求新任务之前处理所有任务,只有这样他们才会意识到队列已取消。因此,您的取消请求在大多数情况下不会得到适当处理。您可以将预取计数减少到1以避免此副作用,但这会增加网络压力并降低总体速度

第二个问题是AMQP协议没有提供适当处理队列删除的机制。因此,您的消费者需要小心处理队列消失的问题,否则会崩溃。这样做,您将失去对bug和问题的可见性。如何区分队列何时被显式删除,以及队列何时实际崩溃

在这种情况下,我建议您使用父作业的标识符标记所有任务。每次使用者开始使用新任务时,它都会检查父作业是否有效或是否已取消。在后一种情况下,它将简单地忽略该任务并转到下一个任务。你需要一个支持服务。例如,一个Redis实例应该足够了


这种机制将更加简单和健壮。您可以根据需要旋转任意多个使用者,而无需编排他们与正确队列的连接。此外,无序或交错的任务也不是问题

听起来是个不错的方法。类似的DB事务处理方法怎么样。以初始开始消息开始将其推入队列,然后插入其余消息。如果处理顺利,请插入最终提交消息,否则请插入回滚或放弃消息。确保启动消息、最终消息和丢弃/回滚消息在另一个使用者端得到唯一标识和处理。尽管对于此类需求。Kafka是我的首选,因为它在消息传递队列中提供了事务的功能。在这里,您可以获得向Kafka队列发送子任务消息的功能。主题在您提交正在进行的事务之前,其他队列使用者不会读取它们。即使您不必担心在中止的事务中删除消息。看见