Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RabbitMQ(和node.js)中的异步确认_Javascript_Node.js_Rabbitmq_Amqp - Fatal编程技术网

Javascript RabbitMQ(和node.js)中的异步确认

Javascript RabbitMQ(和node.js)中的异步确认,javascript,node.js,rabbitmq,amqp,Javascript,Node.js,Rabbitmq,Amqp,我想到了RabbitMQ的一个特定用例,我想澄清某些事情并征求建议 考虑以下情况: 1-我发布了两条消息,它们是要执行的任务:messageA和messageB 2-我的消费者获取messageA,执行此消息中包含的任务,但当任务运行时,服务器崩溃 我的问题是:当服务器重新启动时,messageA会被重新调用吗?它会在messageB之前被重新调用吗(与崩溃之前的顺序相同) 据我所知,如果服务器崩溃,messageA将丢失,因为我的消费者在收到消息时默认已确认 所以我的想法是分别使用和确认消息:

我想到了RabbitMQ的一个特定用例,我想澄清某些事情并征求建议

考虑以下情况:

1-我发布了两条消息,它们是要执行的任务:messageA和messageB

2-我的消费者获取messageA,执行此消息中包含的任务,但当任务运行时,服务器崩溃

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

据我所知,如果服务器崩溃,messageA将丢失,因为我的消费者在收到消息时默认已确认

所以我的想法是分别使用和确认消息:首先使用,运行任务,然后在任务成功执行时确认消息


你认为这种方法有问题吗?您是否建议我做其他事情?

在无确认模式(请参阅)下使用的邮件在服务器崩溃后不会重新发出,因为服务器在发送此类邮件时已完全忘记了这些邮件。消费者在交付后对此类信息负责

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


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

RabbitMQ不保留重新请求的消息顺序:

在大多数情况下,是的。假设出版商发布消息M1、M2、M3 和M4(按该顺序)位于同一通道上并具有相同的路由 信息。如果这些消息被路由到队列,那么它们将 最终以相同的顺序出版。在网上消费 队列将产生M1、M2、M3,然后是M4

但是,只有在没有重新订购的情况下才能保证订单。A. 如果消费者关闭频道,则消息将被隐式重新查询 在回复信息之前。例如,如果消费者收到M1, 未能确认并关闭通道,则下一个消费者将 接收按M2、M3、M4、M1顺序排列的消息。消息也可以是 如果使用者调用basic.recover{requeue=true},则显式重新查询。 关于“至少一次交付”的常见问题解答对此进行了更多的讨论 细节

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

致意