c# - 在没有订阅者的情况下,RabbitMQ 消息可以存活多长时间?

标签 c# rabbitmq masstransit

我正在使用 MassTransit 和 RabbitMQ 创建一个简单的发布者/订阅者。 发布者有以下代码来初始化总线:

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

/** start the bus and publish */
bus.Start();
bus.Publish<IPersonLogin>(new {FirstName = "John", LastName = "Smith"});

订阅者有这段初始化代码:

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

    cfg.ReceiveEndpoint(host, "person_login", e =>
    {
        e.Consumer<PersonLoginConsumer>();
    });
});

如果我关闭订阅者并发布 2 条消息,消息不会丢失,一旦订阅者恢复正常,消息就会被处理。

所以我的问题是:

  1. 我如何确保消息保留在 RabbitMQ 的队列中,直到一个订阅者出现并接收它?
  2. 如果服务器重启并且某些消息未被任何订阅者处理,会发生什么情况?它们会丢失还是在订阅者重启后立即被处理?
  3. 这是确保处理每条消息的正确模式还是我应该使用不同的策略?

最佳答案

默认情况下,队列中的任何消息都将保留在那里,直到发生以下三种情况之一:

  1. 消息被消费
  2. 消息“time to live”过期(默认是永远活着)
  3. 服务器崩溃或重启

如果您有一个充满消息的队列,消息通常会一直存在,直到这三种情况中的一种发生。希望您能尽快让您的消费者在线,以便您可以使用消息并处理它们。

如果您希望消息在一段时间后自动删除(假设它们没有首先被消费),您只需设置一个生存时间(ttl)

对于崩溃...如果您使消息持久保存到磁盘,则该消息可以在崩溃/重新启动后幸存下来。不过,如果在消息从交换器路由到队列之前服务器崩溃,消息仍有可能丢失。

关于c# - 在没有订阅者的情况下,RabbitMQ 消息可以存活多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34747413/

相关文章:

c# - 如何通过 javascript 添加 ASP DropDown 值?

rabbitmq - MassTransit 将消息速率上限限制为 10

c# - 访问 Consumer 内的对象

C#:如何让 Hacker/Cracker 更难绕过或绕过许可检查?

c# - 如何使用 ASP.NET 设置数据属性?

c# - 在构造函数期间关闭表单

具有多个 URI 的 RabbitMQ 连接

spring - 将现有 JMS 库与 AMQP 代理 (RabbitMQ) 结合使用

mongodb - 通过 karate dsl 使用 mongodb、redis 和 rabbitmq 的最佳方式?

azure - Azure 上的公共(public)交通 MaxConcurrentCalls 设置被忽略