没有订阅者,RabbitMQ消息可以保持多长时间?

时间:2016-01-12 15:21:55

标签: c# rabbitmq masstransit

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

/** 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. 这是确保处理每条消息还是应该使用其他策略的正确模式?

2 个答案:

答案 0 :(得分:4)

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

  1. 消息已消耗
  2. 消息&#34;生存时间&#34;到期(默认是永远活着)
  3. 服务器崩溃或重新启动
  4. 如果你有一个充满消息的队列,这些消息通常会一直存在,直到发生这三件事之一。希望您能尽快让您的消费者在线,以便您可以使用消息并处理它们。

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

    崩溃...如果您将消息持久保存到磁盘,则消息可以在崩溃/重新启动后继续存在。但是,如果服务器在消息从交换机路由到队列之前崩溃,那么消息仍有可能丢失。

答案 1 :(得分:1)

最重要的是。

  1. 如果没有任何订阅者,RabbitMQ将不知道应该向哪个队列传递消息。然后一条消息将无法送达。(不确定是否会将其移至错误队列或跳过)
  2. 如果交换已经在那里,它将被放置在订阅该事件的消费者队列中。因此,您的终端托管您的消费者可以关闭消息仍然会被传递。
  3. 当消息传递到队列时,消费者将接收您的消息并进行处理。如果在处理消息时发生异常,则会将其移至endpoint_error队列。 (取决于您的RetryPolicy)。部署修补程序并将消息移回主队列,消息将被处理,就像没有任何事情发生一样。
  4. 很好地阅读常见问题的常见问题