rabbitmq - MassTransit 生成我想忽略的_skipped 队列

标签 rabbitmq masstransit

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

请求客户端是使用 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));

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

那么造成这些跳过队列的其他原因可能是什么?非常感谢您对我如何解决此问题的任何帮助...

我不得不说,在 Consume 方法中,在某些情况下,我们会引发 RequestTimeoutException 并在请求应用程序中捕获它。这已经过测试,不会生成跳过的队列。

最佳答案

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

交换根据消息类型命名,因此很容易找到过时的绑定(bind)。

然后,在管理 UI 中,您可以手动删除已过时的绑定(bind),这样就不会再有消息进入跳过的队列。

关于rabbitmq - MassTransit 生成我想忽略的_skipped 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161172/

相关文章:

python - RabbitMQ 非阻塞消费者

masstransit - 处理多个事件的状态转换

c# - MassTransit 3,其中 AzureServiceBus 在队列名称前添加斜杠

Masstransit EndpointConvention Azure 服务总线

masstransit - 如何在不使用 Guid 的情况下关联大众运输状态机中的事件?

windows - 运行 rabbitmq-server 时出现路径错误

rabbitmq - 消息模式 - RabbitMQ/NestJS

c# - 当 ReplyTo 是临时队列时检索异常

nhibernate - 如何确保使用 MassTransit Saga 将项目添加到 NHibernate 持久化 IList 的良好性能

rabbitmq - Varnish 中的 HTTP 方法 PURGE 是幂等的吗?