【问题标题】:How long a RabbitMQ Message stays alive without Subscribers?RabbitMQ 消息在没有订阅者的情况下还能存活多久?
【发布时间】:2016-01-12 15:21:55
【问题描述】:

我正在使用 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. 这是确保处理每条消息的正确模式还是应该使用不同的策略?

【问题讨论】:

    标签: c# rabbitmq masstransit


    【解决方案1】:

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

    1. 消息被消费
    2. 消息“生存时间”到期(默认为永远生存)
    3. 服务器崩溃或重启

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

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

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

    【讨论】:

    • 正是我要找的@derick
    【解决方案2】:

    最重要的。

    1. 如果没有任何订阅者,RabbitMQ 将不知道应该将消息传递到哪个队列。然后一条消息将无法传递。(不确定这是否会被移动到错误队列或跳过)
    2. 如果交换已经存在,它将被放置在已订阅事件的消费者队列中。因此,托管您的消费者的端点可能会关闭,消息仍将被传递。
    3. 当消息被传递到队列时,消费者将拾取您的消息并进行处理。如果在处理您的消息时发生异常,它将被移动到 endpoint_error 队列。 (取决于您的 RetryPolicy)。部署修复并将您的消息移回主队列,消息将被处理,就像什么都没发生一样。

    关于常见问题的常见问题的好读物

    【讨论】:

    • 感谢您的回答,我认为与 RabbitMQ 的关系比 MassTransit 更重要,MassTransit 只是我的运输工具
    • 是的,但是 MassTransit 会创建您的交换和队列。没有交换没有将消息路由到队列。没有消息路由,没有消息处理。
    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 2017-11-08
    • 2016-06-19
    • 2021-07-11
    • 1970-01-01
    • 2016-03-22
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多