RabbitMQ(和node.js)中的asynchronous确认

我有一个RabbitMQ的具体使用案例,我想澄清一些事情,并要求build议。

考虑这种情况:

1 – 我发布两个消息,即要执行的任务:messageA然后messageB

2-我的消费者得到messageA,执行包含在这个消息中的任务,但是当任务正在运行时,服务器崩溃

我的问题是:当服务器重新启动时,messageA将被重新sorting,并且会在messageB(与崩溃之前的顺序相同)之前重新sorting?

据我所知,messageA会丢失,如果服务器崩溃,因为我的消费者默认情况下收到消息后确认。

所以我的想法是单独使用和确认消息:先消耗,运行任务,然后在任务成功执行后确认消息。

你觉得这个方法有问题吗? 你会build议我做其他事吗?

RabbitMQ不保留消息的顺序:

多半是对的。 假设发布者在相同的频道上以相同的路由信息​​发布消息M1,M2,M3和M4(按此顺序)。 如果这些消息被路由到一个队列,那么它们将以它们发布的相同顺序结束。 在队列中消费将产生M1,M2,M3和M4。

但是,只有在没有重新sorting的情况下才能保证订单。 如果消费者在收到消息之前closures频道,则消息将被隐含地重新sorting。 例如,如果消费者收到M1,不能确认和closures频道,则下一个消费者将以M2,M3,M4,M1的顺序接收消息。 如果消费者调用basic.recover {requeue = true},消息也可以被明确地重新sorting。 至less一次交付的常见问题解答在更详细地谈论这个。

RabbitMQ FAQ

这可以做,但RabbitMQ不会自动执行,您需要通过将子消息包装在父消息中来自己pipe理生命周期。 然后,您将拥有pipe理父消息的代码,并在消息1成功但消息2失败的情况下处理回滚。 希望这有助于..

最好的祝福

在无应答模式下使用的消息(请参阅http://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-ack )在服务器崩溃后不会被重新发送,因为服务器在交付时完全忘记了这些信息。 消费者在交付后对这些消息负责。

只有在成功完成任务后才确认消息是您的scheme中的正确方法。 如果您希望消息在代理崩溃后生存,则还必须确保队列是持久的,并且消息是持久发布的(传递模式2),并且使用发布者确认或事务来确保消息被写入磁盘。

如果代理在处理messageA时崩溃,则消息顺序将被保留。 如果消费者而不是经纪人崩溃,那么消息顺序将被颠倒。