Rabbitmq 消费者脱机时将消息保留在队列中

Rabbitmq 消费者脱机时将消息保留在队列中,rabbitmq,masstransit,Rabbitmq,Masstransit,我在C项目中使用Masstransit 我有一个出版商和消费者服务公司,当它们都成立时,就没有问题了。但如果消费者脱机,则已发布的消息不会进入队列。他们就这样消失了 预期的行为是将消息保留在队列中,直到使用者启动,然后将消息发送给它。我在谷歌群组中发现了几个问题相同的主题,但我不清楚如何解决这个问题 我觉得奇怪的是,这个功能不是现成的,因为据我所知,它是RabbitMQ和MT的主要用途 创建发布服务器总线的方式: public static IBusControl CreateBus() {

我在C项目中使用Masstransit

我有一个出版商和消费者服务公司,当它们都成立时,就没有问题了。但如果消费者脱机,则已发布的消息不会进入队列。他们就这样消失了

预期的行为是将消息保留在队列中,直到使用者启动,然后将消息发送给它。我在谷歌群组中发现了几个问题相同的主题,但我不清楚如何解决这个问题

我觉得奇怪的是,这个功能不是现成的,因为据我所知,它是RabbitMQ和MT的主要用途

创建发布服务器总线的方式:

public static IBusControl CreateBus()
{
    return Bus.Factory.CreateUsingRabbitMq(sbc =>
    {
        var host = sbc.Host(new Uri("rabbitmq://RMQ-TEST"), h =>
        {
            h.Username("test");
            h.Password("test");
        });
        sbc.ReceiveEndpoint(host, "test_queue", ep =>
        {
            ep.Handler<IProductDescriptionChangedEvent>(
                content => content.CompleteTask);
        });
    });
}
消费者:

    public static void StartRmqBus()
    {
        var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
        {
            var host = cfg.Host(new Uri("rabbitmq://RMQ-TEST"), h =>
            {
                h.Username("test");
                h.Password("test");
            });

            cfg.ReceiveEndpoint(host, "test_queue", ep =>
            {
                ep.Consumer<ProductChangedConsumer>();
            });
        });

        bus.Start();
    }
编辑:


这里有一个更有趣的特性:如果我停止这两个服务,并通过MT的管理接口手动将消息放入队列,则消息正在测试队列中等待。但当我启动publisher或consumer service时,它将落在测试\u队列\u错误队列上。

似乎我的publisher设置不正确。拆下此零件后:

sbc.ReceiveEndpoint(host, "test_queue", ep =>
{
    ep.Handler<IProductDescriptionChangedEvent>(
        content => content.CompleteTask);
});

它开始按预期工作。看起来它使用了自己的消息,这就是为什么当消费者停机时,我没有在队列中看到消息。

您对“已发布”和“消费者”使用了相同的队列,而且正如您在自己的回答中指出的,publisher对此消息类型有一个消费者

如果您的发布者不使用消息,最好从中删除接收端点,这样您的服务将只发送

如果您有多个服务,其中每个服务都需要为相同的消息类型拥有自己的使用者-这就是pub-sub的工作方式,并且每个服务必须具有不同的队列。这在文档的一节中进行了描述。在这种情况下,每个服务都将获得自己的已发布消息副本


如果您只有一个队列,那么您将得到竞争的消费者,并且此场景仅对水平可伸缩性有效,在水平可伸缩性中,如果处理速度太慢,您将运行相同服务的多个实例以增加已处理消息的数量。在这种情况下,所有这些实例都将使用来自同一队列的消息。在这种情况下,只有一个实例将获得消息。

当使用者未运行时,消息将放入队列中。这总是发生的,除非有其他消费者并行运行。您的环境中有某种东西会使用这些消息。@AlexeyZimarev我只有一个消费者。也许你有什么想法,我怎样才能弄清楚什么能消耗这些信息?那太好了。检查该队列的绑定,如果有意外的交换。哦,不仅仅是你,可能还有其他人会问这个问题,然后他们会阅读这些答案,而不是再次问同样的问题。