RabbitMQ生成我想忽略的_skipped队列

时间:2018-09-04 07:39:00

标签: rabbitmq masstransit

任何人都可以猜出问题出在哪里,因为我对如何解决这个问题一无所知。 RabbitMQ生成 _skipped 队列,但我不知道为什么生成这些队列。它是在执行发布请求响应时生成的。

Request Client是使用MassTransit.RequestClientExtensions

中的以下方法创建的
public static IRequestClient<TRequest, TResponse> CreatePublishRequestClient<TRequest, TResponse>(this IBus bus, TimeSpan timeout, TimeSpan? ttl = null, Action<SendContext<TRequest>> callback = null) where TRequest : class where TResponse : class
{
  return (IRequestClient<TRequest, TResponse>) new PublishRequestClient<TRequest, TResponse>(bus, timeout, ttl, callback);
}

请求如下:

TResponse response = TaskUtil.Await(() => requestClient.Request(request));

如您所见,这是“请求响应”方案,其中请求已发送给所有使用者。但是因为目前我们只有一个消费者,所以只将其发送给该消费者。如果对多个使用者进行了publishrequest-response,则死信很容易出现,一旦一个使用者响应,另一个使用者就不知道在哪里响应,并且产生了死信。但是因为这里只有一个消费者,所以我们可以消除这种可能性。

那么这些跳过的队列还有其他原因吗?非常感谢您提供有关如何解决此问题的帮助...

我必须说,在某种情况下,使用Consume方法时,我们引发RequestTimeoutException并将其捕获到请求的应用程序中。经过测试,不会产生跳过的队列。

1 个答案:

答案 0 :(得分:1)

跳过的队列是一个死信队列。这意味着您的终结点队列具有对某些消息交换的绑定,但是不再有该消息的使用者。也许您更改拓扑并移动了使用者。您可以转到RMQ管理UI并检查绑定以进行端点交换。如果您查看最终跳过的队列中的邮件,则会发现要查找的邮件类型。

交易所是根据消息类型命名的,因此很容易找到过时的绑定。

然后,在管理UI中,您可以手动删除已过时的绑定,并且不再有消息进入跳过的队列。