编程语言
首页 > 编程语言> > c# – 如果没有订阅者,RabbitMQ消息会保持多长时间?

c# – 如果没有订阅者,RabbitMQ消息会保持多长时间?

作者:互联网

我正在使用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条消息,则消息不会丢失,一旦订阅者恢复生命,消息就会被处理.

所以我的问题是:

>如何确保消息保留在RabbitMQ的队列中,直到一个订阅者出现并获取它?
>如果服务器重新启动并且某些消息未被任何订阅服务器处理,它们是否会丢失,或者在重新启动后订阅服务器生效后会立即处理,会发生什么?
>这是确保处理每条消息还是应该使用不同策略的正确模式?

解决方法:

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

>消息被消耗
>消息“生存时间”到期(默认是永生)
>服务器崩溃或重新启动

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

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

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

标签:c,rabbitmq,masstransit
来源: https://codeday.me/bug/20190609/1201783.html