【问题标题】:Message Durability in MassTransit/RabbitMQMassTransit/RabbitMQ 中的消息持久性
【发布时间】:2020-02-13 22:42:34
【问题描述】:

我有 2 个应用程序,一个是事件发布应用程序,一个是事件消费者应用程序。 发布者使用 SimpleInjector:

container.AddMassTransit(x =>
{
    x.AddBus(() => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(ConfigurationValuesProvider.Current.Get("RabbitHostName"), hostConfigurator =>
        {

        });

    }));
});

消费者使用 CastleWindsor:

container.AddMassTransit(x =>
{
    x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(configurationProvider.RabbitHostName);

        x.AddConsumer<FactAddedHandler>();
        x.AddConsumer<FactAddedWebhookHandler>();
        x.AddConsumer<FactMonitorHandler>();

        cfg.ConfigureEndpoints(container);
    }));

});

一切正常,尽管我尝试通过 consumer 注册使我发布的一些消息不耐久:

x.AddConsumer<FactAddedHandler>().Endpoint(e =>
{
    e.Temporary = true;
});

通过这种方式,队列被标记为临时队列,并在应用程序关闭后立即被删除。但我只希望消息不持久,我希望队列在应用程序出现故障时仍处于启动状态并准备就绪。有没有办法做到这一点?

【问题讨论】:

  • “不耐用”是什么意思?例如,您可以使用 RMQ 策略来强制执行消息 TTL(这意味着 X 秒后未使用的消息将从队列中删除)。
  • 对于非持久性我的意思是不持久化在磁盘上。这意味着如果它们在队列中并且 RabbitMQ 出现故障,它们不需要保存在磁盘上。所以当 RabbitMQ 再次上去的时候,他们就迷路了,没人在乎
  • 您应该创建一个消费者定义并覆盖配置方法以访问接收端点配置器。 masstransit-project.com/usage/containers/#definition

标签: .net rabbitmq masstransit


【解决方案1】:

显然,我不认为 e.Temporary = true; 正在做你认为它会做的事情。

配置端点时,传递给配置函数的配置器是一个相当通用的交叉代理IReceiveEndpointConfigurator。如果您想配置一些特定于代理的东西,您可以强制转换为特定于代理的配置器。例如,对于 RMQ:

x.AddConsumer<FactAddedHandler>().Endpoint("my_queue", e =>
{
  if (e is IRabbitMqReceiveEndpointConfigurator r)
  {
    r.Durable = false;
  }
});

请注意,如果您没有在此处指定队列名称,那么无论如何您最终都会得到一个 MT“临时队列”,该队列将被唯一命名并在您的应用程序关闭时被销毁。这可能不是你想要的。

【讨论】:

  • 嗯..说实话,这不是正在发生的事情。首先,当我不​​指定名称时,队列不会被销毁。我刚刚尝试关闭消费者应用程序、发布者应用程序以及 RabbitMQ。所有队列都存在,我没有在其中任何一个中指定名称,但它们是使用由 MT/RabbitMQ 决定的唯一名称创建的。第二:我试过你的解决方案。幸运的是,其中的队列不再标记为自动删除,但消息仍然持久且持久
猜你喜欢
  • 2012-12-26
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多