You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 + MassTransit/RabbitMQ:基于路由键的消息路由配置问题

正确配置方案

1. 生产者端(ImageService)

显式声明目标交换器,避免RabbitMQ自动创建不符合要求的交换器:

cfg.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    });

    // 显式声明direct类型的exc-image交换器
    cfg.ExchangeDeclare("exc-image", ExchangeType.Direct);
}));

发布消息的代码可保留,确保路由键正确对应PRODUCT/USER即可。

2. 消费者端(以ProductService为例)

问题根源是ConfigureConsumeTopology = false后,未明确绑定逻辑导致MassTransit自动创建了队列同名的fanout交换器。正确配置:

cfg.ReceiveEndpoint("product-queue", e =>
{
    // 关闭自动默认拓扑
    e.ConfigureConsumeTopology = false;

    // 绑定消费者
    e.ConfigureConsumer<ImageSavedConsumer>(ctx);

    // 显式绑定到exc-image交换器,指定路由键和类型
    e.Bind("exc-image", b =>
    {
        b.RoutingKey = "PRODUCT";
        b.ExchangeType = ExchangeType.Direct;
        // 确保交换器不存在时自动创建(可选,建议和生产者端统一显式声明)
        b.Declare = true;
    });

    // 配置队列持久化,避免自动删除
    e.Durable = true;
    e.AutoDelete = false;
});

3. UserService消费者配置(同理)

仅修改路由键为USER即可:

cfg.ReceiveEndpoint("user-queue", e =>
{
    e.ConfigureConsumeTopology = false;
    e.ConfigureConsumer<UserImageSavedConsumer>(ctx);
    e.Bind("exc-image", b =>
    {
        b.RoutingKey = "USER";
        b.ExchangeType = ExchangeType.Direct;
    });
    e.Durable = true;
    e.AutoDelete = false;
});

内容的提问来源于stack exchange,提问作者Max Bertoli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:49:49