我有一些客户通过autodelete:yes
连接到交易所。这些都是出版商和消费者。但基本上现在让我们假设他们正在发布消息。因为每个客户端都有一个唯一的绑定密钥,所以我可以在使用这些机器的机器上的每条消息上做明确的事情。一切正常。
现在,如果客户端崩溃或我手动终止(通过SIGINT,ctrl + c),则队列将被删除。有什么办法可以告诉远程机器上的消费者删除队列吗?
我正在考虑在我的客户端应用程序上创建一个信号处理程序,因此每当我捕获SIGINT或SIGTERM时,我都会通知远程消费者(我会向他们发送一条消息,指出具有唯一ID的队列)将被删除)
有没有其他方法可以做到这一点,或者我的方式是正确的方法吗?
答案 0 :(得分:1)
作为消息传递的一般规则,使用应用程序并不关心生成应用程序的状态。
在RabbitMQ中,生成应用程序可能会通过两种机制之一了解消费应用程序的状态。第一种(也是首选)方法是通过Dead-Letter Exchange (dlx)
。当您的消息无法传递时(因为目标队列不存在),它将在此处路由,您的应用程序可以从DLX上配置的队列中提取消息,以确定它们是否未到达目的地
第二种方法是在消息上设置Mandatory
标志。这将导致代理在目标队列不再存在的情况下,通过Basic.Return方法将消息直接发送回生产应用程序。
如果上述项目无法满足您的需求,您可能需要稍微重新审视您的架构,因为可能有更好的方法来设计您的应用程序。