Rabbitmq MassTransit生成了我想忽略的跳过队列

Rabbitmq MassTransit生成了我想忽略的跳过队列,rabbitmq,masstransit,Rabbitmq,Masstransit,有人能猜出问题是什么吗?因为我不知道如何解决这个问题。MassTransit生成\u跳过了队列,我不知道它为什么生成这些队列。它是在执行发布请求响应时生成的 在MassTransit.RequestClientExtensions中使用以下方法创建请求客户端 public static IRequestClient<TRequest, TResponse> CreatePublishRequestClient<TRequest, TResponse>(this IBus

有人能猜出问题是什么吗?因为我不知道如何解决这个问题。MassTransit生成\u跳过了队列,我不知道它为什么生成这些队列。它是在执行发布请求响应时生成的

在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);
}
正如您所看到的,这是一个请求-响应场景,其中请求被发送到所有消费者。但因为目前我们只有一个消费者,它只被发送给那个消费者。如果对多个消费者进行publishrequestresponse,死信很容易出现,一旦一个消费者做出响应,另一个消费者不知道在哪里响应,就会生成死信。但因为我们这里只有一个消费者,我们可以消除这种可能性

那么,这些被跳过的队列还有什么其他原因呢?非常感谢您对我如何解决此问题的帮助


我必须说,在Consume方法中,在某些情况下,我们提出一个
RequestTimeoutException
,并在请求应用程序中捕获它。这是经过测试的,不会生成跳过的队列。

跳过的队列是死信队列。这意味着您的端点队列绑定到某个消息交换,但不再有该消息的使用者。也许你改变了拓扑结构,移动了消费者。您可以转到RMQ管理UI并检查端点交换的绑定。如果查看以跳过队列结尾的消息,您将发现要查找的消息类型

交换以消息类型命名,因此很容易找到过时的绑定


然后,在管理UI中,您可以手动删除过时的绑定,将不会有更多消息进入跳过的队列。

我刚刚检查了绑定,每个导致跳过队列的消息类型只有一个绑定。看起来不错…你能找到错误的装订吗?如果端点中有该消息类型的使用者,并且消息得到处理,或者消息来了,而MT没有该消息的使用者,并且消息最终进入死信(跳过)队列,那么这没有什么神奇之处。如果您使用的是请求客户端,并且客户端已超时(在从服务接收响应/故障之前),对该请求的后续响应/错误将在跳过的队列中结束。请确保设置响应消息的TTL(过期时间),以便它们不会超过超时时间。这只是为了向阅读此问题的其他人澄清。RabbitMQ没有生成带有
\u skipped
后缀的队列-它必须是Mass Transit或用户代码。
TResponse response = TaskUtil.Await(() => requestClient.Request(request));